diff options
Diffstat (limited to 'sysdeps')
43 files changed, 1615 insertions, 96 deletions
diff --git a/sysdeps/alpha/divqu.S b/sysdeps/alpha/divqu.S index f2a8a4d533..ef3cdb1b2b 100644 --- a/sysdeps/alpha/divqu.S +++ b/sysdeps/alpha/divqu.S @@ -240,7 +240,7 @@ $y_is_neg: /* If we get here, Y is so big that bit 63 is set. The results from the divide will be completely wrong. Fortunately, the quotient must be either 0 or 1, so just compute it directly. */ - cmpult Y, X, RV + cmpule Y, X, RV excb mt_fpcr $f3 ldt $f0, 0(sp) diff --git a/sysdeps/alpha/remqu.S b/sysdeps/alpha/remqu.S index dcc1c88b3c..398a345a18 100644 --- a/sysdeps/alpha/remqu.S +++ b/sysdeps/alpha/remqu.S @@ -246,7 +246,7 @@ $y_is_neg: from the divide will be completely wrong. Fortunately, the quotient must be either 0 or 1, so the remainder must be X or X-Y, so just compute it directly. */ - cmpult Y, X, AT + cmpule Y, X, AT subq X, Y, RV ldt $f0, 0(sp) cmoveq AT, X, RV diff --git a/sysdeps/generic/bits/byteswap.h b/sysdeps/generic/bits/byteswap.h index 5f08fed613..949ed0bc9d 100644 --- a/sysdeps/generic/bits/byteswap.h +++ b/sysdeps/generic/bits/byteswap.h @@ -25,32 +25,35 @@ #define _BITS_BYTESWAP_H 1 /* Swap bytes in 16 bit value. */ +#define __bswap_constant_16(x) \ + ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)) + #ifdef __GNUC__ # define __bswap_16(x) \ (__extension__ \ - ({ unsigned short int __bsx = (x); \ - ((((__bsx) >> 8) & 0xffu) | (((__bsx) & 0xffu) << 8)); })) + ({ unsigned short int __bsx = (x); __bswap_constant_16 (__bsx); })) #else static __inline unsigned short int __bswap_16 (unsigned short int __bsx) { - return ((((__bsx) >> 8) & 0xffu) | (((__bsx) & 0xffu) << 8)); + return __bswap_constant_16 (__bsx); } #endif /* Swap bytes in 32 bit value. */ +#define __bswap_constant_32(x) \ + ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ + (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) + #ifdef __GNUC__ # define __bswap_32(x) \ (__extension__ \ - ({ unsigned int __bsx = (x); \ - ((((__bsx) & 0xff000000u) >> 24) | (((__bsx) & 0x00ff0000u) >> 8) | \ - (((__bsx) & 0x0000ff00u) << 8) | (((__bsx) & 0x000000ffu) << 24)); })) + ({ register unsigned int __bsx = (x); __bswap_constant_32 (__bsx); })) #else static __inline unsigned int __bswap_32 (unsigned int __bsx) { - return ((((__bsx) & 0xff000000u) >> 24) | (((__bsx) & 0x00ff0000u) >> 8) | - (((__bsx) & 0x0000ff00u) << 8) | (((__bsx) & 0x000000ffu) << 24)); + return __bswap_constant_32 (__bsx); } #endif diff --git a/sysdeps/generic/bits/mman.h b/sysdeps/generic/bits/mman.h index a2ee064cae..0c15902706 100644 --- a/sysdeps/generic/bits/mman.h +++ b/sysdeps/generic/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for BSD-style memory management. - Copyright (C) 1994-1998,2000,01,02 Free Software Foundation, Inc. + Copyright (C) 1994-1998,2000,01,02,05 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -85,6 +85,12 @@ #define MS_SYNC 0 /* Synchronous memory sync. */ #define MS_INVALIDATE 2 /* Invalidate the caches. */ +/* Flags for `mremap'. */ +#ifdef __USE_GNU +# define MREMAP_MAYMOVE 1 /* Mapping address may change. */ +# define MREMAP_FIXED 2 /* Fifth argument sets new address. */ +#endif + /* Flags for `mlockall' (can be OR'd together). */ #define MCL_CURRENT 1 /* Lock all currently mapped pages. */ #define MCL_FUTURE 2 /* Lock all additions to address diff --git a/sysdeps/generic/fdopendir.c b/sysdeps/generic/fdopendir.c index 597ccd5a5e..ed30e89e7e 100644 --- a/sysdeps/generic/fdopendir.c +++ b/sysdeps/generic/fdopendir.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005 Free Software Foundation, Inc. +/* Open a directory stream from a file descriptor. Stub version. + Copyright (C) 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or diff --git a/sysdeps/generic/s_csqrt.c b/sysdeps/generic/s_csqrt.c index 0bb6690b17..04ed410a16 100644 --- a/sysdeps/generic/s_csqrt.c +++ b/sysdeps/generic/s_csqrt.c @@ -1,5 +1,5 @@ /* Complex square root of double value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrt (__complex__ double x) { double r = __ieee754_sqrt (0.5 * fabs (__imag__ x)); - __real__ res = __copysign (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysign (r, __imag__ x); } else { diff --git a/sysdeps/generic/s_csqrtf.c b/sysdeps/generic/s_csqrtf.c index b02c605a37..2fba69ce1b 100644 --- a/sysdeps/generic/s_csqrtf.c +++ b/sysdeps/generic/s_csqrtf.c @@ -1,5 +1,5 @@ /* Complex square root of float value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrtf (__complex__ float x) { float r = __ieee754_sqrtf (0.5 * fabsf (__imag__ x)); - __real__ res = __copysignf (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysignf (r, __imag__ x); } else { diff --git a/sysdeps/generic/s_csqrtl.c b/sysdeps/generic/s_csqrtl.c index 8e27750a04..9d00946c51 100644 --- a/sysdeps/generic/s_csqrtl.c +++ b/sysdeps/generic/s_csqrtl.c @@ -1,5 +1,5 @@ /* Complex square root of long double value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Based on an algorithm by Stephen L. Moshier <moshier@world.std.com>. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -79,8 +79,8 @@ __csqrtl (__complex__ long double x) { long double r = __ieee754_sqrtl (0.5 * fabsl (__imag__ x)); - __real__ res = __copysignl (r, __imag__ x); - __imag__ res = r; + __real__ res = r; + __imag__ res = __copysignl (r, __imag__ x); } else { diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h index 2dc9b0a910..4b21b779ef 100644 --- a/sysdeps/mach/hurd/dl-sysdep.h +++ b/sysdeps/mach/hurd/dl-sysdep.h @@ -1,5 +1,5 @@ /* System-specific settings for dynamic linker code. Hurd version. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,3 +23,9 @@ (open, mmap, etc). */ #define RTLD_PRIVATE_ERRNO 0 + +#ifdef SHARED +/* _dl_argv cannot be attribute_relro, because the stack-switching + libc initializer for using cthreads might write into it. */ +# define DL_ARGV_NOT_RELRO 1 +#endif diff --git a/sysdeps/mach/hurd/fdopendir.c b/sysdeps/mach/hurd/fdopendir.c new file mode 100644 index 0000000000..37dd4bc82e --- /dev/null +++ b/sysdeps/mach/hurd/fdopendir.c @@ -0,0 +1,56 @@ +/* Open a directory stream from a file descriptor. Hurd version. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <dirent.h> +#include <errno.h> +#include <hurd.h> +#include <hurd/fd.h> +#include <fcntl.h> + +DIR *_hurd_fd_opendir (struct hurd_fd *d); /* opendir.c */ + +/* Open a directory stream on FD. */ +DIR * +fdopendir (int fd) +{ + struct hurd_fd *d = _hurd_fd_get (fd); + + if (d == NULL) + { + errno = EBADF; + return NULL; + } + + /* Ensure that it's a directory. */ + error_t err = HURD_FD_PORT_USE + (d, ({ + file_t dir = __file_name_lookup_under (port, "/", O_NOTRANS, 0); + if (dir != MACH_PORT_NULL) + __mach_port_deallocate (__mach_task_self (), dir); + dir != MACH_PORT_NULL ? 0 : errno; + })); + + if (err) + { + errno = err; + return NULL; + } + + return _hurd_fd_opendir (d); +} diff --git a/sysdeps/mach/hurd/getpeername.c b/sysdeps/mach/hurd/getpeername.c index 2e4f9f6a9d..39071c1da4 100644 --- a/sysdeps/mach/hurd/getpeername.c +++ b/sysdeps/mach/hurd/getpeername.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1994, 1997, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1992,1994,1997,1999,2000,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,14 +47,19 @@ __getpeername (int fd, __SOCKADDR_ARG addrarg, socklen_t *len) if (*len > buflen) *len = buflen; - + if (buf != (char *) addr) { memcpy (addr, buf, *len); __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen); } - addr->sa_family = type; + const sa_family_t family = type; + if (*len < (char *) (&addr->sa_family + 1) - (char *) addr) + memcpy (&addr->sa_family, &family, + *len - offsetof (struct sockaddr, sa_family)); + else + addr->sa_family = family; return 0; } diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c index caa232026d..f9a7a58deb 100644 --- a/sysdeps/mach/hurd/i386/init-first.c +++ b/sysdeps/mach/hurd/i386/init-first.c @@ -1,5 +1,6 @@ /* Initialization code run first thing by the ELF startup code. For i386/Hurd. - Copyright (C) 1995,96,97,98,99,2000,01,02,03,04 Free Software Foundation, Inc. + Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -54,7 +55,7 @@ extern int __libc_argc attribute_hidden; extern char **__libc_argv attribute_hidden; extern char **_dl_argv; -void *(*_cthread_init_routine) (void); /* Returns new SP to use. */ +extern void *(*_cthread_init_routine) (void) __attribute__ ((weak)); void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__)); /* Things that want to be run before _hurd_init or much anything else. @@ -203,7 +204,7 @@ init (int *data) code as the return address, and the argument data immediately above that on the stack. */ - if (_cthread_init_routine) + if (&_cthread_init_routine && _cthread_init_routine) { /* Initialize cthreads, which will allocate us a new stack to run on. */ int *newsp = (*_cthread_init_routine) (); @@ -271,7 +272,7 @@ init (int *data) /* The argument data is just above the stack frame we will unwind by returning. Mutate our own return address to run the code below. */ usercode = data[-1]; - ((void **) data)[-1] = call_init1; + data[-1] = (int) &call_init1; /* Force USERCODE into %eax and &init1 into %ecx, which are not restored by function return. */ asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1)); @@ -319,11 +320,11 @@ first_init (void) stack set up just as the user will see it, so it can switch stacks. */ void -_dl_init_first (int argc, ...) +_dl_init_first (void) { first_init (); - init (&argc); + init ((int *) __builtin_frame_address (0) + 2); } #endif @@ -350,21 +351,23 @@ strong_alias (posixland_init, __libc_init_first); This poorly-named function is called by static-start.S, which should not exist at all. */ void -_hurd_stack_setup (volatile int argc, ...) +_hurd_stack_setup (void) { + intptr_t caller = (intptr_t) __builtin_return_address (0); + void doinit (intptr_t *data) { /* This function gets called with the argument data at TOS. */ - void doinit1 (volatile int argc, ...) + void doinit1 (void) { - init ((int *) &argc); + init ((int *) __builtin_frame_address (0) + 2); } /* Push the user return address after the argument data, and then jump to `doinit1' (above), so it is as if __libc_init_first's caller had called `doinit1' with the argument data already on the stack. */ - *--data = (&argc)[-1]; + *--data = caller; asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack. */ "movl $0, %%ebp\n" /* Clear outermost frame pointer. */ "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp"); @@ -373,7 +376,7 @@ _hurd_stack_setup (volatile int argc, ...) first_init (); - _hurd_startup ((void **) &argc, &doinit); + _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit); } #endif diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index a1ff947f06..5b10142d39 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993,94,95,96,97,98,2001,2003 Free Software Foundation, Inc. +/* Copyright (C) 1993,94,95,96,97,98,2001,2003,2005 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -32,13 +33,46 @@ #include "dirstream.h" +/* Open a directory stream on a file descriptor in Hurd internal form. + We do no checking here on the descriptor. */ +DIR * +_hurd_fd_opendir (struct hurd_fd *d) +{ + DIR *dirp; + + if (d == NULL) + { + errno = EBADF; + return NULL; + } + + dirp = (DIR *) malloc (sizeof (DIR)); + if (dirp == NULL) + return NULL; + + /* Set the descriptor to close on exec. */ + __spin_lock (&d->port.lock); + d->flags |= FD_CLOEXEC; + __spin_unlock (&d->port.lock); + + dirp->__fd = d; + dirp->__data = dirp->__ptr = NULL; + dirp->__entry_data = dirp->__entry_ptr = 0; + dirp->__allocation = 0; + dirp->__size = 0; + + __libc_lock_init (dirp->__lock); + + return dirp; +} + + /* Open a directory stream on NAME. */ DIR * __opendir (const char *name) { - DIR *dirp; int fd; - struct hurd_fd *d; + DIR *dirp; if (name[0] == '\0') { @@ -71,29 +105,10 @@ __opendir (const char *name) if (fd < 0) return NULL; - dirp = (DIR *) malloc (sizeof (DIR)); - if (dirp == NULL) - { - __close (fd); - return NULL; - } - /* Extract the pointer to the descriptor structure. */ - __mutex_lock (&_hurd_dtable_lock); - d = dirp->__fd = _hurd_dtable[fd]; - __mutex_unlock (&_hurd_dtable_lock); - - /* Set the descriptor to close on exec. */ - __spin_lock (&d->port.lock); - d->flags |= FD_CLOEXEC; - __spin_unlock (&d->port.lock); - - dirp->__data = dirp->__ptr = NULL; - dirp->__entry_data = dirp->__entry_ptr = 0; - dirp->__allocation = 0; - dirp->__size = 0; - - __libc_lock_init (dirp->__lock); + dirp = _hurd_fd_opendir (_hurd_fd_get (fd)); + if (dirp == NULL) + __close (fd); return dirp; } diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c index d212872643..0426f67b6f 100644 --- a/sysdeps/mach/hurd/profil.c +++ b/sysdeps/mach/hurd/profil.c @@ -1,5 +1,5 @@ /* Low-level statistical profiling support function. Mach/Hurd version. - Copyright (C) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 2000, 2002, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -49,6 +49,7 @@ static kern_return_t profil_task_get_sampled_pcs (mach_port_t, sampled_pc_array_t, mach_msg_type_number_t *); static void fetch_samples (void); +static void profile_waiter (void); /* Enable statistical profiling, writing samples of the PC into at most SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling @@ -64,7 +65,6 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale) if (profile_thread == MACH_PORT_NULL) { /* Set up the profiling collector thread. */ - static void profile_waiter (void); err = __thread_create (__mach_task_self (), &profile_thread); if (! err) err = __mach_setup_thread (__mach_task_self (), profile_thread, diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c index 9fef56287d..fec64a8cb5 100644 --- a/sysdeps/mach/hurd/setitimer.c +++ b/sysdeps/mach/hurd/setitimer.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1994,1995,1996,1997,2000,2001 Free Software Foundation, Inc. +/* Copyright (C) 1994,1995,1996,1997,2000,2001,2005 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -41,7 +42,7 @@ static void quantize_timeval (struct timeval *tv) { static time_t quantum = -1; - + if (quantum == -1) quantum = 1000000 / __getclktck (); @@ -127,14 +128,15 @@ timer_thread (void) } +/* Forward declaration. */ +static int setitimer_locked (const struct itimerval *new, + struct itimerval *old, void *crit); + static sighandler_t restart_itimer (struct hurd_signal_preemptor *preemptor, struct hurd_sigstate *ss, int *signo, struct hurd_signal_detail *detail) { - static int setitimer_locked (const struct itimerval *new, - struct itimerval *old, void *crit); - /* This function gets called in the signal thread each time a SIGALRM is arriving (even if blocked). */ struct itimerval it; diff --git a/sysdeps/unix/fdopendir.c b/sysdeps/unix/fdopendir.c index 3c481fcf0d..23d08fd7fd 100644 --- a/sysdeps/unix/fdopendir.c +++ b/sysdeps/unix/fdopendir.c @@ -18,6 +18,7 @@ #include <dirent.h> #include <errno.h> +#include <fcntl.h> #include <sys/stat.h> #include <not-cancel.h> @@ -29,14 +30,21 @@ fdopendir (int fd) struct stat64 statbuf; if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &statbuf), 0) < 0) - goto out; + return NULL; if (__builtin_expect (! S_ISDIR (statbuf.st_mode), 0)) { __set_errno (ENOTDIR); - out: - close_not_cancel_no_status (fd); + return NULL; + } + /* Make sure the descriptor allows for reading. */ + int flags = __fcntl (fd, F_GETFL); + if (__builtin_expect (flags == -1, 0)) + return NULL; + if (__builtin_expect ((flags & O_ACCMODE) == O_WRONLY, 0)) + { + __set_errno (EINVAL); return NULL; } - return __alloc_dir (fd, &statbuf); + return __alloc_dir (fd, false, &statbuf); } diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index 366670b79c..98fb4ca5c8 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -132,14 +132,14 @@ __opendir (const char *name) } } - return __alloc_dir (fd, &statbuf); + return __alloc_dir (fd, true, &statbuf); } weak_alias (__opendir, opendir) DIR * internal_function -__alloc_dir (int fd, struct stat64 *statp) +__alloc_dir (int fd, bool close_fd, struct stat64 *statp) { if (__builtin_expect (__fcntl (fd, F_SETFD, FD_CLOEXEC), 0) < 0) goto lose; @@ -160,9 +160,12 @@ __alloc_dir (int fd, struct stat64 *statp) if (dirp == NULL) lose: { - int save_errno = errno; - close_not_cancel_no_status (fd); - __set_errno (save_errno); + if (close_fd) + { + int save_errno = errno; + close_not_cancel_no_status (fd); + __set_errno (save_errno); + } return NULL; } memset (dirp, '\0', sizeof (DIR)); diff --git a/sysdeps/unix/sysv/linux/i386/bits/mman.h b/sysdeps/unix/sysv/linux/i386/bits/mman.h index 1477aa54e2..d0f210f0bc 100644 --- a/sysdeps/unix/sysv/linux/i386/bits/mman.h +++ b/sysdeps/unix/sysv/linux/i386/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/i386 version. - Copyright (C) 1997, 2000, 2003 Free Software Foundation, Inc. + Copyright (C) 1997, 2000, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -78,6 +78,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/i386/ucontext_i.h b/sysdeps/unix/sysv/linux/i386/ucontext_i.h index d6efca41b1..c6319f2391 100644 --- a/sysdeps/unix/sysv/linux/i386/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/i386/ucontext_i.h @@ -1,6 +1,6 @@ /* Offsets and other constants needed in the *context() function implementation. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -39,3 +39,23 @@ #define oFPREGS 96 #define oSIGMASK 108 #define oFPREGSMEM 236 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_link, oLINK); \ + TEST (uc_stack.ss_sp, oSS_SP); \ + TEST (uc_stack.ss_size, oSS_SIZE); \ + TEST (uc_mcontext.gregs[REG_GS], oGS); \ + TEST (uc_mcontext.gregs[REG_FS], oFS); \ + TEST (uc_mcontext.gregs[REG_EDI], oEDI); \ + TEST (uc_mcontext.gregs[REG_ESI], oESI); \ + TEST (uc_mcontext.gregs[REG_EBP], oEBP); \ + TEST (uc_mcontext.gregs[REG_ESP], oESP); \ + TEST (uc_mcontext.gregs[REG_EBX], oEBX); \ + TEST (uc_mcontext.gregs[REG_EDX], oEDX); \ + TEST (uc_mcontext.gregs[REG_ECX], oECX); \ + TEST (uc_mcontext.gregs[REG_EAX], oEAX); \ + TEST (uc_mcontext.gregs[REG_EIP], oEIP); \ + TEST (uc_mcontext.fpregs, oFPREGS); \ + TEST (uc_sigmask, oSIGMASK); \ + TEST (__fpregs_mem, oFPREGSMEM); diff --git a/sysdeps/unix/sysv/linux/ia64/bits/mman.h b/sysdeps/unix/sysv/linux/ia64/bits/mman.h index 01db5be028..a3d1b1dc7e 100644 --- a/sysdeps/unix/sysv/linux/ia64/bits/mman.h +++ b/sysdeps/unix/sysv/linux/ia64/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/ia64 version. - Copyright (C) 1997, 1998, 2000, 2003 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2000, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -79,6 +79,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h index 8dbaf5d7b8..c2b195a71e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h +++ b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/PowerPC version. - Copyright (C) 1997, 2000, 2003 Free Software Foundation, Inc. + Copyright (C) 1997, 2000, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -79,6 +79,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h index e47b24a09e..f65b0ed58c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h @@ -41,3 +41,22 @@ #define _UC_VREGS 464 #define _UC_VSCR 976 #define _UC_VRSAVE 980 + +/* The registers don't have a fixed offset within ucontext because the + orginal ucontext only contained the regs pointer. Also with the + addition of VMX to the register state the mcontext may require + stronger alignment (16) then the containing ucontext (4). All access + to register state (pt_regs/mcontext) must be indirect via the regs + (uc_regs) pointer. This means we can't test the PPC32 mcontext + register offsets here. */ + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_link, _UC_LINK); \ + TEST (uc_stack.ss_sp, _UC_STACK_SP); \ + TEST (uc_stack.ss_size, _UC_STACK_SIZE); \ + TEST (uc_mcontext.regs, _UC_REGS_PTR); \ + TEST (uc_mcontext.uc_regs, _UC_REGS_PTR); \ + TEST (uc_sigmask, _UC_SIGMASK); \ + TEST (uc_reg_space, _UC_REG_SPACE); + diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h index 45f1bfdae9..d540cfeaf1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h @@ -58,3 +58,18 @@ #define SIGCONTEXT_FP_REGS 616 #define SIGCONTEXT_V_REGS_PTR 880 #define SIGCONTEXT_V_RESERVE 888 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_link, UCONTEXT_LINK); \ + TEST (uc_stack.ss_sp, UCONTEXT_STACK_SP); \ + TEST (uc_stack.ss_size, UCONTEXT_STACK_SIZE); \ + TEST (uc_sigmask, UCONTEXT_SIGMASK); \ + TEST (uc_mcontext.signal, SIGCONTEXT_SIGNAL); \ + TEST (uc_mcontext.handler, SIGCONTEXT_HANDLER); \ + TEST (uc_mcontext.oldmask, SIGCONTEXT_OLDMASK); \ + TEST (uc_mcontext.regs, SIGCONTEXT_PT_REGS); \ + TEST (uc_mcontext.gp_regs, SIGCONTEXT_GP_REGS); \ + TEST (uc_mcontext.fp_regs, SIGCONTEXT_FP_REGS); \ + TEST (uc_mcontext.v_regs, SIGCONTEXT_V_REGS_PTR); \ + TEST (uc_mcontext.vmx_reserve, SIGCONTEXT_V_RESERVE); diff --git a/sysdeps/unix/sysv/linux/readonly-area.c b/sysdeps/unix/sysv/linux/readonly-area.c index 29224d98b9..69e926a7a1 100644 --- a/sysdeps/unix/sysv/linux/readonly-area.c +++ b/sysdeps/unix/sysv/linux/readonly-area.c @@ -35,10 +35,15 @@ __readonly_area (const char *ptr, size_t size) FILE *fp = fopen ("/proc/self/maps", "rc"); if (fp == NULL) { - if (errno == ENOENT) - /* It is the system administrator's choice to not have /proc - available to this process (e.g., because it runs in a chroot - environment. Don't fail in this case. */ + /* It is the system administrator's choice to not have /proc + available to this process (e.g., because it runs in a chroot + environment. Don't fail in this case. */ + if (errno == ENOENT + /* The kernel has a bug in that a process is denied access + to the /proc filesystem if it is set[ug]id. There has + been no willingness to change this in the kernel so + far. */ + || errno == EACCES) return 1; return -1; } diff --git a/sysdeps/unix/sysv/linux/s390/bits/mman.h b/sysdeps/unix/sysv/linux/s390/bits/mman.h index ac94bb20b2..90604c8322 100644 --- a/sysdeps/unix/sysv/linux/s390/bits/mman.h +++ b/sysdeps/unix/sysv/linux/s390/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/s390 version. - Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -79,6 +79,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h b/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h index 2e51f04e65..61f018621b 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h @@ -27,9 +27,23 @@ #define SC_FLGS 0x000 #define SC_LINK 0x004 #define SC_STCK 0x008 +#define SC_STSZ 0x010 #define SC_PSW 0x018 #define SC_GPRS 0x020 #define SC_ACRS 0x060 #define SC_FPC 0x0A0 #define SC_FPRS 0x0A8 #define SC_MASK 0x128 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_flags, SC_FLGS); \ + TEST (uc_link, SC_LINK); \ + TEST (uc_stack.ss_sp, SC_STCK); \ + TEST (uc_stack.ss_size, SC_STSZ); \ + TEST (uc_mcontext.psw, SC_PSW); \ + TEST (uc_mcontext.gregs, SC_GPRS); \ + TEST (uc_mcontext.aregs, SC_ACRS); \ + TEST (uc_mcontext.fpregs.fpc, SC_FPC); \ + TEST (uc_mcontext.fpregs.fprs, SC_FPRS); \ + TEST (uc_sigmask, SC_MASK); diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h b/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h index 6d223a08a6..28ef915fc1 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h @@ -27,6 +27,7 @@ #define SC_FLGS 0x000 #define SC_LINK 0x008 #define SC_STCK 0x010 +#define SC_STSZ 0x020 #define SC_PSW 0x028 #define SC_GPRS 0x038 #define SC_ACRS 0x0B8 @@ -34,3 +35,15 @@ #define SC_FPRS 0x100 #define SC_MASK 0x180 +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_flags, SC_FLGS); \ + TEST (uc_link, SC_LINK); \ + TEST (uc_stack.ss_sp, SC_STCK); \ + TEST (uc_stack.ss_size, SC_STSZ); \ + TEST (uc_mcontext.psw, SC_PSW); \ + TEST (uc_mcontext.gregs, SC_GPRS); \ + TEST (uc_mcontext.aregs, SC_ACRS); \ + TEST (uc_mcontext.fpregs.fpc, SC_FPC); \ + TEST (uc_mcontext.fpregs.fprs, SC_FPRS); \ + TEST (uc_sigmask, SC_MASK); diff --git a/sysdeps/unix/sysv/linux/sh/bits/mman.h b/sysdeps/unix/sysv/linux/sh/bits/mman.h index 656b5b673b..a3c690b6c6 100644 --- a/sysdeps/unix/sysv/linux/sh/bits/mman.h +++ b/sysdeps/unix/sysv/linux/sh/bits/mman.h @@ -78,6 +78,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/sh/makecontext.S b/sysdeps/unix/sysv/linux/sh/makecontext.S new file mode 100644 index 0000000000..deb6181750 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/makecontext.S @@ -0,0 +1,145 @@ +/* Create new context. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* void __makecontext (struct ucontext *ucp, void (*func)(), int argc, ...); + __makecontext sets up a stack and registers for context to run a given + function. The registers are set up like this: + r4-r7: parameters 1 to 4 + r8 : uc_link from ucontext structure + pc : (*func) pointer + pr : address of exitcode + r15 : stack pointer for func. */ + + .text + .align 5 + cfi_startproc +ENTRY(__makecontext) + mov #4, r3 + mov.l @(oSS_SP,r4), r1 + mov.l @(oSS_SIZE,r4), r2 + add r1, r2 + cmp/gt r6, r3 + bf/s 1f + shlr2 r2 + sub r6, r2 + add r3, r2 +1: + shll2 r2 + mov #oR15, r0 + mov.l @(oLINK,r4), r1 + mov.l r2, @(r0,r4) + mov.l r1, @(oR8,r4) + mov #oPC, r0 + mov.l r5, @(r0,r4) + + cmp/pl r6 + bf/s .L1 + dt r6 + mov.l r7, @(oR4,r4) + cmp/pl r6 + bf/s .L1 + dt r6 + mov.l @(0,r15), r1 + mov.l r1, @(oR5,r4) + cmp/pl r6 + bf/s .L1 + dt r6 + mov.l @(4,r15), r1 + mov.l r1, @(oR6,r4) + cmp/pl r6 + bf/s .L1 + dt r6 + mov.l @(8,r15), r1 + mov.l r1, @(oR7,r4) + mov #12,r0 +.L0: + cmp/pl r6 + bf/s .L1 + dt r6 + mov.l @(r0,r15), r1 + mov.l r1, @r2 + add #4, r0 + bra .L0 + add #4, r2 +.L1: +#ifdef PIC + mova .Lexitcode, r0 +#else + mov.l .L2, r0 +#endif + add #oPR, r4 + rts + mov.l r0, @r4 +#ifndef PIC + .align 2 +.L2: + .long .Lexitcode +#endif + cfi_endproc + + .align 5 +.Lexitcode: + tst r8, r8 + bt/s 2f + mov r8, r4 +#ifdef PIC + mova .Lgot, r0 + mov.l .Lgot, r12 + add r0, r12 + mov.l .L3, r1 + bsrf r1 +.LPCS0: + nop +#else + mov.l .L3, r1 + jsr @r1 + nop +#endif +2: + mov.l .L4, r1 +#ifdef PIC + add r12, r1 +#endif + jsr @r1 + mov r0, r4 +0: + bra 0b + nop + + .align 2 +#ifdef PIC +.Lgot: + .long _GLOBAL_OFFSET_TABLE_ +.L3: + .long __setcontext@PLT-(.LPCS0+2-(.)) +.L4: + .long HIDDEN_JUMPTARGET(exit)@GOTOFF +#else +.L3: + .long __setcontext +.L4: + .long HIDDEN_JUMPTARGET(exit) +#endif +PSEUDO_END(__makecontext) + +weak_alias (__makecontext, makecontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh3/getcontext.S b/sysdeps/unix/sysv/linux/sh/sh3/getcontext.S new file mode 100644 index 0000000000..3ea47d4a5c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh3/getcontext.S @@ -0,0 +1,90 @@ +/* Save current context. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __getcontext (ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__getcontext) + + /* Return value of getcontext. R0 is the only register whose + value is not preserved. */ + mov #0, r0 + mov.l r0, @(oR0,r4) + mov.l r1, @(oR1,r4) + mov.l r2, @(oR2,r4) + mov.l r3, @(oR3,r4) + mov.l r4, @(oR4,r4) + mov.l r5, @(oR5,r4) + mov.l r6, @(oR6,r4) + mov.l r7, @(oR7,r4) + mov r4, r0 + add #(oMACL+4), r0 + sts.l macl, @-r0 + sts.l mach, @-r0 + stc.l gbr, @-r0 + + /* Save T flag to SR. */ + movt r1 + mov.l r1, @-r0 + sts.l pr, @-r0 + + /* The return address of getcontext is the restart pc. */ + sts.l pr, @-r0 + + mov.l r15, @-r0 + mov.l r14, @-r0 + mov.l r13, @-r0 + mov.l r12, @-r0 + mov.l r11, @-r0 + mov.l r10, @-r0 + mov.l r9, @-r0 + mov.l r8, @-r0 + + /* sigprocmask (SIG_BLOCK, NULL, &uc->uc_sigmask). */ + mov r4, r6 + add #oSIGMASK, r6 + mov #SIG_BLOCK, r4 + mov #0, r5 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lgetcontext_end +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lgetcontext_end: + /* All done, return 0 for success. */ + mov #0, r0 +.Lpseudo_end: + rts + nop + + cfi_endproc +PSEUDO_END(__getcontext) + +weak_alias (__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S b/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S new file mode 100644 index 0000000000..30fbf7dec3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S @@ -0,0 +1,101 @@ +/* Install given context. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __setcontext (const ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__setcontext) + + mov r4, r8 + + /* sigprocmask (SIG_SETMASK, &uc->uc_sigmask, NULL). */ + mov r4, r5 + add #oSIGMASK, r5 + mov #SIG_SETMASK, r4 + mov #0, r6 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lsetcontext_restore +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lpseudo_end: + rts + nop + +.Lsetcontext_restore: + mov r8, r0 + add #(oPC), r0 + mov.l @r0+, r2 + lds.l @r0+, pr + + /* Restore T frag. */ + mov.l @r0+, r1 + shlr r1 + /* Skip GBR which is used for thread pointer. */ + add #4, r0 + + lds.l @r0+, mach + lds.l @r0+, macl + + mov r8, r0 + add #(oR9), r0 + mov.l @r0+, r9 + mov.l @r0+, r10 + mov.l @r0+, r11 + mov.l @r0+, r12 + mov.l @r0+, r13 + mov.l @r0+, r14 + mov.l @r0+, r15 + + mov r8, r0 + mov.l @(oR0,r0), r1 + mov.l r1, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r1, 0) + mov.l r2, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r2, 0) + + mov.l @(oR1,r0), r1 + mov.l @(oR2,r0), r2 + mov.l @(oR3,r0), r3 + mov.l @(oR4,r0), r4 + mov.l @(oR5,r0), r5 + mov.l @(oR6,r0), r6 + mov.l @(oR7,r0), r7 + mov.l @(oR8,r0), r8 + mov.l @r15+, r0 + jmp @r0 + mov.l @r15+, r0 + + cfi_endproc +PSEUDO_END(__setcontext) + +weak_alias (__setcontext, setcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S b/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S new file mode 100644 index 0000000000..aa0129e9ac --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S @@ -0,0 +1,134 @@ +/* Save current context and install the given one. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __swapcontext (ucontext_t *ouc, const ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__swapcontext) + + /* Return value of getcontext. R0 is the only register whose + value is not preserved. */ + mov #0, r0 + mov.l r0, @(oR0,r4) + mov.l r1, @(oR1,r4) + mov.l r2, @(oR2,r4) + mov.l r3, @(oR3,r4) + mov.l r4, @(oR4,r4) + mov.l r5, @(oR5,r4) + mov.l r6, @(oR6,r4) + mov.l r7, @(oR7,r4) + mov r4, r0 + add #(oMACL+4), r0 + sts.l macl, @-r0 + sts.l mach, @-r0 + stc.l gbr, @-r0 + + /* Save T flag to SR. */ + movt r1 + mov.l r1, @-r0 + sts.l pr, @-r0 + + /* The return address of getcontext is the restart pc. */ + sts.l pr, @-r0 + + mov.l r15, @-r0 + mov.l r14, @-r0 + mov.l r13, @-r0 + mov.l r12, @-r0 + mov.l r11, @-r0 + mov.l r10, @-r0 + mov.l r9, @-r0 + mov.l r8, @-r0 + + mov r5, r8 + + /* sigprocmask (SIG_SETMASK, &uc->uc_sigmask, &ouc->uc_sigmask). */ + add #oSIGMASK, r5 + mov r4, r6 + add #oSIGMASK, r6 + mov #SIG_SETMASK, r4 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lswapcontext_restore +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lpseudo_end: + rts + nop +.Lswapcontext_restore: + mov r8, r0 + add #(oPC), r0 + mov.l @r0+, r2 + lds.l @r0+, pr + + /* Restore T frag. */ + mov.l @r0+, r1 + shlr r1 + /* Skip GBR which is used for thread pointer. */ + add #4, r0 + + lds.l @r0+, mach + lds.l @r0+, macl + + mov r8, r0 + add #(oR9), r0 + mov.l @r0+, r9 + mov.l @r0+, r10 + mov.l @r0+, r11 + mov.l @r0+, r12 + mov.l @r0+, r13 + mov.l @r0+, r14 + mov.l @r0+, r15 + + mov r8, r0 + mov.l @(oR0,r0), r1 + mov.l r1, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r1, 0) + mov.l r2, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r2, 0) + + mov.l @(oR1,r0), r1 + mov.l @(oR2,r0), r2 + mov.l @(oR3,r0), r3 + mov.l @(oR4,r0), r4 + mov.l @(oR5,r0), r5 + mov.l @(oR6,r0), r6 + mov.l @(oR7,r0), r7 + mov.l @(oR8,r0), r8 + mov.l @r15+, r0 + jmp @r0 + mov.l @r15+, r0 + + cfi_endproc +PSEUDO_END(__swapcontext) + +weak_alias (__swapcontext, swapcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh3/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sh3/sys/ucontext.h new file mode 100644 index 0000000000..946df0dfd6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh3/sys/ucontext.h @@ -0,0 +1,102 @@ +/* Copyright (C) 1999, 2000, 2001, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Where is System V/SH ABI? */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +/* We need the signal context definitions even if they are not used + included in <signal.h>. */ +#include <bits/sigcontext.h> + + +typedef int greg_t; + +/* Number of general registers. */ +#define NFPREG 16 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NFPREG]; + +#ifdef __USE_GNU +/* Number of each register is the `gregset_t' array. */ +enum +{ + R0 = 0, +#define R0 R0 + R1 = 1, +#define R1 R1 + R2 = 2, +#define R2 R2 + R3 = 3, +#define R3 R3 + R4 = 4, +#define R4 R4 + R5 = 5, +#define R5 R5 + R6 = 6, +#define R6 R6 + R7 = 7, +#define R7 R7 + R8 = 8, +#define R8 R8 + R9 = 9, +#define R9 R9 + R10 = 10, +#define R10 R10 + R11 = 11, +#define R11 R11 + R12 = 12, +#define R12 R12 + R13 = 13, +#define R13 R13 + R14 = 14, +#define R14 R14 + R15 = 15, +#define R15 R15 +}; +#endif + +/* Context to describe whole processor state. */ +typedef struct + { + unsigned int oldmask; + gregset_t gregs; + unsigned int pc; + unsigned int pr; + unsigned int sr; + unsigned int gbr; + unsigned int mach; + unsigned int macl; + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + __sigset_t uc_sigmask; + } ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.h b/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.h new file mode 100644 index 0000000000..d8483dbe64 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.h @@ -0,0 +1,79 @@ +/* Offsets and other constants needed in the *context() function + implementation. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define SIG_BLOCK 0 +#define SIG_SETMASK 2 + +/* Offsets of the fields in the ucontext_t structure. */ +#define oLINK 4 +#define oSS_SP 8 +#define oSS_SIZE 16 +#define oR0 24 +#define oR1 28 +#define oR2 32 +#define oR3 36 +#define oR4 40 +#define oR5 44 +#define oR6 48 +#define oR7 52 +#define oR8 56 +#define oR9 60 +#define oR10 64 +#define oR11 68 +#define oR12 72 +#define oR13 76 +#define oR14 80 +#define oR15 84 +#define oPC 88 +#define oPR 92 +#define oSR 96 +#define oGBR 100 +#define oMACH 104 +#define oMACL 108 +#define oSIGMASK 112 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_link, oLINK); \ + TEST (uc_stack.ss_sp, oSS_SP); \ + TEST (uc_stack.ss_size, oSS_SIZE); \ + TEST (uc_mcontext.gregs[R0], oR0); \ + TEST (uc_mcontext.gregs[R1], oR1); \ + TEST (uc_mcontext.gregs[R2], oR2); \ + TEST (uc_mcontext.gregs[R3], oR3); \ + TEST (uc_mcontext.gregs[R4], oR4); \ + TEST (uc_mcontext.gregs[R5], oR5); \ + TEST (uc_mcontext.gregs[R6], oR6); \ + TEST (uc_mcontext.gregs[R7], oR7); \ + TEST (uc_mcontext.gregs[R8], oR8); \ + TEST (uc_mcontext.gregs[R9], oR9); \ + TEST (uc_mcontext.gregs[R10], oR10); \ + TEST (uc_mcontext.gregs[R11], oR11); \ + TEST (uc_mcontext.gregs[R12], oR12); \ + TEST (uc_mcontext.gregs[R13], oR13); \ + TEST (uc_mcontext.gregs[R14], oR14); \ + TEST (uc_mcontext.gregs[R15], oR15); \ + TEST (uc_mcontext.pc, oPC); \ + TEST (uc_mcontext.pr, oPR); \ + TEST (uc_mcontext.sr, oSR); \ + TEST (uc_mcontext.gbr, oGBR); \ + TEST (uc_mcontext.mach, oMACH); \ + TEST (uc_mcontext.macl, oMACL); \ + TEST (uc_sigmask, oSIGMASK); diff --git a/sysdeps/unix/sysv/linux/sh/sh4/getcontext.S b/sysdeps/unix/sysv/linux/sh/sh4/getcontext.S new file mode 100644 index 0000000000..380c4591dd --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh4/getcontext.S @@ -0,0 +1,133 @@ +/* Save current context. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __getcontext (ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__getcontext) + + /* Return value of getcontext. R0 is the only register whose + value is not preserved. */ + mov #0, r0 + mov.l r0, @(oR0,r4) + mov.l r1, @(oR1,r4) + mov.l r2, @(oR2,r4) + mov.l r3, @(oR3,r4) + mov.l r4, @(oR4,r4) + mov.l r5, @(oR5,r4) + mov.l r6, @(oR6,r4) + mov.l r7, @(oR7,r4) + mov r4, r0 + add #(oMACL+4), r0 + sts.l macl, @-r0 + sts.l mach, @-r0 + stc.l gbr, @-r0 + + /* Save T flag to SR. */ + movt r1 + mov.l r1, @-r0 + sts.l pr, @-r0 + + /* The return address of getcontext is the restart pc. */ + sts.l pr, @-r0 + + mov.l r15, @-r0 + mov.l r14, @-r0 + mov.l r13, @-r0 + mov.l r12, @-r0 + mov.l r11, @-r0 + mov.l r10, @-r0 + mov.l r9, @-r0 + mov.l r8, @-r0 + + mov r4, r0 + /* We need 2 add instruction because oFPUL+4 > 127. */ + add #124,r0 + add #(oFPUL+4-124),r0 + sts.l fpul, @-r0 + sts.l fpscr, @-r0 + frchg + fmov.s fr15, @-r0 + fmov.s fr14, @-r0 + fmov.s fr13, @-r0 + fmov.s fr12, @-r0 + fmov.s fr11, @-r0 + fmov.s fr10, @-r0 + fmov.s fr9, @-r0 + fmov.s fr8, @-r0 + fmov.s fr7, @-r0 + fmov.s fr6, @-r0 + fmov.s fr5, @-r0 + fmov.s fr4, @-r0 + fmov.s fr3, @-r0 + fmov.s fr2, @-r0 + fmov.s fr1, @-r0 + fmov.s fr0, @-r0 + frchg + fmov.s fr15, @-r0 + fmov.s fr14, @-r0 + fmov.s fr13, @-r0 + fmov.s fr12, @-r0 + fmov.s fr11, @-r0 + fmov.s fr10, @-r0 + fmov.s fr9, @-r0 + fmov.s fr8, @-r0 + fmov.s fr7, @-r0 + fmov.s fr6, @-r0 + fmov.s fr5, @-r0 + fmov.s fr4, @-r0 + fmov.s fr3, @-r0 + fmov.s fr2, @-r0 + fmov.s fr1, @-r0 + fmov.s fr0, @-r0 + + /* sigprocmask (SIG_BLOCK, NULL, &uc->uc_sigmask). */ + mov r4, r6 + /* We need 2 add instruction because oSIGMASK > 127. */ + add #(oSIGMASK/2), r6 + add #(oSIGMASK/2), r6 + mov #SIG_BLOCK, r4 + mov #0, r5 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lgetcontext_end +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lgetcontext_end: + /* All done, return 0 for success. */ + mov #0, r0 +.Lpseudo_end: + rts + nop + + cfi_endproc +PSEUDO_END(__getcontext) + +weak_alias (__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S b/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S new file mode 100644 index 0000000000..9e98910b4b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S @@ -0,0 +1,141 @@ +/* Install given context. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __setcontext (const ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__setcontext) + + mov r4, r8 + + /* sigprocmask (SIG_SETMASK, &uc->uc_sigmask, NULL). */ + mov r4, r5 + add #(oSIGMASK/2), r5 + add #(oSIGMASK/2), r5 + mov #SIG_SETMASK, r4 + mov #0, r6 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lsetcontext_restore +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lpseudo_end: + rts + nop + +.Lsetcontext_restore: + mov r8, r0 + add #(oFR0),r0 + fmov.s @r0+, fr0 + fmov.s @r0+, fr1 + fmov.s @r0+, fr2 + fmov.s @r0+, fr3 + fmov.s @r0+, fr4 + fmov.s @r0+, fr5 + fmov.s @r0+, fr6 + fmov.s @r0+, fr7 + fmov.s @r0+, fr8 + fmov.s @r0+, fr9 + fmov.s @r0+, fr10 + fmov.s @r0+, fr11 + fmov.s @r0+, fr12 + fmov.s @r0+, fr13 + fmov.s @r0+, fr14 + fmov.s @r0+, fr15 + frchg + fmov.s @r0+, fr0 + fmov.s @r0+, fr1 + fmov.s @r0+, fr2 + fmov.s @r0+, fr3 + fmov.s @r0+, fr4 + fmov.s @r0+, fr5 + fmov.s @r0+, fr6 + fmov.s @r0+, fr7 + fmov.s @r0+, fr8 + fmov.s @r0+, fr9 + fmov.s @r0+, fr10 + fmov.s @r0+, fr11 + fmov.s @r0+, fr12 + fmov.s @r0+, fr13 + fmov.s @r0+, fr14 + fmov.s @r0+, fr15 + frchg + lds.l @r0+, fpscr + lds.l @r0+, fpul + + mov r8, r0 + add #(oPC), r0 + mov.l @r0+, r2 + lds.l @r0+, pr + + /* Restore T frag. */ + mov.l @r0+, r1 + shlr r1 + /* Skip GBR which is used for thread pointer. */ + add #4, r0 + + lds.l @r0+, mach + lds.l @r0+, macl + + mov r8, r0 + add #(oR9), r0 + mov.l @r0+, r9 + mov.l @r0+, r10 + mov.l @r0+, r11 + mov.l @r0+, r12 + mov.l @r0+, r13 + mov.l @r0+, r14 + mov.l @r0+, r15 + + mov r8, r0 + mov.l @(oR0,r0), r1 + mov.l r1, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r1, 0) + mov.l r2, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r2, 0) + + mov.l @(oR1,r0), r1 + mov.l @(oR2,r0), r2 + mov.l @(oR3,r0), r3 + mov.l @(oR4,r0), r4 + mov.l @(oR5,r0), r5 + mov.l @(oR6,r0), r6 + mov.l @(oR7,r0), r7 + mov.l @(oR8,r0), r8 + mov.l @r15+, r0 + jmp @r0 + mov.l @r15+, r0 + + cfi_endproc +PSEUDO_END(__setcontext) + +weak_alias (__setcontext, setcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S b/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S new file mode 100644 index 0000000000..1d58a40e70 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S @@ -0,0 +1,216 @@ +/* Save current context and install the given one. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __swapcontext (ucontext_t *ouc, const ucontext_t *uc); */ + + .text + .align 5 + cfi_startproc +ENTRY(__swapcontext) + + /* Return value of getcontext. R0 is the only register whose + value is not preserved. */ + mov #0, r0 + mov.l r0, @(oR0,r4) + mov.l r1, @(oR1,r4) + mov.l r2, @(oR2,r4) + mov.l r3, @(oR3,r4) + mov.l r4, @(oR4,r4) + mov.l r5, @(oR5,r4) + mov.l r6, @(oR6,r4) + mov.l r7, @(oR7,r4) + mov r4, r0 + add #(oMACL+4), r0 + sts.l macl, @-r0 + sts.l mach, @-r0 + stc.l gbr, @-r0 + + /* Save T flag to SR. */ + movt r1 + mov.l r1, @-r0 + sts.l pr, @-r0 + + /* The return address of getcontext is the restart pc. */ + sts.l pr, @-r0 + + mov.l r15, @-r0 + mov.l r14, @-r0 + mov.l r13, @-r0 + mov.l r12, @-r0 + mov.l r11, @-r0 + mov.l r10, @-r0 + mov.l r9, @-r0 + mov.l r8, @-r0 + + mov r4, r0 + /* We need 2 add instruction because oFPUL+4 >= 127. */ + add #124,r0 + add #(oFPUL+4-124),r0 + sts.l fpul, @-r0 + sts.l fpscr, @-r0 + frchg + fmov.s fr15, @-r0 + fmov.s fr14, @-r0 + fmov.s fr13, @-r0 + fmov.s fr12, @-r0 + fmov.s fr11, @-r0 + fmov.s fr10, @-r0 + fmov.s fr9, @-r0 + fmov.s fr8, @-r0 + fmov.s fr7, @-r0 + fmov.s fr6, @-r0 + fmov.s fr5, @-r0 + fmov.s fr4, @-r0 + fmov.s fr3, @-r0 + fmov.s fr2, @-r0 + fmov.s fr1, @-r0 + fmov.s fr0, @-r0 + frchg + fmov.s fr15, @-r0 + fmov.s fr14, @-r0 + fmov.s fr13, @-r0 + fmov.s fr12, @-r0 + fmov.s fr11, @-r0 + fmov.s fr10, @-r0 + fmov.s fr9, @-r0 + fmov.s fr8, @-r0 + fmov.s fr7, @-r0 + fmov.s fr6, @-r0 + fmov.s fr5, @-r0 + fmov.s fr4, @-r0 + fmov.s fr3, @-r0 + fmov.s fr2, @-r0 + fmov.s fr1, @-r0 + fmov.s fr0, @-r0 + + mov r5, r8 + + /* sigprocmask (SIG_SETMASK, &uc->uc_sigmask, &ouc->uc_sigmask). */ + mov #oSIGMASK, r1 + extu.b r1, r1 + add r1, r5 + mov r4, r6 + add r1, r6 + mov #SIG_SETMASK, r4 + mov #+SYS_ify(sigprocmask), r3 + trapa #0x13 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf .Lswapcontext_restore +.Lsyscall_error: + SYSCALL_ERROR_HANDLER +.Lpseudo_end: + rts + nop +.Lswapcontext_restore: + mov r8, r0 + add #(oFR0),r0 + fmov.s @r0+, fr0 + fmov.s @r0+, fr1 + fmov.s @r0+, fr2 + fmov.s @r0+, fr3 + fmov.s @r0+, fr4 + fmov.s @r0+, fr5 + fmov.s @r0+, fr6 + fmov.s @r0+, fr7 + fmov.s @r0+, fr8 + fmov.s @r0+, fr9 + fmov.s @r0+, fr10 + fmov.s @r0+, fr11 + fmov.s @r0+, fr12 + fmov.s @r0+, fr13 + fmov.s @r0+, fr14 + fmov.s @r0+, fr15 + frchg + fmov.s @r0+, fr0 + fmov.s @r0+, fr1 + fmov.s @r0+, fr2 + fmov.s @r0+, fr3 + fmov.s @r0+, fr4 + fmov.s @r0+, fr5 + fmov.s @r0+, fr6 + fmov.s @r0+, fr7 + fmov.s @r0+, fr8 + fmov.s @r0+, fr9 + fmov.s @r0+, fr10 + fmov.s @r0+, fr11 + fmov.s @r0+, fr12 + fmov.s @r0+, fr13 + fmov.s @r0+, fr14 + fmov.s @r0+, fr15 + frchg + lds.l @r0+, fpscr + lds.l @r0+, fpul + + mov r8, r0 + add #(oPC), r0 + mov.l @r0+, r2 + lds.l @r0+, pr + + /* Restore T frag. */ + mov.l @r0+, r1 + shlr r1 + /* Skip GBR which is used for thread pointer. */ + add #4, r0 + + lds.l @r0+, mach + lds.l @r0+, macl + + mov r8, r0 + add #(oR9), r0 + mov.l @r0+, r9 + mov.l @r0+, r10 + mov.l @r0+, r11 + mov.l @r0+, r12 + mov.l @r0+, r13 + mov.l @r0+, r14 + mov.l @r0+, r15 + + mov r8, r0 + mov.l @(oR0,r0), r1 + mov.l r1, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r1, 0) + mov.l r2, @-r15 + cfi_adjust_cfa_offset(4) + cfi_rel_offset (r2, 0) + + mov.l @(oR1,r0), r1 + mov.l @(oR2,r0), r2 + mov.l @(oR3,r0), r3 + mov.l @(oR4,r0), r4 + mov.l @(oR5,r0), r5 + mov.l @(oR6,r0), r6 + mov.l @(oR7,r0), r7 + mov.l @(oR8,r0), r8 + mov.l @r15+, r0 + jmp @r0 + mov.l @r15+, r0 + + cfi_endproc +PSEUDO_END(__swapcontext) + +weak_alias (__swapcontext, swapcontext) diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sh4/sys/ucontext.h index 78729c48f9..cd831a7a21 100644 --- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/sh/sh4/sys/ucontext.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2000, 2001, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -87,13 +87,19 @@ typedef freg_t fpregset_t[NFPREG]; /* Context to describe whole processor state. */ typedef struct { + unsigned int oldmask; gregset_t gregs; + unsigned int pc; + unsigned int pr; + unsigned int sr; + unsigned int gbr; + unsigned int mach; + unsigned int macl; fpregset_t fpregs; fpregset_t xfpregs; unsigned int fpscr; unsigned int fpul; - unsigned int macl; - unsigned int mach; + unsigned int ownedfp; } mcontext_t; /* Userlevel context. */ diff --git a/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.h b/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.h new file mode 100644 index 0000000000..88f774f0ad --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.h @@ -0,0 +1,149 @@ +/* Offsets and other constants needed in the *context() function + implementation. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define SIG_BLOCK 0 +#define SIG_SETMASK 2 + +/* Offsets of the fields in the ucontext_t structure. */ +#define oLINK 4 +#define oSS_SP 8 +#define oSS_SIZE 16 +#define oR0 24 +#define oR1 28 +#define oR2 32 +#define oR3 36 +#define oR4 40 +#define oR5 44 +#define oR6 48 +#define oR7 52 +#define oR8 56 +#define oR9 60 +#define oR10 64 +#define oR11 68 +#define oR12 72 +#define oR13 76 +#define oR14 80 +#define oR15 84 +#define oPC 88 +#define oPR 92 +#define oSR 96 +#define oGBR 100 +#define oMACH 104 +#define oMACL 108 +#define oFR0 112 +#define oFR1 116 +#define oFR2 120 +#define oFR3 124 +#define oFR4 128 +#define oFR5 132 +#define oFR6 136 +#define oFR7 140 +#define oFR8 144 +#define oFR9 148 +#define oFR10 152 +#define oFR11 156 +#define oFR12 160 +#define oFR13 164 +#define oFR14 168 +#define oFR15 172 +#define oXFR0 176 +#define oXFR1 180 +#define oXFR2 184 +#define oXFR3 188 +#define oXFR4 192 +#define oXFR5 196 +#define oXFR6 200 +#define oXFR7 204 +#define oXFR8 208 +#define oXFR9 212 +#define oXFR10 216 +#define oXFR11 220 +#define oXFR12 224 +#define oXFR13 228 +#define oXFR14 232 +#define oXFR15 236 +#define oFPSCR 240 +#define oFPUL 244 +#define oOWNEDFP 248 +#define oSIGMASK 252 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_link, oLINK); \ + TEST (uc_stack.ss_sp, oSS_SP); \ + TEST (uc_stack.ss_size, oSS_SIZE); \ + TEST (uc_mcontext.gregs[R0], oR0); \ + TEST (uc_mcontext.gregs[R1], oR1); \ + TEST (uc_mcontext.gregs[R2], oR2); \ + TEST (uc_mcontext.gregs[R3], oR3); \ + TEST (uc_mcontext.gregs[R4], oR4); \ + TEST (uc_mcontext.gregs[R5], oR5); \ + TEST (uc_mcontext.gregs[R6], oR6); \ + TEST (uc_mcontext.gregs[R7], oR7); \ + TEST (uc_mcontext.gregs[R8], oR8); \ + TEST (uc_mcontext.gregs[R9], oR9); \ + TEST (uc_mcontext.gregs[R10], oR10); \ + TEST (uc_mcontext.gregs[R11], oR11); \ + TEST (uc_mcontext.gregs[R12], oR12); \ + TEST (uc_mcontext.gregs[R13], oR13); \ + TEST (uc_mcontext.gregs[R14], oR14); \ + TEST (uc_mcontext.gregs[R15], oR15); \ + TEST (uc_mcontext.pc, oPC); \ + TEST (uc_mcontext.pr, oPR); \ + TEST (uc_mcontext.sr, oSR); \ + TEST (uc_mcontext.gbr, oGBR); \ + TEST (uc_mcontext.mach, oMACH); \ + TEST (uc_mcontext.macl, oMACL); \ + TEST (uc_mcontext.fpregs[0], oFR0); \ + TEST (uc_mcontext.fpregs[1], oFR1); \ + TEST (uc_mcontext.fpregs[2], oFR2); \ + TEST (uc_mcontext.fpregs[3], oFR3); \ + TEST (uc_mcontext.fpregs[4], oFR4); \ + TEST (uc_mcontext.fpregs[5], oFR5); \ + TEST (uc_mcontext.fpregs[6], oFR6); \ + TEST (uc_mcontext.fpregs[7], oFR7); \ + TEST (uc_mcontext.fpregs[8], oFR8); \ + TEST (uc_mcontext.fpregs[9], oFR9); \ + TEST (uc_mcontext.fpregs[10], oFR10); \ + TEST (uc_mcontext.fpregs[11], oFR11); \ + TEST (uc_mcontext.fpregs[12], oFR12); \ + TEST (uc_mcontext.fpregs[13], oFR13); \ + TEST (uc_mcontext.fpregs[14], oFR14); \ + TEST (uc_mcontext.fpregs[15], oFR15); \ + TEST (uc_mcontext.xfpregs[0], oXFR0); \ + TEST (uc_mcontext.xfpregs[1], oXFR1); \ + TEST (uc_mcontext.xfpregs[2], oXFR2); \ + TEST (uc_mcontext.xfpregs[3], oXFR3); \ + TEST (uc_mcontext.xfpregs[4], oXFR4); \ + TEST (uc_mcontext.xfpregs[5], oXFR5); \ + TEST (uc_mcontext.xfpregs[6], oXFR6); \ + TEST (uc_mcontext.xfpregs[7], oXFR7); \ + TEST (uc_mcontext.xfpregs[8], oXFR8); \ + TEST (uc_mcontext.xfpregs[9], oXFR9); \ + TEST (uc_mcontext.xfpregs[10], oXFR10); \ + TEST (uc_mcontext.xfpregs[11], oXFR11); \ + TEST (uc_mcontext.xfpregs[12], oXFR12); \ + TEST (uc_mcontext.xfpregs[13], oXFR13); \ + TEST (uc_mcontext.xfpregs[14], oXFR14); \ + TEST (uc_mcontext.xfpregs[15], oXFR15); \ + TEST (uc_mcontext.fpscr, oFPSCR); \ + TEST (uc_mcontext.fpul, oFPUL); \ + TEST (uc_mcontext.ownedfp, oOWNEDFP); \ + TEST (uc_sigmask, oSIGMASK); diff --git a/sysdeps/unix/sysv/linux/sparc/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/bits/mman.h index 410a38e8a5..26425876ff 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/mman.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/mman.h @@ -80,6 +80,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 3dc8c5ec48..d5c3e650bc 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -40,7 +40,7 @@ mlock - mlock i:bn mlock mlockall - mlockall i:i mlockall mmap - mmap b:aniiii __mmap mmap mount EXTRA mount i:sssip __mount mount -mremap EXTRA mremap b:aini __mremap mremap +mremap EXTRA mremap b:ainip __mremap mremap munlock - munlock i:ai munlock munlockall - munlockall i: munlockall nanosleep - nanosleep Ci:pp __libc_nanosleep __nanosleep nanosleep diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h index a7bac26935..cc6be43a1c 100644 --- a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h +++ b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/x86_64 version. - Copyright (C) 2001, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -79,6 +79,7 @@ /* Flags for `mremap'. */ #ifdef __USE_GNU # define MREMAP_MAYMOVE 1 +# define MREMAP_FIXED 2 #endif /* Advice to `madvise'. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.h b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.h index 5451a308ee..e5099084cf 100644 --- a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.h @@ -1,6 +1,6 @@ /* Offsets and other constants needed in the *context() function implementation for Linux/x86-64. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -41,7 +41,29 @@ #define oRAX 144 #define oRCX 152 #define oRIP 168 -#define oFPREGS 208 -#define oSIGMASK 280 -#define oFPREGSMEM 408 -#define oMXCSR 432 +#define oFPREGS 224 +#define oSIGMASK 296 +#define oFPREGSMEM 424 +#define oMXCSR 448 + +/* Tests run in stdlib/tst-ucontext-off. */ +#define TESTS \ + TEST (uc_mcontext.gregs[REG_RBP], oRBP); \ + TEST (uc_mcontext.gregs[REG_RSP], oRSP); \ + TEST (uc_mcontext.gregs[REG_RBX], oRBX); \ + TEST (uc_mcontext.gregs[REG_R8], oR8); \ + TEST (uc_mcontext.gregs[REG_R9], oR9); \ + TEST (uc_mcontext.gregs[REG_R12], oR12); \ + TEST (uc_mcontext.gregs[REG_R13], oR13); \ + TEST (uc_mcontext.gregs[REG_R14], oR14); \ + TEST (uc_mcontext.gregs[REG_R15], oR15); \ + TEST (uc_mcontext.gregs[REG_RDI], oRDI); \ + TEST (uc_mcontext.gregs[REG_RSI], oRSI); \ + TEST (uc_mcontext.gregs[REG_RDX], oRDX); \ + TEST (uc_mcontext.gregs[REG_RAX], oRAX); \ + TEST (uc_mcontext.gregs[REG_RCX], oRCX); \ + TEST (uc_mcontext.gregs[REG_RIP], oRIP); \ + TEST (uc_mcontext.fpregs, oFPREGS); \ + TEST (uc_sigmask, oSIGMASK); \ + TEST (__fpregs_mem, oFPREGSMEM); \ + TEST (__fpregs_mem.mxcsr, oMXCSR); |