summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog35
-rw-r--r--FAQ.in30
-rw-r--r--README4
-rw-r--r--elf/dl-runtime.c13
-rw-r--r--include/fpu_control.h4
-rw-r--r--include/sys/select.h3
-rw-r--r--misc/sys/select.h9
-rw-r--r--sysdeps/alpha/fpu/fpu_control.h9
-rw-r--r--sysdeps/arm/fpu/fpu_control.h7
-rw-r--r--sysdeps/generic/fpu_control.h9
-rw-r--r--sysdeps/generic/pselect.c24
-rw-r--r--sysdeps/i386/fpu_control.h9
-rw-r--r--sysdeps/m68k/fpu_control.h9
-rw-r--r--sysdeps/mips/dl-machine.h17
-rw-r--r--sysdeps/mips/mips64/dl-machine.h17
-rw-r--r--sysdeps/mips/sys/ucontext.h144
-rw-r--r--sysdeps/powerpc/fpu_control.h9
-rw-r--r--sysdeps/sparc/sparc32/fpu/fpu_control.h9
-rw-r--r--sysdeps/sparc/sparc64/fpu/fpu_control.h9
19 files changed, 260 insertions, 110 deletions
diff --git a/ChangeLog b/ChangeLog
index 99c6b99fab..5892595810 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+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. 
+ 
 1998-11-25  Ulrich Drepper  <drepper@cygnus.com>
 
 	* version.h (VERSION): Bump to 2.0.104.
diff --git a/FAQ.in b/FAQ.in
index 0da19611cc..e2b5b9f06f 100644
--- a/FAQ.in
+++ b/FAQ.in
@@ -33,6 +33,7 @@ in the future, are:
 	sparc-*-linux-gnu	Linux-2.x on SPARC
 	sparc64-*-linux-gnu	Linux-2.x on UltraSPARC
 	arm-*-none		ARM standalone systems
+	arm-*-linux		Linux-2.x on ARM
 	arm-*-linuxaout		Linux-2.x on ARM using a.out binaries
 
 Ports to other Linux platforms are in development, and may in fact work
@@ -60,7 +61,7 @@ a local mirror first.
 You should always try to use the latest official release.  Older versions
 may not have all the features GNU libc requires.  The current releases of
 egcs (1.0.3 and 1.1) and GNU CC (2.8.1) should work with the GNU C library
-(for powerpc see question ?powerpc).
+(for powerpc see question ?powerpc; for ARM see question ?arm).
 
 {ZW} You may have problems if you try to mix code compiled with
 EGCS and with GCC 2.8.1. See ?exception for details.
@@ -105,6 +106,16 @@ variables.  There is a temporary patch at:
 
 Later versions of egcs may fix this problem.
 
+??arm	Which tools should I use for ARM?
+
+{PB} You should use egcs 1.1 or a later version.  For ELF systems some
+changes are needed to the compiler; a patch against egcs-1.1.x can be found
+at:
+
+<ftp://ftp.netwinder.org/users/p/philb/egcs-1.1.1pre2-diff-981126>
+
+Binutils 2.9.1.0.16 or later is also required.
+
 ??	Do I need some more things to compile the GNU C Library?
 
 {UD} Yes, there are some more :-).
@@ -1146,9 +1157,20 @@ from your favorite mirror of ftp.gnu.org.
 where the headers are stable.  There are still lots of incompatible changes
 made and the libc headers have to follow.
 
-Also, make sure you have a suitably recent kernel.  As of the 970401
-snapshot, according to Philip Blundell <Philip.Blundell@pobox.com>, the
-required kernel version is at least 2.1.30.
+{PB} The 2.1 release of GNU libc aims to comply with the current versions of
+all the relevant standards.  The IPv6 support libraries for older Linux
+systems used a different naming convention and so code written to work with
+them may need to be modified.  If the standards make incompatible changes in
+the future then the libc may need to change again.
+
+IPv6 will not work with a 2.0.x kernel.  When kernel 2.2 is released it
+should contain all the necessary support; until then you should use the
+latest 2.1.x release you can find.  As of 98/11/26 the currently recommended 
+kernel for IPv6 is 2.1.129.
+
+Also, as of the 2.1 release the IPv6 API provided by GNU libc is not
+100% complete.  In particular the getipnodebyname and getipnodebyaddr
+functions are not implemented.
 
 ??	When I set the timezone by setting the TZ environment variable
 	to EST5EDT things go wrong since glibc computes the wrong time
diff --git a/README b/README
index d9e19336bb..f330c66ade 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory contains the version 2.0.103 test release of the GNU C Library.
+This directory contains the version 2.0.104 test release of the GNU C Library.
 Many bugs have been fixed since the last release.
 Some bugs surely remain.
 
@@ -53,7 +53,7 @@ provides the Unix `crypt' function, plus some other entry points.
 Because of the United States export restriction on DES implementations,
 we are distributing this code separately from the rest of the C
 library.  There is an extra distribution tar file just for crypt; it is
-called `glibc-crypt-2.0.103.tar.gz'.  You can just unpack the crypt
+called `glibc-crypt-2.0.104.tar.gz'.  You can just unpack the crypt
 distribution along with the rest of the C library and build; you can
 also build the library without getting crypt.  Users outside the USA
 can get the crypt distribution via anonymous FTP from ftp.ifi.uio.no
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index 38ecf96525..91700c2764 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -39,11 +39,12 @@
    to that address.  Future calls will bounce directly from the PLT to the
    function.  */
 
+#ifndef ELF_MACHINE_NO_PLT
 static ElfW(Addr) __attribute__ ((unused))
 fixup (
-#ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
-       ELF_MACHINE_RUNTIME_FIXUP_ARGS,
-#endif
+# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+# endif
        struct link_map *l, ElfW(Word) reloc_offset)
 {
   const ElfW(Sym) *const symtab
@@ -96,9 +97,9 @@ fixup (
 
   return value;
 }
+#endif
 
-
-#ifndef PROF
+#if !defined PROF && !defined ELF_MACHINE_NO_PLT
 
 static ElfW(Addr) __attribute__ ((unused))
 profile_fixup (
@@ -172,7 +173,7 @@ profile_fixup (
   return value;
 }
 
-#endif /* PROF */
+#endif /* PROF && ELF_MACHINE_NO_PLT */
 
 
 /* This macro is defined in dl-machine.h to define the entry point called
diff --git a/include/fpu_control.h b/include/fpu_control.h
new file mode 100644
index 0000000000..a0a4febf9e
--- /dev/null
+++ b/include/fpu_control.h
@@ -0,0 +1,4 @@
+#include_next <fpu_control.h>
+
+/* Called at startup.  It can be used to manipulate fpu control register.  */
+extern void __setfpucw __P ((fpu_control_t));
diff --git a/include/sys/select.h b/include/sys/select.h
index be98aa2eb4..5c722e9df6 100644
--- a/include/sys/select.h
+++ b/include/sys/select.h
@@ -4,5 +4,6 @@
 /* Now define the internal interfaces.  */
 extern int __pselect __P ((int __nfds, __fd_set *__readfds,
 			   __fd_set *__writefds, __fd_set *__exceptfds,
-			   struct timespec *__timeout));
+			   const struct timespec *__timeout,
+			   const __sigset_t *__sigmask));
 #endif
diff --git a/misc/sys/select.h b/misc/sys/select.h
index 179e1ec59f..0972560b97 100644
--- a/misc/sys/select.h
+++ b/misc/sys/select.h
@@ -30,6 +30,9 @@
 /* Get __FD_* definitions.  */
 #include <bits/select.h>
 
+/* Get __sigset_t.  */
+#include <bits/sigset.h>
+
 /* Get definition of timer specification structures.  */
 #define __need_timespec
 #include <time.h>
@@ -79,10 +82,12 @@ extern int select __P ((int __nfds, __fd_set *__readfds,
 /* XXX Once/if POSIX.1g gets official this prototype will be available
    when defining __USE_POSIX.  */
 /* Same as above only that the TIMEOUT value is given with higher
-   resolution.  This version should be used.  */
+   resolution and a sigmask which is been set temporarily.  This version
+   should be used.  */
 extern int pselect __P ((int __nfds, __fd_set *__readfds,
 			 __fd_set *__writefds, __fd_set *__exceptfds,
-			 struct timespec *__timeout));
+			 const struct timespec *__timeout,
+			 const __sigset_t *__sigmask));
 #endif
 
 __END_DECLS
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 */