newlib-cygwin/libgloss/cris/gensyscalls

266 lines
7.5 KiB
Plaintext
Raw Normal View History

#! /bin/sh
Committed, CRIS port: fix fallout from time_t defaulting to 64 bits, part 1 It's been a while... I see the CRIS port broke with the time_t-default-to-64-bit change, observable by a few test-cases in the gcc fortran(!) tests failing, regressing when trying a recent newlib. This is a two-part belt-and-suspenders change: adjust the CRIS port gettimeofday syscall (the only one in newlib/CRIS passing a time_t or struct timeval) to handle a userspace 64-bit time_t and secondly default time_t to 32-bit long anyway. I considered making the local "kernel_timeval" copy in _gettimeofday conditional on (userspace) time_t being 64 bits, but thought it not worth bothering with the few move insns. The effect of a 64-bit time_t is however observable as longer simulation time when running the gcc testsuite and as bigger binaries without any actual upside from the larger time_t size, so I thought better make the default for this port go back to being a "long" again. Tested by running the gcc testsuite over the three combinations of two parts of the patch and observing the expected changes. Committed. libgloss: Adjust for syscall and userspace having different time_t or timeval. * cris/linunistd.h (kernel_time_t, kernel_suseconds_t, kernel_timeval): New types. (gettimeofday): Change the type of the first argument to be a pointer to a struct kernel_timeval. * cris/gensyscalls (_gettimeofday): Use an intermediate struct kernel_timeval for the syscall and initialize the result from that. Signed-off-by: Hans-Peter Nilsson <hp@axis.com>
2018-09-13 23:45:39 +08:00
# Copyright (C) 2005, 2018 Axis Communications.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Neither the name of Axis Communications nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
# COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# To avoid an abundance of copyright/license messages for boilerplate
# code, we instead generate them from this file. Generating the
# function code could also be done automatically, but at the cost of
# slightly more intricate build machinery and/or scattered syscall
# information. Beware that the cat-lines must match the sed regexp
# "^cat > \([^ ]*\).*".
lu='/* -*- buffer-read-only: t -*-
THIS FILE IS AUTOMATICALLY GENERATED
FROM "'$0'". */
#include "linunistd.h"
#define R(x) return (x); }
'
lui="$lu int"
r=") { R (_Sys_"
cat > close.c <<EOF
$lui _close (int fd${r}close (fd))
EOF
cat > execve.c <<EOF
$lui _execve (char *path, char **argv, char **env${r}execve (path, argv, env))
EOF
cat > exit.c <<EOF
$lu void _exit (int val) { _Sys_exit (val); /* Appease GCC: */ while (1) ; }
EOF
cat > fcntl.c <<EOF
$lui _fcntl (int fd, int cmd, long arg${r}fcntl (fd, cmd, arg))
EOF
cat > fork.c <<EOF
$lui _fork (void${r}fork ())
EOF
cat > fstat.c <<EOF
$lu#include <string.h>
#include <sys/stat.h>
#undef st_atime
#undef st_mtime
#undef st_ctime
int
_fstat (int fd, struct stat *buf)
{
struct new_stat ks;
int retval = _Sys_fstat (fd, &ks);
/* Blank before filling it in. */
memset (buf, 0, sizeof (*buf));
/* We have to translate from the linux struct new_stat.
It seems we don't have to translate the contents, though. */
buf->st_dev = ks.st_dev;
buf->st_ino = ks.st_ino;
buf->st_mode = ks.st_mode;
buf->st_nlink = ks.st_nlink;
buf->st_uid = ks.st_uid;
buf->st_gid = ks.st_gid;
buf->st_rdev = ks.st_rdev;
buf->st_size = ks.st_size;
buf->st_blksize = ks.st_blksize;
buf->st_blocks = ks.st_blocks;
buf->st_atim.tv_sec = ks.st_atime;
buf->st_mtim.tv_sec = ks.st_mtime;
buf->st_ctim.tv_sec = ks.st_ctime;
R (retval)
EOF
cat > getpid.c <<EOF
$lui _getpid (void${r}getpid ())
EOF
cat > gettod.c <<EOF
$lu#include <sys/time.h>
#include <sys/times.h>
int
Committed, CRIS port: fix fallout from time_t defaulting to 64 bits, part 1 It's been a while... I see the CRIS port broke with the time_t-default-to-64-bit change, observable by a few test-cases in the gcc fortran(!) tests failing, regressing when trying a recent newlib. This is a two-part belt-and-suspenders change: adjust the CRIS port gettimeofday syscall (the only one in newlib/CRIS passing a time_t or struct timeval) to handle a userspace 64-bit time_t and secondly default time_t to 32-bit long anyway. I considered making the local "kernel_timeval" copy in _gettimeofday conditional on (userspace) time_t being 64 bits, but thought it not worth bothering with the few move insns. The effect of a 64-bit time_t is however observable as longer simulation time when running the gcc testsuite and as bigger binaries without any actual upside from the larger time_t size, so I thought better make the default for this port go back to being a "long" again. Tested by running the gcc testsuite over the three combinations of two parts of the patch and observing the expected changes. Committed. libgloss: Adjust for syscall and userspace having different time_t or timeval. * cris/linunistd.h (kernel_time_t, kernel_suseconds_t, kernel_timeval): New types. (gettimeofday): Change the type of the first argument to be a pointer to a struct kernel_timeval. * cris/gensyscalls (_gettimeofday): Use an intermediate struct kernel_timeval for the syscall and initialize the result from that. Signed-off-by: Hans-Peter Nilsson <hp@axis.com>
2018-09-13 23:45:39 +08:00
_gettimeofday (struct timeval *tp, void *tzp)
{
struct kernel_timeval kt;
int retval = _Sys_gettimeofday(&kt, tzp);
if (retval == 0)
{
tp->tv_sec = kt.tv_sec;
tp->tv_usec = kt.tv_usec;
}
R (retval)
EOF
cat > isatty.c <<EOF
$lu
typedef unsigned int tcflag_t;
typedef unsigned char cc_t;
#define NCCS 19
struct termios {
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
};
/* From asm-etrax100/ioctls.h: beware of updates. */
#define TCGETS 0x5401
int
_isatty (int fd)
{
struct termios dummy;
int save_errno = errno;
int ret = _Sys_ioctl (fd, TCGETS, (unsigned long) &dummy);
errno = save_errno;
R (ret == 0)
EOF
cat > kill.c <<EOF
$lui _kill (int pid, int sig${r}kill (pid, sig))
EOF
cat > link.c <<EOF
$lui _link (const char *old, const char *new${r}link (old, new))
EOF
cat > lseek.c <<EOF
$lui _lseek (int fd, int offset, int whence${r}lseek (fd, offset, whence))
EOF
cat > open.c <<EOF
$lui _open (const char *fnam, int flags, int mode${r}open (fnam, flags, mode))
EOF
cat > read.c <<EOF
$lui _read (int fd, char *buf, int nbytes${r}read (fd, buf, nbytes))
EOF
cat > rename.c <<EOF
$lui _rename (const char *old, const char *new${r}rename (old, new))
EOF
cat > sbrk.c <<EOF
$lu
/* From asm-etrax100/mman.h: beware of updates. */
#define PROT_READ 0x1 /* page can be read */
#define PROT_WRITE 0x2 /* page can be written */
#define MAP_ANONYMOUS 0x20 /* don't use a file */
char *
_sbrk (int d)
{
static long last_alloc = 0;
/* FIXME: Things are a whole lot different than elinux. */
#ifdef __elinux__
/* We can't promise linear memory from a predetermined location.
We're NO_MM. We're paria. We have to rely on tweaks and unclean
behavior. We abuse the fact that the malloc function in newlib
accepts nonlinear chunks in return to its sbrk calls (with a minor
patch). */
/* We use an "old" type mmap, which takes a pointer to a vector of 6
longs where the parameters are stored. */
long buffer[6];
/* We can't return memory. Well we could, but we would have to keep a
list of previous allocations. FIXME: Seems reasonable to do that
later. */
if (d < 0)
return (char *) last_alloc;
buffer[3] = MAP_ANONYMOUS; /* Not associated with a file. */
buffer[4] = -1; /* No file. */
buffer[0] = 0; /* Address 0: let mmap pick one. */
buffer[1] = d; /* Length. */
buffer[2] = (PROT_READ | PROT_WRITE); /* Protection flags. */
buffer[5] = 0; /* Offset into file. */
last_alloc = _Sys_mmap (buffer);
return (char *) last_alloc;
#else /* not __elinux__ */
long prev_brk;
if (last_alloc == 0)
{
last_alloc = _Sys_brk (0);
if (last_alloc < 0)
return (char *) -1;
}
prev_brk = last_alloc;
if (_Sys_brk (last_alloc + d) < last_alloc + d)
return (char *) -1;
last_alloc += d;
return (char *) prev_brk;
#endif
}
EOF
cat > stat.c <<EOF
$lu#include <string.h>
#include <sys/stat.h>
#undef st_atime
#undef st_mtime
#undef st_ctime
int
_stat (const char *path, struct stat *buf)
{
struct new_stat ks;
int retval = _Sys_stat (path, &ks);
/* Blank before filling it in. */
memset (buf, 0, sizeof (*buf));
/* We have to translate from the linux struct new_stat.
It seems we don't have to translate the contents, though. */
buf->st_dev = ks.st_dev;
buf->st_ino = ks.st_ino;
buf->st_mode = ks.st_mode;
buf->st_nlink = ks.st_nlink;
buf->st_uid = ks.st_uid;
buf->st_gid = ks.st_gid;
buf->st_rdev = ks.st_rdev;
buf->st_size = ks.st_size;
buf->st_blksize = ks.st_blksize;
buf->st_blocks = ks.st_blocks;
buf->st_atim.tv_sec = ks.st_atime;
buf->st_mtim.tv_sec = ks.st_mtime;
buf->st_ctim.tv_sec = ks.st_ctime;
R (retval)
EOF
cat > times.c <<EOF
$lu#include <sys/times.h>
clock_t
_times (struct tms * tp${r}times (tp))
EOF
cat > unlink.c <<EOF
$lui _unlink (const char *f${r}unlink (f))
EOF
cat > wait.c <<EOF
$lui _wait (int *status${r}wait4 (_getpid(), status, 0, 0))
EOF
cat > write.c <<EOF
$lui _write (int fd, char *buf, int nbytes${r}write (fd, buf, nbytes))
EOF
exit 0