diff --git a/NEWS b/NEWS
index b88a34c718..71a9ad6053 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,10 @@ Version 2.26
   transliteration tables are all updated to Unicode 9.0.0, using
   generator scripts contributed by Mike FABIAN (Red Hat).
 
+* errno.h is now safe to use from C-preprocessed assembly language on all
+  supported operating systems.  In this context, it will only define the
+  Exxxx constants, as preprocessor macros expanding to integer literals.
+
 * The rpcgen, librpcsvc and related headers will only be built and
   installed when glibc is configured with --enable-obsolete-rpc.
   This allows alternative RPC implementations, like TIRPC, to be used
diff --git a/argp/argp.h b/argp/argp.h
index 86b8e5a1e9..08b48e1cf1 100644
--- a/argp/argp.h
+++ b/argp/argp.h
@@ -24,17 +24,17 @@
 #include <ctype.h>
 #include <getopt.h>
 #include <limits.h>
-
-#define __need_error_t
 #include <errno.h>
-
-#ifndef __error_t_defined
-typedef int error_t;
-# define __error_t_defined
-#endif
 
 __BEGIN_DECLS
 
+/* error_t may or may not be available from errno.h, depending on the
+   operating system.  */
+#ifndef __error_t_defined
+# define __error_t_defined 1
+typedef int error_t;
+#endif
+
 /* A description of a particular option.  A pointer to an array of
    these is passed in the OPTIONS field of an argp structure.  Each option
    entry can correspond to one long option and/or one short option; more
diff --git a/bits/errno.h b/bits/errno.h
index cd4fcfa428..0336a50bb7 100644
--- a/bits/errno.h
+++ b/bits/errno.h
@@ -15,20 +15,34 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* This file defines the `errno' constants.  */
+/* This file defines the errno constants.  */
 
-#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath)
-#undef	__need_Emath
-#define	__Emath_defined	1
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
 
-# define EDOM	XXX	<--- fill in what is actually needed
-# define EILSEQ	XXX	<--- fill in what is actually needed
-# define ERANGE	XXX	<--- fill in what is actually needed
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#ifdef	_ERRNO_H
-# error "Define here all the missing error messages for the port.  These"
-# error "must match the numbers of the kernel."
-# define Exxxx	XXX
-...
-#endif
+#error "Generic bits/errno.h included -- port is incomplete."
+
+/* Authors of new ports of the GNU C Library must override this file
+   with their own bits/errno.h in an appropriate subdirectory of
+   sysdeps/.  Its function is to define all of the error constants
+   from C2011 and POSIX.1-2008, with values appropriate to the
+   operating system, and any additional OS-specific error constants.
+
+   C2011 requires all error constants to be object-like macros that
+   expand to "integer constant expressions with type int, positive
+   values, and suitable for use in #if directives".  Moreover, all
+   of their names must begin with a capital E, followed immediately
+   by either another capital letter, or a digit.
+
+   errno.h is sometimes included from assembly language.
+   When __ASSEMBLER__ is defined, bits/errno.h may only define macros;
+   it may not make any other kind of C declaration or definition.
+
+   It is OK to define macros that are not E-constants, but only in the
+   implementation namespace.  */
+
+#endif /* bits/errno.h.  */
diff --git a/include/errno.h b/include/errno.h
index f140631b31..3c3d2288c8 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -1,8 +1,6 @@
 #ifndef _ERRNO_H
-
 #include <stdlib/errno.h>
-
-#if defined _ERRNO_H && !defined _ISOMAC
+#if !defined _ISOMAC && !defined __ASSEMBLER__
 
 # if IS_IN (rtld)
 #  include <dl-sysdep.h>
@@ -38,15 +36,12 @@ extern __thread int errno attribute_tls_model_ie;
 
 # define __set_errno(val) (errno = (val))
 
-# ifndef __ASSEMBLER__
 extern int *__errno_location (void) __THROW __attribute_const__
 #  if RTLD_PRIVATE_ERRNO
      attribute_hidden
 #  endif
 ;
 libc_hidden_proto (__errno_location)
-# endif
 
-#endif /* _ERRNO_H */
-
-#endif /* ! _ERRNO_H */
+#endif /* !_ISOMAC && !__ASSEMBLER__ */
+#endif /* !_ERRNO_H */
diff --git a/stdlib/errno.h b/stdlib/errno.h
index c42514b448..118525c8fd 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -20,53 +20,41 @@
  */
 
 #ifndef	_ERRNO_H
+#define	_ERRNO_H 1
 
-/* The includer defined __need_Emath if he wants only the definitions
-   of EDOM and ERANGE, and not everything else.  */
-#ifndef	__need_Emath
-# define _ERRNO_H	1
 # include <features.h>
-#endif
+
+/* The system-specific definitions of the E* constants, as macros.  */
+# include <bits/errno.h>
+
+/* When included from assembly language, this header only provides the
+   E* constants.  */
+# ifndef __ASSEMBLER__
 
 __BEGIN_DECLS
 
-/* Get the error number constants from the system-specific file.
-   This file will test __need_Emath and _ERRNO_H.  */
-#include <bits/errno.h>
-#undef	__need_Emath
+/* The error code set by various library functions.  */
+extern int *__errno_location (void) __THROW __attribute_const__;
+#  define errno (*__errno_location ())
 
-#ifdef	_ERRNO_H
-
-/* Declare the `errno' variable, unless it's defined as a macro by
-   bits/errno.h.  This is the case in GNU, where it is a per-thread
-   variable.  This redeclaration using the macro still works, but it
-   will be a function declaration without a prototype and may trigger
-   a -Wstrict-prototypes warning.  */
-#ifndef	errno
-extern int errno;
-#endif
-
-#ifdef __USE_GNU
+#  ifdef __USE_GNU
 
 /* The full and simple forms of the name with which the program was
    invoked.  These variables are set up automatically at startup based on
    the value of argv[0].  */
-extern char *program_invocation_name, *program_invocation_short_name;
-#endif /* __USE_GNU */
-#endif /* _ERRNO_H */
+extern char *program_invocation_name;
+extern char *program_invocation_short_name;
+
+/* bits/errno.h may have defined this type.  If it didn't, provide a
+   fallback definition.  */
+#   ifndef __error_t_defined
+#    define __error_t_defined 1
+typedef int error_t;
+#   endif
+
+#  endif /* __USE_GNU */
 
 __END_DECLS
 
-#endif /* _ERRNO_H */
-
-/* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so
-   that printing `error_t' values in the debugger shows the names.  We
-   might need this definition sometimes even if this file was included
-   before.  */
-#if defined __USE_GNU || defined __need_error_t
-# ifndef __error_t_defined
-typedef int error_t;
-#  define __error_t_defined	1
-# endif
-# undef __need_error_t
-#endif
+# endif /* !__ASSEMBLER__ */
+#endif /* errno.h */
diff --git a/string/argz.h b/string/argz.h
index f9d0ac9950..e07d74208a 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -20,18 +20,18 @@
 #define _ARGZ_H	1
 
 #include <features.h>
-
-#define __need_error_t
 #include <errno.h>
 #include <string.h>		/* Need size_t, and strchr is called below.  */
 
+__BEGIN_DECLS
+
+/* error_t may or may not be available from errno.h, depending on the
+   operating system.  */
 #ifndef __error_t_defined
+# define __error_t_defined 1
 typedef int error_t;
 #endif
 
-
-__BEGIN_DECLS
-
 /* Make a '\0' separated arg vector from a unix argv vector, returning it in
    ARGZ, and the total length in LEN.  If a memory allocation error occurs,
    ENOMEM is returned, otherwise 0.  The result can be destroyed using free. */
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
index f37850d0b3..a5b76e9fb2 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
index f31a925522..1e99ee6416 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
index ee96018061..03b925491e 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index d20ffe654a..8f3c210001 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -1,329 +1,418 @@
-/* This file generated by errnos.awk.  */
+/* This file generated by errnos.awk from
+     errno.texi
+     mach/message.h
+     mach/kern_return.h
+     mach/mig_errors.h
+     device/device_types.h
+   Do not edit this file; edit errnos.awk and regenerate it.  */
 
-/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
-#ifndef _HURD_ERRNO
-#define _HURD_ERRNO(n)	((0x10 << 26) | ((n) & 0x3fff))
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#ifdef _ERRNO_H
+#ifndef __ASSEMBLER__
 
 enum __error_t_codes
 {
-	/* The value zero always means success and it is perfectly fine for
-	   code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).
-	   Having an enum entry for zero both makes the debugger print the name
-	   for error_t-typed zero values, and prevents the compiler from
-	   issuing warnings about 'case 0:' in a switch on an error_t-typed
-	   value.  */
-	ESUCCESS = 0,
+  /* The value zero always means success and it is perfectly fine
+     for code to use 0 explicitly (or implicitly, e.g. via Boolean
+     coercion.)  Having an enum entry for zero both makes the
+     debugger print the name for error_t-typed zero values, and
+     prevents the compiler from issuing warnings about 'case 0:'
+     in a switch on an error_t-typed value.  */
+  ESUCCESS                       = 0,
 
-#undef EDOM
-#undef ERANGE
-	EPERM           = _HURD_ERRNO (1),
-#define	EPERM           _HURD_ERRNO (1) /* Operation not permitted */
-	ENOENT          = _HURD_ERRNO (2),
-#define	ENOENT          _HURD_ERRNO (2) /* No such file or directory */
-	ESRCH           = _HURD_ERRNO (3),
-#define	ESRCH           _HURD_ERRNO (3) /* No such process */
-	EINTR           = _HURD_ERRNO (4),
-#define	EINTR           _HURD_ERRNO (4) /* Interrupted system call */
-	EIO             = _HURD_ERRNO (5),
-#define	EIO             _HURD_ERRNO (5) /* Input/output error */
-	ENXIO           = _HURD_ERRNO (6),
-#define	ENXIO           _HURD_ERRNO (6) /* No such device or address */
-	E2BIG           = _HURD_ERRNO (7),
-#define	E2BIG           _HURD_ERRNO (7) /* Argument list too long */
-	ENOEXEC         = _HURD_ERRNO (8),
-#define	ENOEXEC         _HURD_ERRNO (8) /* Exec format error */
-	EBADF           = _HURD_ERRNO (9),
-#define	EBADF           _HURD_ERRNO (9) /* Bad file descriptor */
-	ECHILD          = _HURD_ERRNO (10),
-#define	ECHILD          _HURD_ERRNO (10)/* No child processes */
-	EDEADLK         = _HURD_ERRNO (11),
-#define	EDEADLK         _HURD_ERRNO (11)/* Resource deadlock avoided */
-	ENOMEM          = _HURD_ERRNO (12),
-#define	ENOMEM          _HURD_ERRNO (12)/* Cannot allocate memory */
-	EACCES          = _HURD_ERRNO (13),
-#define	EACCES          _HURD_ERRNO (13)/* Permission denied */
-	EFAULT          = _HURD_ERRNO (14),
-#define	EFAULT          _HURD_ERRNO (14)/* Bad address */
-	ENOTBLK         = _HURD_ERRNO (15),
-#define	ENOTBLK         _HURD_ERRNO (15)/* Block device required */
-	EBUSY           = _HURD_ERRNO (16),
-#define	EBUSY           _HURD_ERRNO (16)/* Device or resource busy */
-	EEXIST          = _HURD_ERRNO (17),
-#define	EEXIST          _HURD_ERRNO (17)/* File exists */
-	EXDEV           = _HURD_ERRNO (18),
-#define	EXDEV           _HURD_ERRNO (18)/* Invalid cross-device link */
-	ENODEV          = _HURD_ERRNO (19),
-#define	ENODEV          _HURD_ERRNO (19)/* No such device */
-	ENOTDIR         = _HURD_ERRNO (20),
-#define	ENOTDIR         _HURD_ERRNO (20)/* Not a directory */
-	EISDIR          = _HURD_ERRNO (21),
-#define	EISDIR          _HURD_ERRNO (21)/* Is a directory */
-	EINVAL          = _HURD_ERRNO (22),
-#define	EINVAL          _HURD_ERRNO (22)/* Invalid argument */
-	EMFILE          = _HURD_ERRNO (24),
-#define	EMFILE          _HURD_ERRNO (24)/* Too many open files */
-	ENFILE          = _HURD_ERRNO (23),
-#define	ENFILE          _HURD_ERRNO (23)/* Too many open files in system */
-	ENOTTY          = _HURD_ERRNO (25),
-#define	ENOTTY          _HURD_ERRNO (25)/* Inappropriate ioctl for device */
-	ETXTBSY         = _HURD_ERRNO (26),
-#define	ETXTBSY         _HURD_ERRNO (26)/* Text file busy */
-	EFBIG           = _HURD_ERRNO (27),
-#define	EFBIG           _HURD_ERRNO (27)/* File too large */
-	ENOSPC          = _HURD_ERRNO (28),
-#define	ENOSPC          _HURD_ERRNO (28)/* No space left on device */
-	ESPIPE          = _HURD_ERRNO (29),
-#define	ESPIPE          _HURD_ERRNO (29)/* Illegal seek */
-	EROFS           = _HURD_ERRNO (30),
-#define	EROFS           _HURD_ERRNO (30)/* Read-only file system */
-	EMLINK          = _HURD_ERRNO (31),
-#define	EMLINK          _HURD_ERRNO (31)/* Too many links */
-	EPIPE           = _HURD_ERRNO (32),
-#define	EPIPE           _HURD_ERRNO (32)/* Broken pipe */
-	EDOM            = _HURD_ERRNO (33),
-#define	EDOM            _HURD_ERRNO (33)/* Numerical argument out of domain */
-	ERANGE          = _HURD_ERRNO (34),
-#define	ERANGE          _HURD_ERRNO (34)/* Numerical result out of range */
-	EAGAIN          = _HURD_ERRNO (35),
-#define	EAGAIN          _HURD_ERRNO (35)/* Resource temporarily unavailable */
-#define EWOULDBLOCK EAGAIN /* Operation would block */
-	EINPROGRESS     = _HURD_ERRNO (36),
-#define	EINPROGRESS     _HURD_ERRNO (36)/* Operation now in progress */
-	EALREADY        = _HURD_ERRNO (37),
-#define	EALREADY        _HURD_ERRNO (37)/* Operation already in progress */
-	ENOTSOCK        = _HURD_ERRNO (38),
-#define	ENOTSOCK        _HURD_ERRNO (38)/* Socket operation on non-socket */
-	EMSGSIZE        = _HURD_ERRNO (40),
-#define	EMSGSIZE        _HURD_ERRNO (40)/* Message too long */
-	EPROTOTYPE      = _HURD_ERRNO (41),
-#define	EPROTOTYPE      _HURD_ERRNO (41)/* Protocol wrong type for socket */
-	ENOPROTOOPT     = _HURD_ERRNO (42),
-#define	ENOPROTOOPT     _HURD_ERRNO (42)/* Protocol not available */
-	EPROTONOSUPPORT = _HURD_ERRNO (43),
-#define	EPROTONOSUPPORT _HURD_ERRNO (43)/* Protocol not supported */
-	ESOCKTNOSUPPORT = _HURD_ERRNO (44),
-#define	ESOCKTNOSUPPORT _HURD_ERRNO (44)/* Socket type not supported */
-	EOPNOTSUPP      = _HURD_ERRNO (45),
-#define	EOPNOTSUPP      _HURD_ERRNO (45)/* Operation not supported */
-	EPFNOSUPPORT    = _HURD_ERRNO (46),
-#define	EPFNOSUPPORT    _HURD_ERRNO (46)/* Protocol family not supported */
-	EAFNOSUPPORT    = _HURD_ERRNO (47),
-#define	EAFNOSUPPORT    _HURD_ERRNO (47)/* Address family not supported by protocol */
-	EADDRINUSE      = _HURD_ERRNO (48),
-#define	EADDRINUSE      _HURD_ERRNO (48)/* Address already in use */
-	EADDRNOTAVAIL   = _HURD_ERRNO (49),
-#define	EADDRNOTAVAIL   _HURD_ERRNO (49)/* Cannot assign requested address */
-	ENETDOWN        = _HURD_ERRNO (50),
-#define	ENETDOWN        _HURD_ERRNO (50)/* Network is down */
-	ENETUNREACH     = _HURD_ERRNO (51),
-#define	ENETUNREACH     _HURD_ERRNO (51)/* Network is unreachable */
-	ENETRESET       = _HURD_ERRNO (52),
-#define	ENETRESET       _HURD_ERRNO (52)/* Network dropped connection on reset */
-	ECONNABORTED    = _HURD_ERRNO (53),
-#define	ECONNABORTED    _HURD_ERRNO (53)/* Software caused connection abort */
-	ECONNRESET      = _HURD_ERRNO (54),
-#define	ECONNRESET      _HURD_ERRNO (54)/* Connection reset by peer */
-	ENOBUFS         = _HURD_ERRNO (55),
-#define	ENOBUFS         _HURD_ERRNO (55)/* No buffer space available */
-	EISCONN         = _HURD_ERRNO (56),
-#define	EISCONN         _HURD_ERRNO (56)/* Transport endpoint is already connected */
-	ENOTCONN        = _HURD_ERRNO (57),
-#define	ENOTCONN        _HURD_ERRNO (57)/* Transport endpoint is not connected */
-	EDESTADDRREQ    = _HURD_ERRNO (39),
-#define	EDESTADDRREQ    _HURD_ERRNO (39)/* Destination address required */
-	ESHUTDOWN       = _HURD_ERRNO (58),
-#define	ESHUTDOWN       _HURD_ERRNO (58)/* Cannot send after transport endpoint shutdown */
-	ETOOMANYREFS    = _HURD_ERRNO (59),
-#define	ETOOMANYREFS    _HURD_ERRNO (59)/* Too many references: cannot splice */
-	ETIMEDOUT       = _HURD_ERRNO (60),
-#define	ETIMEDOUT       _HURD_ERRNO (60)/* Connection timed out */
-	ECONNREFUSED    = _HURD_ERRNO (61),
-#define	ECONNREFUSED    _HURD_ERRNO (61)/* Connection refused */
-	ELOOP           = _HURD_ERRNO (62),
-#define	ELOOP           _HURD_ERRNO (62)/* Too many levels of symbolic links */
-	ENAMETOOLONG    = _HURD_ERRNO (63),
-#define	ENAMETOOLONG    _HURD_ERRNO (63)/* File name too long */
-	EHOSTDOWN       = _HURD_ERRNO (64),
-#define	EHOSTDOWN       _HURD_ERRNO (64)/* Host is down */
-	EHOSTUNREACH    = _HURD_ERRNO (65),
-#define	EHOSTUNREACH    _HURD_ERRNO (65)/* No route to host */
-	ENOTEMPTY       = _HURD_ERRNO (66),
-#define	ENOTEMPTY       _HURD_ERRNO (66)/* Directory not empty */
-	EPROCLIM        = _HURD_ERRNO (67),
-#define	EPROCLIM        _HURD_ERRNO (67)/* Too many processes */
-	EUSERS          = _HURD_ERRNO (68),
-#define	EUSERS          _HURD_ERRNO (68)/* Too many users */
-	EDQUOT          = _HURD_ERRNO (69),
-#define	EDQUOT          _HURD_ERRNO (69)/* Disk quota exceeded */
-	ESTALE          = _HURD_ERRNO (70),
-#define	ESTALE          _HURD_ERRNO (70)/* Stale file handle */
-	EREMOTE         = _HURD_ERRNO (71),
-#define	EREMOTE         _HURD_ERRNO (71)/* Object is remote */
-	EBADRPC         = _HURD_ERRNO (72),
-#define	EBADRPC         _HURD_ERRNO (72)/* RPC struct is bad */
-	ERPCMISMATCH    = _HURD_ERRNO (73),
-#define	ERPCMISMATCH    _HURD_ERRNO (73)/* RPC version wrong */
-	EPROGUNAVAIL    = _HURD_ERRNO (74),
-#define	EPROGUNAVAIL    _HURD_ERRNO (74)/* RPC program not available */
-	EPROGMISMATCH   = _HURD_ERRNO (75),
-#define	EPROGMISMATCH   _HURD_ERRNO (75)/* RPC program version wrong */
-	EPROCUNAVAIL    = _HURD_ERRNO (76),
-#define	EPROCUNAVAIL    _HURD_ERRNO (76)/* RPC bad procedure for program */
-	ENOLCK          = _HURD_ERRNO (77),
-#define	ENOLCK          _HURD_ERRNO (77)/* No locks available */
-	EFTYPE          = _HURD_ERRNO (79),
-#define	EFTYPE          _HURD_ERRNO (79)/* Inappropriate file type or format */
-	EAUTH           = _HURD_ERRNO (80),
-#define	EAUTH           _HURD_ERRNO (80)/* Authentication error */
-	ENEEDAUTH       = _HURD_ERRNO (81),
-#define	ENEEDAUTH       _HURD_ERRNO (81)/* Need authenticator */
-	ENOSYS          = _HURD_ERRNO (78),
-#define	ENOSYS          _HURD_ERRNO (78)/* Function not implemented */
-	ENOTSUP         = _HURD_ERRNO (118),
-#define	ENOTSUP         _HURD_ERRNO (118)/* Not supported */
-	EILSEQ          = _HURD_ERRNO (106),
-#define	EILSEQ          _HURD_ERRNO (106)/* Invalid or incomplete multibyte or wide character */
-	EBACKGROUND     = _HURD_ERRNO (100),
-#define	EBACKGROUND     _HURD_ERRNO (100)/* Inappropriate operation for background process */
-	EDIED           = _HURD_ERRNO (101),
-#define	EDIED           _HURD_ERRNO (101)/* Translator died */
-	ED              = _HURD_ERRNO (102),
-#define	ED              _HURD_ERRNO (102)/* ? */
-	EGREGIOUS       = _HURD_ERRNO (103),
-#define	EGREGIOUS       _HURD_ERRNO (103)/* You really blew it this time */
-	EIEIO           = _HURD_ERRNO (104),
-#define	EIEIO           _HURD_ERRNO (104)/* Computer bought the farm */
-	EGRATUITOUS     = _HURD_ERRNO (105),
-#define	EGRATUITOUS     _HURD_ERRNO (105)/* Gratuitous error */
-	EBADMSG         = _HURD_ERRNO (107),
-#define	EBADMSG         _HURD_ERRNO (107)/* Bad message */
-	EIDRM           = _HURD_ERRNO (108),
-#define	EIDRM           _HURD_ERRNO (108)/* Identifier removed */
-	EMULTIHOP       = _HURD_ERRNO (109),
-#define	EMULTIHOP       _HURD_ERRNO (109)/* Multihop attempted */
-	ENODATA         = _HURD_ERRNO (110),
-#define	ENODATA         _HURD_ERRNO (110)/* No data available */
-	ENOLINK         = _HURD_ERRNO (111),
-#define	ENOLINK         _HURD_ERRNO (111)/* Link has been severed */
-	ENOMSG          = _HURD_ERRNO (112),
-#define	ENOMSG          _HURD_ERRNO (112)/* No message of desired type */
-	ENOSR           = _HURD_ERRNO (113),
-#define	ENOSR           _HURD_ERRNO (113)/* Out of streams resources */
-	ENOSTR          = _HURD_ERRNO (114),
-#define	ENOSTR          _HURD_ERRNO (114)/* Device not a stream */
-	EOVERFLOW       = _HURD_ERRNO (115),
-#define	EOVERFLOW       _HURD_ERRNO (115)/* Value too large for defined data type */
-	EPROTO          = _HURD_ERRNO (116),
-#define	EPROTO          _HURD_ERRNO (116)/* Protocol error */
-	ETIME           = _HURD_ERRNO (117),
-#define	ETIME           _HURD_ERRNO (117)/* Timer expired */
-	ECANCELED       = _HURD_ERRNO (119),
-#define	ECANCELED       _HURD_ERRNO (119)/* Operation canceled */
-
-	/* Errors from <mach/message.h>.  */
-	EMACH_SEND_IN_PROGRESS          = 0x10000001,
-	EMACH_SEND_INVALID_DATA         = 0x10000002,
-	EMACH_SEND_INVALID_DEST         = 0x10000003,
-	EMACH_SEND_TIMED_OUT            = 0x10000004,
-	EMACH_SEND_WILL_NOTIFY          = 0x10000005,
-	EMACH_SEND_NOTIFY_IN_PROGRESS   = 0x10000006,
-	EMACH_SEND_INTERRUPTED          = 0x10000007,
-	EMACH_SEND_MSG_TOO_SMALL        = 0x10000008,
-	EMACH_SEND_INVALID_REPLY        = 0x10000009,
-	EMACH_SEND_INVALID_RIGHT        = 0x1000000a,
-	EMACH_SEND_INVALID_NOTIFY       = 0x1000000b,
-	EMACH_SEND_INVALID_MEMORY       = 0x1000000c,
-	EMACH_SEND_NO_BUFFER            = 0x1000000d,
-	EMACH_SEND_NO_NOTIFY            = 0x1000000e,
-	EMACH_SEND_INVALID_TYPE         = 0x1000000f,
-	EMACH_SEND_INVALID_HEADER       = 0x10000010,
-	EMACH_RCV_IN_PROGRESS           = 0x10004001,
-	EMACH_RCV_INVALID_NAME          = 0x10004002,
-	EMACH_RCV_TIMED_OUT             = 0x10004003,
-	EMACH_RCV_TOO_LARGE             = 0x10004004,
-	EMACH_RCV_INTERRUPTED           = 0x10004005,
-	EMACH_RCV_PORT_CHANGED          = 0x10004006,
-	EMACH_RCV_INVALID_NOTIFY        = 0x10004007,
-	EMACH_RCV_INVALID_DATA          = 0x10004008,
-	EMACH_RCV_PORT_DIED             = 0x10004009,
-	EMACH_RCV_IN_SET                = 0x1000400a,
-	EMACH_RCV_HEADER_ERROR          = 0x1000400b,
-	EMACH_RCV_BODY_ERROR            = 0x1000400c,
-
-	/* Errors from <mach/kern_return.h>.  */
-	EKERN_INVALID_ADDRESS           = 1,
-	EKERN_PROTECTION_FAILURE        = 2,
-	EKERN_NO_SPACE                  = 3,
-	EKERN_INVALID_ARGUMENT          = 4,
-	EKERN_FAILURE                   = 5,
-	EKERN_RESOURCE_SHORTAGE         = 6,
-	EKERN_NOT_RECEIVER              = 7,
-	EKERN_NO_ACCESS                 = 8,
-	EKERN_MEMORY_FAILURE            = 9,
-	EKERN_MEMORY_ERROR              = 10,
-	EKERN_NOT_IN_SET                = 12,
-	EKERN_NAME_EXISTS               = 13,
-	EKERN_ABORTED                   = 14,
-	EKERN_INVALID_NAME              = 15,
-	EKERN_INVALID_TASK              = 16,
-	EKERN_INVALID_RIGHT             = 17,
-	EKERN_INVALID_VALUE             = 18,
-	EKERN_UREFS_OVERFLOW            = 19,
-	EKERN_INVALID_CAPABILITY        = 20,
-	EKERN_RIGHT_EXISTS              = 21,
-	EKERN_INVALID_HOST              = 22,
-	EKERN_MEMORY_PRESENT            = 23,
-	EKERN_WRITE_PROTECTION_FAILURE  = 24,
-	EKERN_TERMINATED                = 26,
-
-	/* Errors from <mach/mig_errors.h>.  */
-	EMIG_TYPE_ERROR         = -300  /* client type check failure */,
-	EMIG_REPLY_MISMATCH     = -301  /* wrong reply message ID */,
-	EMIG_REMOTE_ERROR       = -302  /* server detected error */,
-	EMIG_BAD_ID             = -303  /* bad request message ID */,
-	EMIG_BAD_ARGUMENTS      = -304  /* server type check failure */,
-	EMIG_NO_REPLY           = -305  /* no reply should be sent */,
-	EMIG_EXCEPTION          = -306  /* server raised exception */,
-	EMIG_ARRAY_TOO_LARGE    = -307  /* array not large enough */,
-	EMIG_SERVER_DIED        = -308  /* server died */,
-	EMIG_DESTROY_REQUEST    = -309  /* destroy request with no reply */,
-
-	/* Errors from <device/device_types.h>.  */
-	ED_IO_ERROR             = 2500  /* hardware IO error */,
-	ED_WOULD_BLOCK          = 2501  /* would block, but D_NOWAIT set */,
-	ED_NO_SUCH_DEVICE       = 2502  /* no such device */,
-	ED_ALREADY_OPEN         = 2503  /* exclusive-use device already open */,
-	ED_DEVICE_DOWN          = 2504  /* device has been shut down */,
-	ED_INVALID_OPERATION    = 2505  /* bad operation for device */,
-	ED_INVALID_RECNUM       = 2506  /* invalid record (block) number */,
-	ED_INVALID_SIZE         = 2507  /* invalid IO size */,
-	ED_NO_MEMORY            = 2508  /* memory allocation failure */,
-	ED_READ_ONLY            = 2509  /* device cannot be written to */
+  /* The Hurd uses Mach error system 0x10, subsystem 0. */
+  EPERM                          = 0x40000001,	/* Operation not permitted */
+  ENOENT                         = 0x40000002,	/* No such file or directory */
+  ESRCH                          = 0x40000003,	/* No such process */
+  EINTR                          = 0x40000004,	/* Interrupted system call */
+  EIO                            = 0x40000005,	/* Input/output error */
+  ENXIO                          = 0x40000006,	/* No such device or address */
+  E2BIG                          = 0x40000007,	/* Argument list too long */
+  ENOEXEC                        = 0x40000008,	/* Exec format error */
+  EBADF                          = 0x40000009,	/* Bad file descriptor */
+  ECHILD                         = 0x4000000a,	/* No child processes */
+  EDEADLK                        = 0x4000000b,	/* Resource deadlock avoided */
+  ENOMEM                         = 0x4000000c,	/* Cannot allocate memory */
+  EACCES                         = 0x4000000d,	/* Permission denied */
+  EFAULT                         = 0x4000000e,	/* Bad address */
+  ENOTBLK                        = 0x4000000f,	/* Block device required */
+  EBUSY                          = 0x40000010,	/* Device or resource busy */
+  EEXIST                         = 0x40000011,	/* File exists */
+  EXDEV                          = 0x40000012,	/* Invalid cross-device link */
+  ENODEV                         = 0x40000013,	/* No such device */
+  ENOTDIR                        = 0x40000014,	/* Not a directory */
+  EISDIR                         = 0x40000015,	/* Is a directory */
+  EINVAL                         = 0x40000016,	/* Invalid argument */
+  EMFILE                         = 0x40000018,	/* Too many open files */
+  ENFILE                         = 0x40000017,	/* Too many open files in system */
+  ENOTTY                         = 0x40000019,	/* Inappropriate ioctl for device */
+  ETXTBSY                        = 0x4000001a,	/* Text file busy */
+  EFBIG                          = 0x4000001b,	/* File too large */
+  ENOSPC                         = 0x4000001c,	/* No space left on device */
+  ESPIPE                         = 0x4000001d,	/* Illegal seek */
+  EROFS                          = 0x4000001e,	/* Read-only file system */
+  EMLINK                         = 0x4000001f,	/* Too many links */
+  EPIPE                          = 0x40000020,	/* Broken pipe */
+  EDOM                           = 0x40000021,	/* Numerical argument out of domain */
+  ERANGE                         = 0x40000022,	/* Numerical result out of range */
+  EAGAIN                         = 0x40000023,	/* Resource temporarily unavailable */
+  EINPROGRESS                    = 0x40000024,	/* Operation now in progress */
+  EALREADY                       = 0x40000025,	/* Operation already in progress */
+  ENOTSOCK                       = 0x40000026,	/* Socket operation on non-socket */
+  EMSGSIZE                       = 0x40000028,	/* Message too long */
+  EPROTOTYPE                     = 0x40000029,	/* Protocol wrong type for socket */
+  ENOPROTOOPT                    = 0x4000002a,	/* Protocol not available */
+  EPROTONOSUPPORT                = 0x4000002b,	/* Protocol not supported */
+  ESOCKTNOSUPPORT                = 0x4000002c,	/* Socket type not supported */
+  EOPNOTSUPP                     = 0x4000002d,	/* Operation not supported */
+  EPFNOSUPPORT                   = 0x4000002e,	/* Protocol family not supported */
+  EAFNOSUPPORT                   = 0x4000002f,	/* Address family not supported by protocol */
+  EADDRINUSE                     = 0x40000030,	/* Address already in use */
+  EADDRNOTAVAIL                  = 0x40000031,	/* Cannot assign requested address */
+  ENETDOWN                       = 0x40000032,	/* Network is down */
+  ENETUNREACH                    = 0x40000033,	/* Network is unreachable */
+  ENETRESET                      = 0x40000034,	/* Network dropped connection on reset */
+  ECONNABORTED                   = 0x40000035,	/* Software caused connection abort */
+  ECONNRESET                     = 0x40000036,	/* Connection reset by peer */
+  ENOBUFS                        = 0x40000037,	/* No buffer space available */
+  EISCONN                        = 0x40000038,	/* Transport endpoint is already connected */
+  ENOTCONN                       = 0x40000039,	/* Transport endpoint is not connected */
+  EDESTADDRREQ                   = 0x40000027,	/* Destination address required */
+  ESHUTDOWN                      = 0x4000003a,	/* Cannot send after transport endpoint shutdown */
+  ETOOMANYREFS                   = 0x4000003b,	/* Too many references: cannot splice */
+  ETIMEDOUT                      = 0x4000003c,	/* Connection timed out */
+  ECONNREFUSED                   = 0x4000003d,	/* Connection refused */
+  ELOOP                          = 0x4000003e,	/* Too many levels of symbolic links */
+  ENAMETOOLONG                   = 0x4000003f,	/* File name too long */
+  EHOSTDOWN                      = 0x40000040,	/* Host is down */
+  EHOSTUNREACH                   = 0x40000041,	/* No route to host */
+  ENOTEMPTY                      = 0x40000042,	/* Directory not empty */
+  EPROCLIM                       = 0x40000043,	/* Too many processes */
+  EUSERS                         = 0x40000044,	/* Too many users */
+  EDQUOT                         = 0x40000045,	/* Disk quota exceeded */
+  ESTALE                         = 0x40000046,	/* Stale file handle */
+  EREMOTE                        = 0x40000047,	/* Object is remote */
+  EBADRPC                        = 0x40000048,	/* RPC struct is bad */
+  ERPCMISMATCH                   = 0x40000049,	/* RPC version wrong */
+  EPROGUNAVAIL                   = 0x4000004a,	/* RPC program not available */
+  EPROGMISMATCH                  = 0x4000004b,	/* RPC program version wrong */
+  EPROCUNAVAIL                   = 0x4000004c,	/* RPC bad procedure for program */
+  ENOLCK                         = 0x4000004d,	/* No locks available */
+  EFTYPE                         = 0x4000004f,	/* Inappropriate file type or format */
+  EAUTH                          = 0x40000050,	/* Authentication error */
+  ENEEDAUTH                      = 0x40000051,	/* Need authenticator */
+  ENOSYS                         = 0x4000004e,	/* Function not implemented */
+  ENOTSUP                        = 0x40000076,	/* Not supported */
+  EILSEQ                         = 0x4000006a,	/* Invalid or incomplete multibyte or wide character */
+  EBACKGROUND                    = 0x40000064,	/* Inappropriate operation for background process */
+  EDIED                          = 0x40000065,	/* Translator died */
+  ED                             = 0x40000066,	/* ? */
+  EGREGIOUS                      = 0x40000067,	/* You really blew it this time */
+  EIEIO                          = 0x40000068,	/* Computer bought the farm */
+  EGRATUITOUS                    = 0x40000069,	/* Gratuitous error */
+  EBADMSG                        = 0x4000006b,	/* Bad message */
+  EIDRM                          = 0x4000006c,	/* Identifier removed */
+  EMULTIHOP                      = 0x4000006d,	/* Multihop attempted */
+  ENODATA                        = 0x4000006e,	/* No data available */
+  ENOLINK                        = 0x4000006f,	/* Link has been severed */
+  ENOMSG                         = 0x40000070,	/* No message of desired type */
+  ENOSR                          = 0x40000071,	/* Out of streams resources */
+  ENOSTR                         = 0x40000072,	/* Device not a stream */
+  EOVERFLOW                      = 0x40000073,	/* Value too large for defined data type */
+  EPROTO                         = 0x40000074,	/* Protocol error */
+  ETIME                          = 0x40000075,	/* Timer expired */
+  ECANCELED                      = 0x40000077,	/* Operation canceled */
+  
+/* Errors from <mach/message.h>.  */
+  EMACH_SEND_IN_PROGRESS         = 0x10000001,
+  EMACH_SEND_INVALID_DATA        = 0x10000002,
+  EMACH_SEND_INVALID_DEST        = 0x10000003,
+  EMACH_SEND_TIMED_OUT           = 0x10000004,
+  EMACH_SEND_WILL_NOTIFY         = 0x10000005,
+  EMACH_SEND_NOTIFY_IN_PROGRESS  = 0x10000006,
+  EMACH_SEND_INTERRUPTED         = 0x10000007,
+  EMACH_SEND_MSG_TOO_SMALL       = 0x10000008,
+  EMACH_SEND_INVALID_REPLY       = 0x10000009,
+  EMACH_SEND_INVALID_RIGHT       = 0x1000000a,
+  EMACH_SEND_INVALID_NOTIFY      = 0x1000000b,
+  EMACH_SEND_INVALID_MEMORY      = 0x1000000c,
+  EMACH_SEND_NO_BUFFER           = 0x1000000d,
+  EMACH_SEND_NO_NOTIFY           = 0x1000000e,
+  EMACH_SEND_INVALID_TYPE        = 0x1000000f,
+  EMACH_SEND_INVALID_HEADER      = 0x10000010,
+  EMACH_RCV_IN_PROGRESS          = 0x10004001,
+  EMACH_RCV_INVALID_NAME         = 0x10004002,
+  EMACH_RCV_TIMED_OUT            = 0x10004003,
+  EMACH_RCV_TOO_LARGE            = 0x10004004,
+  EMACH_RCV_INTERRUPTED          = 0x10004005,
+  EMACH_RCV_PORT_CHANGED         = 0x10004006,
+  EMACH_RCV_INVALID_NOTIFY       = 0x10004007,
+  EMACH_RCV_INVALID_DATA         = 0x10004008,
+  EMACH_RCV_PORT_DIED            = 0x10004009,
+  EMACH_RCV_IN_SET               = 0x1000400a,
+  EMACH_RCV_HEADER_ERROR         = 0x1000400b,
+  EMACH_RCV_BODY_ERROR           = 0x1000400c,
+  
+/* Errors from <mach/kern_return.h>.  */
+  EKERN_INVALID_ADDRESS          = 1,
+  EKERN_PROTECTION_FAILURE       = 2,
+  EKERN_NO_SPACE                 = 3,
+  EKERN_INVALID_ARGUMENT         = 4,
+  EKERN_FAILURE                  = 5,
+  EKERN_RESOURCE_SHORTAGE        = 6,
+  EKERN_NOT_RECEIVER             = 7,
+  EKERN_NO_ACCESS                = 8,
+  EKERN_MEMORY_FAILURE           = 9,
+  EKERN_MEMORY_ERROR             = 10,
+  EKERN_NOT_IN_SET               = 12,
+  EKERN_NAME_EXISTS              = 13,
+  EKERN_ABORTED                  = 14,
+  EKERN_INVALID_NAME             = 15,
+  EKERN_INVALID_TASK             = 16,
+  EKERN_INVALID_RIGHT            = 17,
+  EKERN_INVALID_VALUE            = 18,
+  EKERN_UREFS_OVERFLOW           = 19,
+  EKERN_INVALID_CAPABILITY       = 20,
+  EKERN_RIGHT_EXISTS             = 21,
+  EKERN_INVALID_HOST             = 22,
+  EKERN_MEMORY_PRESENT           = 23,
+  EKERN_WRITE_PROTECTION_FAILURE = 24,
+  EKERN_TERMINATED               = 26,
+  EKERN_TIMEDOUT                 = 27,
+  EKERN_INTERRUPTED              = 28,
+  
+/* Errors from <mach/mig_errors.h>.  */
+  EMIG_TYPE_ERROR                = -300,	/* client type check failure */
+  EMIG_REPLY_MISMATCH            = -301,	/* wrong reply message ID */
+  EMIG_REMOTE_ERROR              = -302,	/* server detected error */
+  EMIG_BAD_ID                    = -303,	/* bad request message ID */
+  EMIG_BAD_ARGUMENTS             = -304,	/* server type check failure */
+  EMIG_NO_REPLY                  = -305,	/* no reply should be sent */
+  EMIG_EXCEPTION                 = -306,	/* server raised exception */
+  EMIG_ARRAY_TOO_LARGE           = -307,	/* array not large enough */
+  EMIG_SERVER_DIED               = -308,	/* server died */
+  EMIG_DESTROY_REQUEST           = -309,	/* destroy request with no reply */
+  
+/* Errors from <device/device_types.h>.  */
+  ED_IO_ERROR                    = 2500,	/* hardware IO error */
+  ED_WOULD_BLOCK                 = 2501,	/* would block, but D_NOWAIT set */
+  ED_NO_SUCH_DEVICE              = 2502,	/* no such device */
+  ED_ALREADY_OPEN                = 2503,	/* exclusive-use device already open */
+  ED_DEVICE_DOWN                 = 2504,	/* device has been shut down */
+  ED_INVALID_OPERATION           = 2505,	/* bad operation for device */
+  ED_INVALID_RECNUM              = 2506,	/* invalid record (block) number */
+  ED_INVALID_SIZE                = 2507,	/* invalid IO size */
+  ED_NO_MEMORY                   = 2508,	/* memory allocation failure */
+  ED_READ_ONLY                   = 2509,	/* device cannot be written to */
 
+  /* Because the C standard requires that errno have type 'int',
+     this enumeration must be a signed type.  */
+  __FORCE_ERROR_T_CODES_SIGNED = -1
 };
 
-#define	_HURD_ERRNOS	120
-
-/* User-visible type of error codes.  It is ok to use `int' or
-   `kern_return_t' for these, but with `error_t' the debugger prints
+/* User-visible type of error codes.  It is ok to use 'int' or
+   'kern_return_t' for these, but with 'error_t' the debugger prints
    symbolic values.  */
-#ifdef __USE_GNU
+# if !defined __error_t_defined && defined __USE_GNU
+#  define __error_t_defined 1
 typedef enum __error_t_codes error_t;
-#define __error_t_defined	1
-#endif
+# endif
 
-/* Return the current thread's location for `errno'.
-   The syntax of this function allows redeclarations like `int errno'.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
+#endif /* not __ASSEMBLER__ */
 
-#define errno			(*__errno_location ())
+/* The C standard requires that all of the E-constants be
+   defined as macros.  */
 
-#endif /* <errno.h> included.  */
+#define EPERM                          0x40000001
+#define ENOENT                         0x40000002
+#define ESRCH                          0x40000003
+#define EINTR                          0x40000004
+#define EIO                            0x40000005
+#define ENXIO                          0x40000006
+#define E2BIG                          0x40000007
+#define ENOEXEC                        0x40000008
+#define EBADF                          0x40000009
+#define ECHILD                         0x4000000a
+#define EDEADLK                        0x4000000b
+#define ENOMEM                         0x4000000c
+#define EACCES                         0x4000000d
+#define EFAULT                         0x4000000e
+#define ENOTBLK                        0x4000000f
+#define EBUSY                          0x40000010
+#define EEXIST                         0x40000011
+#define EXDEV                          0x40000012
+#define ENODEV                         0x40000013
+#define ENOTDIR                        0x40000014
+#define EISDIR                         0x40000015
+#define EINVAL                         0x40000016
+#define EMFILE                         0x40000018
+#define ENFILE                         0x40000017
+#define ENOTTY                         0x40000019
+#define ETXTBSY                        0x4000001a
+#define EFBIG                          0x4000001b
+#define ENOSPC                         0x4000001c
+#define ESPIPE                         0x4000001d
+#define EROFS                          0x4000001e
+#define EMLINK                         0x4000001f
+#define EPIPE                          0x40000020
+#define EDOM                           0x40000021
+#define ERANGE                         0x40000022
+#define EAGAIN                         0x40000023
+#define EWOULDBLOCK                    EAGAIN
+#define EINPROGRESS                    0x40000024
+#define EALREADY                       0x40000025
+#define ENOTSOCK                       0x40000026
+#define EMSGSIZE                       0x40000028
+#define EPROTOTYPE                     0x40000029
+#define ENOPROTOOPT                    0x4000002a
+#define EPROTONOSUPPORT                0x4000002b
+#define ESOCKTNOSUPPORT                0x4000002c
+#define EOPNOTSUPP                     0x4000002d
+#define EPFNOSUPPORT                   0x4000002e
+#define EAFNOSUPPORT                   0x4000002f
+#define EADDRINUSE                     0x40000030
+#define EADDRNOTAVAIL                  0x40000031
+#define ENETDOWN                       0x40000032
+#define ENETUNREACH                    0x40000033
+#define ENETRESET                      0x40000034
+#define ECONNABORTED                   0x40000035
+#define ECONNRESET                     0x40000036
+#define ENOBUFS                        0x40000037
+#define EISCONN                        0x40000038
+#define ENOTCONN                       0x40000039
+#define EDESTADDRREQ                   0x40000027
+#define ESHUTDOWN                      0x4000003a
+#define ETOOMANYREFS                   0x4000003b
+#define ETIMEDOUT                      0x4000003c
+#define ECONNREFUSED                   0x4000003d
+#define ELOOP                          0x4000003e
+#define ENAMETOOLONG                   0x4000003f
+#define EHOSTDOWN                      0x40000040
+#define EHOSTUNREACH                   0x40000041
+#define ENOTEMPTY                      0x40000042
+#define EPROCLIM                       0x40000043
+#define EUSERS                         0x40000044
+#define EDQUOT                         0x40000045
+#define ESTALE                         0x40000046
+#define EREMOTE                        0x40000047
+#define EBADRPC                        0x40000048
+#define ERPCMISMATCH                   0x40000049
+#define EPROGUNAVAIL                   0x4000004a
+#define EPROGMISMATCH                  0x4000004b
+#define EPROCUNAVAIL                   0x4000004c
+#define ENOLCK                         0x4000004d
+#define EFTYPE                         0x4000004f
+#define EAUTH                          0x40000050
+#define ENEEDAUTH                      0x40000051
+#define ENOSYS                         0x4000004e
+#define ENOTSUP                        0x40000076
+#define EILSEQ                         0x4000006a
+#define EBACKGROUND                    0x40000064
+#define EDIED                          0x40000065
+#define ED                             0x40000066
+#define EGREGIOUS                      0x40000067
+#define EIEIO                          0x40000068
+#define EGRATUITOUS                    0x40000069
+#define EBADMSG                        0x4000006b
+#define EIDRM                          0x4000006c
+#define EMULTIHOP                      0x4000006d
+#define ENODATA                        0x4000006e
+#define ENOLINK                        0x4000006f
+#define ENOMSG                         0x40000070
+#define ENOSR                          0x40000071
+#define ENOSTR                         0x40000072
+#define EOVERFLOW                      0x40000073
+#define EPROTO                         0x40000074
+#define ETIME                          0x40000075
+#define ECANCELED                      0x40000077
 
-#if !defined (_ERRNO_H) && defined (__need_Emath)
-#define	EDOM            _HURD_ERRNO (33)/* Numerical argument out of domain */
-#define	ERANGE          _HURD_ERRNO (34)/* Numerical result out of range */
-#endif /* <errno.h> not included and need math error codes.  */
+/* Errors from <mach/message.h>.  */
+#define EMACH_SEND_IN_PROGRESS         0x10000001
+#define EMACH_SEND_INVALID_DATA        0x10000002
+#define EMACH_SEND_INVALID_DEST        0x10000003
+#define EMACH_SEND_TIMED_OUT           0x10000004
+#define EMACH_SEND_WILL_NOTIFY         0x10000005
+#define EMACH_SEND_NOTIFY_IN_PROGRESS  0x10000006
+#define EMACH_SEND_INTERRUPTED         0x10000007
+#define EMACH_SEND_MSG_TOO_SMALL       0x10000008
+#define EMACH_SEND_INVALID_REPLY       0x10000009
+#define EMACH_SEND_INVALID_RIGHT       0x1000000a
+#define EMACH_SEND_INVALID_NOTIFY      0x1000000b
+#define EMACH_SEND_INVALID_MEMORY      0x1000000c
+#define EMACH_SEND_NO_BUFFER           0x1000000d
+#define EMACH_SEND_NO_NOTIFY           0x1000000e
+#define EMACH_SEND_INVALID_TYPE        0x1000000f
+#define EMACH_SEND_INVALID_HEADER      0x10000010
+#define EMACH_RCV_IN_PROGRESS          0x10004001
+#define EMACH_RCV_INVALID_NAME         0x10004002
+#define EMACH_RCV_TIMED_OUT            0x10004003
+#define EMACH_RCV_TOO_LARGE            0x10004004
+#define EMACH_RCV_INTERRUPTED          0x10004005
+#define EMACH_RCV_PORT_CHANGED         0x10004006
+#define EMACH_RCV_INVALID_NOTIFY       0x10004007
+#define EMACH_RCV_INVALID_DATA         0x10004008
+#define EMACH_RCV_PORT_DIED            0x10004009
+#define EMACH_RCV_IN_SET               0x1000400a
+#define EMACH_RCV_HEADER_ERROR         0x1000400b
+#define EMACH_RCV_BODY_ERROR           0x1000400c
+
+/* Errors from <mach/kern_return.h>.  */
+#define EKERN_INVALID_ADDRESS          1
+#define EKERN_PROTECTION_FAILURE       2
+#define EKERN_NO_SPACE                 3
+#define EKERN_INVALID_ARGUMENT         4
+#define EKERN_FAILURE                  5
+#define EKERN_RESOURCE_SHORTAGE        6
+#define EKERN_NOT_RECEIVER             7
+#define EKERN_NO_ACCESS                8
+#define EKERN_MEMORY_FAILURE           9
+#define EKERN_MEMORY_ERROR             10
+#define EKERN_NOT_IN_SET               12
+#define EKERN_NAME_EXISTS              13
+#define EKERN_ABORTED                  14
+#define EKERN_INVALID_NAME             15
+#define EKERN_INVALID_TASK             16
+#define EKERN_INVALID_RIGHT            17
+#define EKERN_INVALID_VALUE            18
+#define EKERN_UREFS_OVERFLOW           19
+#define EKERN_INVALID_CAPABILITY       20
+#define EKERN_RIGHT_EXISTS             21
+#define EKERN_INVALID_HOST             22
+#define EKERN_MEMORY_PRESENT           23
+#define EKERN_WRITE_PROTECTION_FAILURE 24
+#define EKERN_TERMINATED               26
+#define EKERN_TIMEDOUT                 27
+#define EKERN_INTERRUPTED              28
+
+/* Errors from <mach/mig_errors.h>.  */
+#define EMIG_TYPE_ERROR                -300
+#define EMIG_REPLY_MISMATCH            -301
+#define EMIG_REMOTE_ERROR              -302
+#define EMIG_BAD_ID                    -303
+#define EMIG_BAD_ARGUMENTS             -304
+#define EMIG_NO_REPLY                  -305
+#define EMIG_EXCEPTION                 -306
+#define EMIG_ARRAY_TOO_LARGE           -307
+#define EMIG_SERVER_DIED               -308
+#define EMIG_DESTROY_REQUEST           -309
+
+/* Errors from <device/device_types.h>.  */
+#define ED_IO_ERROR                    2500
+#define ED_WOULD_BLOCK                 2501
+#define ED_NO_SUCH_DEVICE              2502
+#define ED_ALREADY_OPEN                2503
+#define ED_DEVICE_DOWN                 2504
+#define ED_INVALID_OPERATION           2505
+#define ED_INVALID_RECNUM              2506
+#define ED_INVALID_SIZE                2507
+#define ED_NO_MEMORY                   2508
+#define ED_READ_ONLY                   2509
+
+#define _HURD_ERRNOS 120
+
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index 1cd2a0ac96..d1ed8c4877 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -19,71 +19,74 @@
 # @errno{ENOSYS, 123, Function not implemented}
 
 BEGIN {
-    print "/* This file generated by errnos.awk.  */";
+    print "/* This file generated by errnos.awk from";
+    for (i = 1; i < ARGC; i++)
+      {
+	arg = ARGV[i];
+	sub(/.*(manual|include)\//, "", arg)
+        print "     " arg;
+      }
+    print "   Do not edit this file; edit errnos.awk and regenerate it.  */";
     print "";
-    print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
-    print "#ifndef _HURD_ERRNO";
-    print "#define _HURD_ERRNO(n)\t((0x10 << 26) | ((n) & 0x3fff))";
+    print "#ifndef _BITS_ERRNO_H";
+    print "#define _BITS_ERRNO_H 1";
+    print "";
+    print "#if !defined _ERRNO_H";
+    print "# error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
     print "#endif";
-    print "";
-    print "#ifdef _ERRNO_H\n";
-    print "enum __error_t_codes\n{";
-    print "\t/* The value zero always means success and it is perfectly fine for";
-    print "\t   code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).";
-    print "\t   Having an enum entry for zero both makes the debugger print the name";
-    print "\t   for error_t-typed zero values, and prevents the compiler from";
-    print "\t   issuing warnings about 'case 0:' in a switch on an error_t-typed";
-    print "\t   value.  */";
-    print "\tESUCCESS = 0,"
-    print "";
+
     maxerrno = 0;
+    maxerrlen = 0;
     in_mach_errors = "";
-    in_math = 0;
-    edom = erange = "";
-    print "#undef EDOM\n#undef ERANGE";
-    lno = 0;
+    seq = 0;
   }
 
 /^@errno\{/ \
   {
-    etext = "";
-    for (i = 3; i <= NF; ++i)
-      etext = etext " " $i;
-    etext = substr(etext, 1, length(etext)-1)
-
     e = substr($1, 8, length($1)-8)
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
     if (e == "EWOULDBLOCK")
       {
-	lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+	econsts[seq] = e;
+	errnos[seq] = "EAGAIN";
+	seq++;
 	next;
       }
 
-    errno = substr($2, 1, length($2)-1) + 0
+    errno = substr($2, 1, length($2)-1) + 0;
     if (errno == 0)
       next;
-    if (errno > maxerrno) maxerrno = errno;
-    x = sprintf ("%-40s/*%s */", sprintf ("%-24s%s", "#define\t" e,
-					  "_HURD_ERRNO (" errno ")"),
-		 etext);
-    if (e == "EDOM")
-      edom = x;
-    else if (e == "ERANGE")
-      erange = x;
-    comma[lno] = 1;
-    lines[lno++] = sprintf("\t%-16s= _HURD_ERRNO (%d)", e, errno);
-    lines[lno++] = x;
+    if (errno > 0x3ffff)
+      {
+	printf("%s:%d: errno value %d too large for the Hurd\n",
+	       FILENAME, NR, errno) >> "/dev/stderr";
+	exit 1;
+      }
+    if (errno > maxerrno)
+      maxerrno = errno;
+
+    etext = "";
+    for (i = 3; i <= NF; ++i)
+      etext = etext " " $i;
+    etext = substr(etext, 2, length(etext)-2);
+
+    econsts[seq] = e;
+    errnos[seq] = sprintf("0x%08x", 0x40000000 + errno);
+    etexts[seq] = etext;
+    seq++;
     next;
   }
 
 NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
   {
     in_mach_errors = FILENAME;
-    lines[lno++] = "\n\t/* Errors from <mach/message.h>.  */";
+    annot[seq++] = "\n/* Errors from <mach/message.h>.  */";
   }
 NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
   {
     in_mach_errors = FILENAME;
-    lines[lno++] = "\n\t/* Errors from <mach/kern_return.h>.  */";
+    annot[seq++] = "\n/* Errors from <mach/kern_return.h>.  */";
     next;
   }
 
@@ -92,16 +95,24 @@ in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
     in_mach_errors = "";
   }
 
+# FIXME: mach/message.h and mach/kern_return.h do include error
+# descriptions which we could slurp, but some of them are very long,
+# we would need to word-wrap them.
 in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
   {
-    comma[lno] = 1;
-    lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
+    e = "E" $2;
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
+    econsts[seq] = e;
+    errnos[seq] = $3;
+    etexts[seq] = "";
+    seq++;
   }
 
 $1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
   {
     in_mig_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>.  */";
+    annot[seq++] = "\n/* Errors from <mach/mig_errors.h>.  */";
     next;
   }
 in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
@@ -112,17 +123,23 @@ in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
 (in_mig_errors && $1 == "#define" && $3 <= -300) || \
 (in_device_errors && $1 == "#define" && /D_/ && NF > 3) \
   {
-    comment = "";
-    for (i = 4; i <= NF; ++i)
-      comment = comment " " $i;
-    comma[lno] = 1;
-    lines[lno++] = sprintf("%-32s", sprintf ("\t%-24s= %s", "E" $2, $3)) comment;
+    etext = "";
+    for (i = 5; i < NF; ++i)
+      etext = etext " " $i;
+
+    e = "E" $2;
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
+    econsts[seq] = e;
+    errnos[seq] = $3;
+    etexts[seq] = substr(etext, 2, length(etext)-1);
+    seq++;
   }
 
 $1 == "#define" && $2 == "D_SUCCESS" \
   {
     in_device_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <device/device_types.h>.  */";
+    annot[seq++] = "\n/* Errors from <device/device_types.h>.  */";
     next;
   }
 in_device_errors && $1 == "#endif" \
@@ -130,36 +147,73 @@ in_device_errors && $1 == "#endif" \
     in_device_errors = 0;
   }
 
+function print_errno_enum(maxseq)
+{
+  print "";
+  print "#ifndef __ASSEMBLER__";
+  print "";
+  print "enum __error_t_codes";
+  print "{";
+  print "  /* The value zero always means success and it is perfectly fine";
+  print "     for code to use 0 explicitly (or implicitly, e.g. via Boolean";
+  print "     coercion.)  Having an enum entry for zero both makes the";
+  print "     debugger print the name for error_t-typed zero values, and";
+  print "     prevents the compiler from issuing warnings about 'case 0:'";
+  print "     in a switch on an error_t-typed value.  */";
+  printf("  %-*s = 0,\n", maxerrlen, "ESUCCESS");
+
+  print "";
+  print "  /* The Hurd uses Mach error system 0x10, subsystem 0. */";
+  for (i = 0; i < maxseq; i++)
+    {
+      if (i in annot)
+	print "  " annot[i];
+      else if (i in etexts && etexts[i] != "")
+	printf("  %-*s = %s,\t/* %s */\n",
+	       maxerrlen, econsts[i], errnos[i], etexts[i]);
+      else if (errnos[i] != "EAGAIN")
+	printf("  %-*s = %s,\n", maxerrlen, econsts[i], errnos[i]);
+    }
+
+  print "";
+  print "  /* Because the C standard requires that errno have type 'int',"
+  print "     this enumeration must be a signed type.  */";
+  print "  __FORCE_ERROR_T_CODES_SIGNED = -1";
+  print "};";
+  print "";
+  print "/* User-visible type of error codes.  It is ok to use 'int' or";
+  print "   'kern_return_t' for these, but with 'error_t' the debugger prints";
+  print "   symbolic values.  */";
+  print "# if !defined __error_t_defined && defined __USE_GNU";
+  print "#  define __error_t_defined 1";
+  print "typedef enum __error_t_codes error_t;"
+  print "# endif";
+  print "";
+  print "#endif /* not __ASSEMBLER__ */";
+}
+
+function print_errno_defines(maxseq)
+{
+  print "";
+  print "/* The C standard requires that all of the E-constants be"
+  print "   defined as macros.  */"
+  print "";
+  for (i = 0; i < maxseq; i++)
+    {
+      if (i in annot)
+	print annot[i];
+      else
+	printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]);
+    }
+  print "";
+  printf("#define _HURD_ERRNOS %d\n", maxerrno+1);
+}
 
 END \
   {
-    for (i = 0; i < lno - 1; ++i)
-      printf "%s%s\n", lines[i], (comma[i] ? "," : "");
-    print lines[i];
+    print_errno_enum(seq);
+    print_errno_defines(seq);
+
     print "";
-    print "};";
-    print "";
-    printf "#define\t_HURD_ERRNOS\t%d\n", maxerrno+1;
-    print "";
-    print "\
-/* User-visible type of error codes.  It is ok to use `int' or\n\
-   `kern_return_t' for these, but with `error_t' the debugger prints\n\
-   symbolic values.  */";
-    print "#ifdef __USE_GNU";
-    print "typedef enum __error_t_codes error_t;"
-    print "#define __error_t_defined\t1"
-    print "#endif";
-    print "";
-    print "\
-/* Return the current thread's location for `errno'.\n\
-   The syntax of this function allows redeclarations like `int errno'.  */\n\
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));\n\
-\n\
-#define errno			(*__errno_location ())\n\
-";
-    print "#endif /* <errno.h> included.  */";
-    print "";
-    print "#if !defined (_ERRNO_H) && defined (__need_Emath)";
-    print edom; print erange;
-    print "#endif /* <errno.h> not included and need math error codes.  */";
+    print "#endif /* bits/errno.h.  */";
   }
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/errno.h b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
index 3338621710..6a8730165e 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
@@ -16,23 +16,29 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	131
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		131
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		136
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	137
 # endif
 
@@ -44,22 +50,4 @@
 #  define EHWPOISON		139
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	116	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/bits/errno.h b/sysdeps/unix/sysv/linux/bits/errno.h
index c0f4d20fe7..66cfb483c5 100644
--- a/sysdeps/unix/sysv/linux/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/bits/errno.h
@@ -16,24 +16,29 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-/* Older Linux versions also had no ECANCELED error code.  */
-# ifndef ECANCELED
-#  define ECANCELED	125
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		125
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		130
+# endif
+
+#ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	131
 # endif
 
@@ -45,22 +50,4 @@
 #  define EHWPOISON		133
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	84	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/errno.h b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
index ce6bebe8b0..2ccc30ac75 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
@@ -16,17 +16,22 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux also has no ECANCELED error code.  Since it is not used here
-   we define it to an invalid value.  */
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
 # ifndef ECANCELED
-#  define ECANCELED	ECANCELLED
+#  define ECANCELED		253
 # endif
 
 # ifndef EOWNERDEAD
@@ -45,22 +50,4 @@
 #  define EHWPOISON		257
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	47	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/mips/bits/errno.h b/sysdeps/unix/sysv/linux/mips/bits/errno.h
index fa62e1fc83..84dcf0204d 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/errno.h
@@ -16,23 +16,28 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	158
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		158
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		165
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	166
 # endif
 
@@ -44,22 +49,4 @@
 #  define EHWPOISON		168
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	88	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/errno.h b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
index 4a8d8a0879..afa22beb15 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
@@ -16,23 +16,29 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	127
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		127
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		132
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	133
 # endif
 
@@ -44,22 +50,4 @@
 #  define EHWPOISON		135
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	122	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/x86_64/fpu/s_cosf.S b/sysdeps/x86_64/fpu/s_cosf.S
index e9fdc7e56e..7acafcd1be 100644
--- a/sysdeps/x86_64/fpu/s_cosf.S
+++ b/sysdeps/x86_64/fpu/s_cosf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/x86_64/fpu/s_sincosf.S b/sysdeps/x86_64/fpu/s_sincosf.S
index e6ed81ed91..fd35a3153b 100644
--- a/sysdeps/x86_64/fpu/s_sincosf.S
+++ b/sysdeps/x86_64/fpu/s_sincosf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/x86_64/fpu/s_sinf.S b/sysdeps/x86_64/fpu/s_sinf.S
index 0aa5d43d8c..253ba7d6f0 100644
--- a/sysdeps/x86_64/fpu/s_sinf.S
+++ b/sysdeps/x86_64/fpu/s_sinf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
