diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-11-26 12:02:23 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-11-26 12:02:23 +0000 |
commit | cb0509a8d5a3569117babe0a24dc4946cf6c06c1 (patch) | |
tree | 85cc83f80f4dff0f7a7b2580865f6341ad3e79ae /sysdeps | |
parent | 0155a7737f5653e07015421b962b70fd8831c4ad (diff) | |
download | glibc-cb0509a8d5a3569117babe0a24dc4946cf6c06c1.tar.gz glibc-cb0509a8d5a3569117babe0a24dc4946cf6c06c1.tar.xz glibc-cb0509a8d5a3569117babe0a24dc4946cf6c06c1.zip |
Update.
1998-11-26 Ulrich Drepper <drepper@cygnus.com> * sysdeps/mips/dl-machine.h (ELF_MACHINE_NO_PLT): New defined macro. (elf_machine_got_rel): Remove scope variable. Use scope from the map. Don't modify _dl_global_scope_end in the end. (__dl_runtime_resolv): Also use scope from the map. * sysdeps/mips/mips64/dl-machine.h: Likewise. * elf/dl-runtime.c: Don't define fixup and profile_fixup if ELF_MACHINE_NO_PLT is defined. * sysdeps/mips/sys/ucontext.h: New file. Patches by kaz Kojima <kkojima@rr.iij4u.or.jp>. 1998-11-26 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/generic/pselect.c (__pselect): Change interface, set/restore sigmask. * misc/sys/select.h: Change declaration according to Stevens' Unix Network Programming. * include/sys/select.h (__pselect): Likewise. Reported by <bwelling@anomaly.munge.com> [PR libc/872]. * include/fpu_control.h: New file, contains __setfpucw declaration. * sysdeps/generic/fpu_control.h: Remove __setfpucw declaration, it's an internal symbol. * sysdeps/alpha/fpu/fpu_control.h: Likewise. * sysdeps/arm/fpu/fpu_control.h: Likewise. * sysdeps/i386/fpu_control.h: Likewise. * sysdeps/m68k/fpu_control.h: Likewise. * sysdeps/powerpc/fpu_control.h: Likewise. * sysdeps/sparc/sparc32/fpu/fpu_control.h: Likewise. * sysdeps/sparc/sparc64/fpu/fpu_control.h: Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/alpha/fpu/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/arm/fpu/fpu_control.h | 7 | ||||
-rw-r--r-- | sysdeps/generic/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/generic/pselect.c | 24 | ||||
-rw-r--r-- | sysdeps/i386/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/m68k/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/mips/dl-machine.h | 17 | ||||
-rw-r--r-- | sysdeps/mips/mips64/dl-machine.h | 17 | ||||
-rw-r--r-- | sysdeps/mips/sys/ucontext.h | 144 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/fpu_control.h | 9 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/fpu_control.h | 9 |
12 files changed, 177 insertions, 95 deletions
diff --git a/sysdeps/alpha/fpu/fpu_control.h b/sysdeps/alpha/fpu/fpu_control.h index bcf73e857e..dfca373c3d 100644 --- a/sysdeps/alpha/fpu/fpu_control.h +++ b/sysdeps/alpha/fpu/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word bits. Alpha-maped-to-Intel version. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Olaf Flebbe. @@ -103,11 +103,4 @@ typedef unsigned int fpu_control_t; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* called by start.o. It can be used to manipulate fpu control word. */ -extern void __setfpucw __P ((unsigned short)); - -__END_DECLS - #endif /* _ALPHA_FPU_CONTROL */ diff --git a/sysdeps/arm/fpu/fpu_control.h b/sysdeps/arm/fpu/fpu_control.h index 8a2d338c49..27b8dda972 100644 --- a/sysdeps/arm/fpu/fpu_control.h +++ b/sysdeps/arm/fpu/fpu_control.h @@ -83,11 +83,4 @@ typedef unsigned int fpu_control_t; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* _FPU_CONTROL_H */ diff --git a/sysdeps/generic/fpu_control.h b/sysdeps/generic/fpu_control.h index 4d3d978426..8d50901300 100644 --- a/sysdeps/generic/fpu_control.h +++ b/sysdeps/generic/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word definitions. Stub version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 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 @@ -36,11 +36,4 @@ typedef unsigned int fpu_control_t; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* _FPU_CONTROL_H */ diff --git a/sysdeps/generic/pselect.c b/sysdeps/generic/pselect.c index 3a93f997f5..dab4d754f2 100644 --- a/sysdeps/generic/pselect.c +++ b/sysdeps/generic/pselect.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -18,24 +18,28 @@ Boston, MA 02111-1307, USA. */ #include <errno.h> +#include <signal.h> #include <sys/time.h> #include <sys/select.h> /* Check the first NFDS descriptors each in READFDS (if not NULL) for read readiness, in WRITEFDS (if not NULL) for write readiness, and in EXCEPTFDS (if not NULL) for exceptional conditions. If TIMEOUT is not NULL, time out - after waiting the interval specified therein. Returns the number of ready - descriptors, or -1 for errors. */ + after waiting the interval specified therein. Additionally set the sigmask + SIGMASK for this call. Returns the number of ready descriptors, or -1 for + errors. */ int -__pselect (nfds, readfds, writefds, exceptfds, timeout) +__pselect (nfds, readfds, writefds, exceptfds, timeout, sigmask) int nfds; fd_set *readfds; fd_set *writefds; fd_set *exceptfds; - struct timespec *timeout; + const struct timespec *timeout; + const sigset_t *sigmask; { struct timeval tval; int retval; + sigset_t savemask; /* Change nanosecond number to microseconds. This may loose precision and therefore the `pselect` should be available. But @@ -43,13 +47,13 @@ __pselect (nfds, readfds, writefds, exceptfds, timeout) if (timeout != NULL) TIMESPEC_TO_TIMEVAL (&tval, timeout); + /* The setting and restoring of the signal mask and the select call + should be an atomic operation. This can't be done without kernel + help. */ + __sigprocmask (SIG_SETMASK, sigmask, &savemask); retval = __select (nfds, readfds, writefds, exceptfds, timeout != NULL ? &tval : NULL); - - /* Change the result back. The remaining time must be made - available to the caller. */ - if (timeout != NULL) - TIMEVAL_TO_TIMESPEC (&tval, timeout); + __sigprocmask (SIG_SETMASK, &savemask, NULL); return retval; } diff --git a/sysdeps/i386/fpu_control.h b/sysdeps/i386/fpu_control.h index 8474f7199b..b957010904 100644 --- a/sysdeps/i386/fpu_control.h +++ b/sysdeps/i386/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word bits. i387 version. - Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Olaf Flebbe. @@ -95,11 +95,4 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* fpu_control.h */ diff --git a/sysdeps/m68k/fpu_control.h b/sysdeps/m68k/fpu_control.h index 12ea1336c3..28405b6a3b 100644 --- a/sysdeps/m68k/fpu_control.h +++ b/sysdeps/m68k/fpu_control.h @@ -1,5 +1,5 @@ /* 68k FPU control word definitions. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 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 @@ -98,11 +98,4 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* _M68K_FPU_CONTROL_H */ diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h index bbd22d8777..5f6e12752e 100644 --- a/sysdeps/mips/dl-machine.h +++ b/sysdeps/mips/dl-machine.h @@ -23,6 +23,8 @@ #define ELF_MACHINE_NAME "MIPS" +#define ELF_MACHINE_NO_PLT + #include <assert.h> #include <entry.h> @@ -142,7 +144,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) ElfW(Addr) *got; ElfW(Sym) *sym; int i, n; - struct link_map **scope; const char *strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); @@ -150,7 +151,8 @@ elf_machine_got_rel (struct link_map *map, int lazy) ({ \ const ElfW(Sym) *ref = sym; \ ElfW(Addr) sym_loadaddr; \ - sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, scope, \ + sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, \ + map->l_scope, \ map->l_name, ELF_MACHINE_RELOC_NOPLT);\ (ref)? sym_loadaddr + ref->st_value: 0; \ }) @@ -166,9 +168,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) while (i < n) got[i++] += map->l_addr; - /* Set scope. */ - scope = _dl_object_relocation_scope (map); - /* Handle global got entries. */ got += n; sym = (ElfW(Sym) *) ((void *) map->l_addr @@ -210,7 +209,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) } #undef RESOLVE_GOTSYM - *_dl_global_scope_end = NULL; return; } @@ -362,16 +360,13 @@ __dl_runtime_resolve (ElfW(Word) sym_index, \ const ElfW(Sym) *definer; \ ElfW(Addr) loadbase; \ ElfW(Addr) funcaddr; \ - struct link_map **scope; \ \ /* Look up the symbol's run-time value. */ \ - scope = _dl_object_relocation_scope (l); \ definer = &symtab[sym_index]; \ \ loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \ - scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \ - \ - *_dl_global_scope_end = NULL; \ + l->l_scope, l->l_name, \ + ELF_MACHINE_RELOC_NOPLT); \ \ /* Apply the relocation with that value. */ \ funcaddr = loadbase + definer->st_value; \ diff --git a/sysdeps/mips/mips64/dl-machine.h b/sysdeps/mips/mips64/dl-machine.h index 76981a6a9b..1045da15b6 100644 --- a/sysdeps/mips/mips64/dl-machine.h +++ b/sysdeps/mips/mips64/dl-machine.h @@ -23,6 +23,8 @@ #define ELF_MACHINE_NAME "MIPS" +#define ELF_MACHINE_NO_PLT + #include <assert.h> #include <entry.h> @@ -142,7 +144,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) ElfW(Addr) *got; ElfW(Sym) *sym; int i, n; - struct link_map **scope; const char *strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); @@ -150,7 +151,8 @@ elf_machine_got_rel (struct link_map *map, int lazy) ({ \ const ElfW(Sym) *ref = sym; \ ElfW(Addr) sym_loadaddr; \ - sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, scope, \ + sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, \ + map->l_scope, \ map->l_name, ELF_MACHINE_RELOC_NOPLT);\ (ref)? sym_loadaddr + ref->st_value: 0; \ }) @@ -166,9 +168,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) while (i < n) got[i++] += map->l_addr; - /* Set scope. */ - scope = _dl_object_relocation_scope (map); - /* Handle global got entries. */ got += n; sym = (ElfW(Sym) *) ((void *) map->l_addr @@ -210,7 +209,6 @@ elf_machine_got_rel (struct link_map *map, int lazy) } #undef RESOLVE_GOTSYM - *_dl_global_scope_end = NULL; return; } @@ -362,16 +360,13 @@ __dl_runtime_resolve (ElfW(Word) sym_index, \ const ElfW(Sym) *definer; \ ElfW(Addr) loadbase; \ ElfW(Addr) funcaddr; \ - struct link_map **scope; \ \ /* Look up the symbol's run-time value. */ \ - scope = _dl_object_relocation_scope (l); \ definer = &symtab[sym_index]; \ \ loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \ - scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \ - \ - *_dl_global_scope_end = NULL; \ + l->l_scope, l->l_name, \ + ELF_MACHINE_RELOC_NOPLT); \ \ /* Apply the relocation with that value. */ \ funcaddr = loadbase + definer->st_value; \ diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h new file mode 100644 index 0000000000..f177cad121 --- /dev/null +++ b/sysdeps/mips/sys/ucontext.h @@ -0,0 +1,144 @@ +/* Copyright (C) 1998 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* System V/mips ABI compliant context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +/* Type for general register. */ +typedef unsigned int greg_t; + +/* Number of general registers. */ +#define NGREG 36 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + CTX_R0 = 0, +#define CTX_R0 CTX_R0 + CTX_AT = 1, +#define CTX_AT CTX_AT + CTX_V0 = 2, +#define CTX_V0 CTX_V0 + CTX_V1 = 3, +#define CTX_V1 CTX_V1 + CTX_A0 = 4, +#define CTX_A0 CTX_A0 + CTX_A1 = 5, +#define CTX_A1 CTX_A1 + CTX_A2 = 6, +#define CTX_A2 CTX_A2 + CTX_A3 = 7, +#define CTX_A3 CTX_A3 + CTX_T0 = 8, +#define CTX_T0 CTX_T0 + CTX_T1 = 9, +#define CTX_T1 CTX_T1 + CTX_T2 = 10, +#define CTX_T2 CTX_T2 + CTX_T3 = 11, +#define CTX_T3 CTX_T3 + CTX_T4 = 12, +#define CTX_T4 CTX_T4 + CTX_T5 = 13, +#define CTX_T5 CTX_T5 + CTX_T6 = 14, +#define CTX_T6 CTX_T6 + CTX_T7 = 15, +#define CTX_T7 CTX_T7 + CTX_S0 = 16, +#define CTX_S0 CTX_S0 + CTX_S1 = 17, +#define CTX_S1 CTX_S1 + CTX_S2 = 18, +#define CTX_S2 CTX_S2 + CTX_S3 = 19, +#define CTX_S3 CTX_S3 + CTX_S4 = 20, +#define CTX_S4 CTX_S4 + CTX_S5 = 21, +#define CTX_S5 CTX_S5 + CTX_S6 = 22, +#define CTX_S6 CTX_S6 + CTX_S7 = 23, +#define CTX_S7 CTX_S7 + CTX_T8 = 24, +#define CTX_T8 CTX_T8 + CTX_T9 = 25, +#define CTX_T9 CTX_T9 + CTX_K0 = 26, +#define CTX_K0 CTX_K0 + CTX_K1 = 27, +#define CTX_K1 CTX_K1 + CTX_GP = 28, +#define CTX_GP CTX_GP + CTX_SP = 29, +#define CTX_SP CTX_SP + CTX_S8 = 30, +#define CTX_S8 CTX_S8 + CTX_RA = 31, +#define CTX_RA CTX_RA + CTX_MDLO = 32, +#define CTX_MDLO CTX_MDLO + CTX_MDHI = 33, +#define CTX_MDHI CTX_MDHI + CTX_CAUSE = 34, +#define CTX_CAUSE CTX_CAUSE + CTX_EPC = 35, +#define CTX_EPC CTX_EPC +}; + +/* Structure to describe FPU registers. */ +typedef struct fpregset +{ + union + { + double fp_dregs[16]; + float fp_fregs[32]; + unsigned int fp_regs[32]; + } fp_r; + unsigned int fp_csr; + unsigned int fp_pad; +} fpregset_t; + +/* Context to describe whole processor state. */ +typedef struct +{ + gregset_t gpregs; + fpregset_t fpregs; +} mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext +{ + unsigned long int uc_flags; + struct ucontext *uc_links; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[48]; +} ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/sysdeps/powerpc/fpu_control.h b/sysdeps/powerpc/fpu_control.h index c4c478672b..ed54ecba99 100644 --- a/sysdeps/powerpc/fpu_control.h +++ b/sysdeps/powerpc/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word definitions. PowerPC version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 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 @@ -64,11 +64,4 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* _FPU_CONTROL_H */ diff --git a/sysdeps/sparc/sparc32/fpu/fpu_control.h b/sysdeps/sparc/sparc32/fpu/fpu_control.h index c069318970..127f13b54c 100644 --- a/sysdeps/sparc/sparc32/fpu/fpu_control.h +++ b/sysdeps/sparc/sparc32/fpu/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word bits. SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Miguel de Icaza @@ -57,11 +57,4 @@ typedef unsigned int fpu_control_t; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* fpu_control.h */ diff --git a/sysdeps/sparc/sparc64/fpu/fpu_control.h b/sysdeps/sparc/sparc64/fpu/fpu_control.h index bedc034eaa..82571fc7a7 100644 --- a/sysdeps/sparc/sparc64/fpu/fpu_control.h +++ b/sysdeps/sparc/sparc64/fpu/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word bits. SPARC v9 version. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Miguel de Icaza @@ -57,11 +57,4 @@ typedef unsigned long fpu_control_t; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - #endif /* fpu_control.h */ |