diff --git a/Makeconfig b/Makeconfig
index 80aed2a987..a282b1f65a 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1139,6 +1139,19 @@ $(common-objpfx)dl-tunable-list.stmp: \
 	touch $@
 endif
 
+# Build errno-enum.h early, ditto.
+before-compile += $(common-objpfx)bits/errno-enum.h
+common-generated += bits/error_t.h bits/errno-enum.stmp
+$(common-objpfx)bits/errno-enum.h: $(common-objpfx)bits/errno-enum.stmp; @:
+$(common-objpfx)bits/errno-enum.stmp: $(..)scripts/make-errno-enum.sh \
+				      bits/errno.h
+	[ -d $(common-objpfx)bits ] || mkdir $(common-objpfx)bits
+	CC="$(CC)" AWK="$(AWK)" \
+	    $(SHELL) $(..)scripts/make-errno-enum.sh $(+includes) \
+	    > ${@:stmp=T}
+	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
+	touch $@
+
 # The name under which the run-time dynamic linker is installed.
 # We are currently going for the convention that `/lib/ld.so.1'
 # names the SVR4/ELF ABI-compliant dynamic linker.
diff --git a/NEWS b/NEWS
index 71a9ad6053..1b96b3897d 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,11 @@ Version 2.26
   supported operating systems.  In this context, it will only define the
   Exxxx constants, as preprocessor macros expanding to integer literals.
 
+* error_t, a debugging aid, is now available on all supported operating
+  systems for programs compiled with GCC 4.5 or higher.  'p (error_t) errno'
+  in GDB will print the Exxxx constant corresponding to the current value of
+  errno.
+
 * 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/scripts/make-errno-enum.sh b/scripts/make-errno-enum.sh
new file mode 100644
index 0000000000..30b00a5b42
--- /dev/null
+++ b/scripts/make-errno-enum.sh
@@ -0,0 +1,69 @@
+#! /bin/sh
+# Script to produce bits/error_t.h.
+
+# Copyright (C) 2017 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# This script is invoked with no input.
+# AWK and CC are expected to be set in the environment.
+# "$@" is expected to be a sequence of -I switches to pass to the compiler.
+# The generated error_t.h is written to stdout.
+
+set -e
+
+# Note: the steps below that may fail under normal circumstances are
+# carefully arranged to be at the ends of pipelines.
+tmp1=`mktemp -t me1.XXXXXXXXX`
+tmp2=`mktemp -t me2.XXXXXXXXX`
+trap "rm -f '$tmp1' '$tmp2'" 0
+
+# Note: the expansion of $CC should be word-split, as it may contain
+# command line switches (e.g. "gcc -m32 -march=i486").
+# We cannot include errno.h at this point because it will try to include
+# the file we haven't yet generated.
+printf '#include <features.h>\n#include <bits/errno.h>\n' |
+    $CC -E -dM -xc -D_GNU_SOURCE -D_ERRNO_H "$@" - > "$tmp1"
+
+LC_ALL=C sort -n -k3 < "$tmp1" | "$AWK" > "$tmp2" '
+  /^#define E[A-Z0-9][A-Z0-9_]* [^E]/ {
+    name = $2;
+    printf("\n#ifdef %s\n# pragma push_macro (\"%s\")\n# undef %s\n  %s =\n",
+           name, name, name, name);
+    printf("# pragma pop_macro (\"%s\")\n    %s,\n#endif\n",
+           name, name);
+  }
+'
+
+echo '/* Errno codes as enum constants.'
+echo '   This file was generated by make-errno-enum.sh from bits/errno.h.  */'
+echo
+echo '#ifndef _BITS_ERRNO_ENUM_H'
+echo '#define _BITS_ERRNO_ENUM_H 1'
+echo
+echo 'enum __error_t_codes'
+echo '{'
+echo '  /* Zero indicates success.  Including this entry may prevent'
+echo '     warnings from some compilers if "case 0" appears in a switch'
+echo '     statement over an error_t value.  */'
+echo '  ESUCCESS = 0,'
+cat "$tmp2"
+echo
+echo '  /* Force the enum to be a signed type.  */'
+echo '  __FORCE_ERROR_T_CODES_SIGNED = -1'
+echo '};'
+echo
+echo '#endif /* bits/errno-enum.h.  */'
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9b0acce8cc..5e3d6e61ed 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -25,7 +25,7 @@ include ../Makeconfig
 headers	:= stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h      \
 	   monetary.h bits/monetary-ldbl.h				      \
 	   inttypes.h stdint.h bits/wordsize.h				      \
-	   errno.h sys/errno.h bits/errno.h				      \
+	   errno.h sys/errno.h bits/errno.h bits/errno-enum.h		      \
 	   ucontext.h sys/ucontext.h					      \
 	   alloca.h fmtmsg.h						      \
 	   bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h	      \
diff --git a/stdlib/errno.h b/stdlib/errno.h
index 118525c8fd..4514da4eb9 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -45,11 +45,18 @@ extern int *__errno_location (void) __THROW __attribute_const__;
 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.  */
+/* The type error_t, a debugging aid.  With sufficiently new compilers
+   you can type 'p (error_t) errno' in GDB and see the symbolic name
+   of the errno value.  Also used to make the return value of certain
+   GNU extension functions more self-documenting.  */
 #   ifndef __error_t_defined
 #    define __error_t_defined 1
+#    if __GNUC_PREREQ (4, 5)
+#     include <bits/errno-enum.h>
+typedef enum __error_t_codes error_t;
+#     else
 typedef int error_t;
+#     endif
 #   endif
 
 #  endif /* __USE_GNU */
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index 8f3c210001..81e76be70d 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -13,323 +13,109 @@
 # error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#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 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
-};
-
-/* 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.  */
-# if !defined __error_t_defined && defined __USE_GNU
-#  define __error_t_defined 1
-typedef enum __error_t_codes error_t;
-# endif
-
-#endif /* not __ASSEMBLER__ */
-
-/* The C standard requires that all of the E-constants be
-   defined as macros.  */
-
-#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
+/* The Hurd uses Mach error system 0x10, subsystem 0.  */
+#define EPERM                          0x40000001	/* Operation not permitted */
+#define ENOENT                         0x40000002	/* No such file or directory */
+#define ESRCH                          0x40000003	/* No such process */
+#define EINTR                          0x40000004	/* Interrupted system call */
+#define EIO                            0x40000005	/* Input/output error */
+#define ENXIO                          0x40000006	/* No such device or address */
+#define E2BIG                          0x40000007	/* Argument list too long */
+#define ENOEXEC                        0x40000008	/* Exec format error */
+#define EBADF                          0x40000009	/* Bad file descriptor */
+#define ECHILD                         0x4000000a	/* No child processes */
+#define EDEADLK                        0x4000000b	/* Resource deadlock avoided */
+#define ENOMEM                         0x4000000c	/* Cannot allocate memory */
+#define EACCES                         0x4000000d	/* Permission denied */
+#define EFAULT                         0x4000000e	/* Bad address */
+#define ENOTBLK                        0x4000000f	/* Block device required */
+#define EBUSY                          0x40000010	/* Device or resource busy */
+#define EEXIST                         0x40000011	/* File exists */
+#define EXDEV                          0x40000012	/* Invalid cross-device link */
+#define ENODEV                         0x40000013	/* No such device */
+#define ENOTDIR                        0x40000014	/* Not a directory */
+#define EISDIR                         0x40000015	/* Is a directory */
+#define EINVAL                         0x40000016	/* Invalid argument */
+#define EMFILE                         0x40000018	/* Too many open files */
+#define ENFILE                         0x40000017	/* Too many open files in system */
+#define ENOTTY                         0x40000019	/* Inappropriate ioctl for device */
+#define ETXTBSY                        0x4000001a	/* Text file busy */
+#define EFBIG                          0x4000001b	/* File too large */
+#define ENOSPC                         0x4000001c	/* No space left on device */
+#define ESPIPE                         0x4000001d	/* Illegal seek */
+#define EROFS                          0x4000001e	/* Read-only file system */
+#define EMLINK                         0x4000001f	/* Too many links */
+#define EPIPE                          0x40000020	/* Broken pipe */
+#define EDOM                           0x40000021	/* Numerical argument out of domain */
+#define ERANGE                         0x40000022	/* Numerical result out of range */
+#define EAGAIN                         0x40000023	/* Resource temporarily unavailable */
 #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
+#define EINPROGRESS                    0x40000024	/* Operation now in progress */
+#define EALREADY                       0x40000025	/* Operation already in progress */
+#define ENOTSOCK                       0x40000026	/* Socket operation on non-socket */
+#define EMSGSIZE                       0x40000028	/* Message too long */
+#define EPROTOTYPE                     0x40000029	/* Protocol wrong type for socket */
+#define ENOPROTOOPT                    0x4000002a	/* Protocol not available */
+#define EPROTONOSUPPORT                0x4000002b	/* Protocol not supported */
+#define ESOCKTNOSUPPORT                0x4000002c	/* Socket type not supported */
+#define EOPNOTSUPP                     0x4000002d	/* Operation not supported */
+#define EPFNOSUPPORT                   0x4000002e	/* Protocol family not supported */
+#define EAFNOSUPPORT                   0x4000002f	/* Address family not supported by protocol */
+#define EADDRINUSE                     0x40000030	/* Address already in use */
+#define EADDRNOTAVAIL                  0x40000031	/* Cannot assign requested address */
+#define ENETDOWN                       0x40000032	/* Network is down */
+#define ENETUNREACH                    0x40000033	/* Network is unreachable */
+#define ENETRESET                      0x40000034	/* Network dropped connection on reset */
+#define ECONNABORTED                   0x40000035	/* Software caused connection abort */
+#define ECONNRESET                     0x40000036	/* Connection reset by peer */
+#define ENOBUFS                        0x40000037	/* No buffer space available */
+#define EISCONN                        0x40000038	/* Transport endpoint is already connected */
+#define ENOTCONN                       0x40000039	/* Transport endpoint is not connected */
+#define EDESTADDRREQ                   0x40000027	/* Destination address required */
+#define ESHUTDOWN                      0x4000003a	/* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS                   0x4000003b	/* Too many references: cannot splice */
+#define ETIMEDOUT                      0x4000003c	/* Connection timed out */
+#define ECONNREFUSED                   0x4000003d	/* Connection refused */
+#define ELOOP                          0x4000003e	/* Too many levels of symbolic links */
+#define ENAMETOOLONG                   0x4000003f	/* File name too long */
+#define EHOSTDOWN                      0x40000040	/* Host is down */
+#define EHOSTUNREACH                   0x40000041	/* No route to host */
+#define ENOTEMPTY                      0x40000042	/* Directory not empty */
+#define EPROCLIM                       0x40000043	/* Too many processes */
+#define EUSERS                         0x40000044	/* Too many users */
+#define EDQUOT                         0x40000045	/* Disk quota exceeded */
+#define ESTALE                         0x40000046	/* Stale file handle */
+#define EREMOTE                        0x40000047	/* Object is remote */
+#define EBADRPC                        0x40000048	/* RPC struct is bad */
+#define ERPCMISMATCH                   0x40000049	/* RPC version wrong */
+#define EPROGUNAVAIL                   0x4000004a	/* RPC program not available */
+#define EPROGMISMATCH                  0x4000004b	/* RPC program version wrong */
+#define EPROCUNAVAIL                   0x4000004c	/* RPC bad procedure for program */
+#define ENOLCK                         0x4000004d	/* No locks available */
+#define EFTYPE                         0x4000004f	/* Inappropriate file type or format */
+#define EAUTH                          0x40000050	/* Authentication error */
+#define ENEEDAUTH                      0x40000051	/* Need authenticator */
+#define ENOSYS                         0x4000004e	/* Function not implemented */
+#define ENOTSUP                        0x40000076	/* Not supported */
+#define EILSEQ                         0x4000006a	/* Invalid or incomplete multibyte or wide character */
+#define EBACKGROUND                    0x40000064	/* Inappropriate operation for background process */
+#define EDIED                          0x40000065	/* Translator died */
+#define ED                             0x40000066	/* ? */
+#define EGREGIOUS                      0x40000067	/* You really blew it this time */
+#define EIEIO                          0x40000068	/* Computer bought the farm */
+#define EGRATUITOUS                    0x40000069	/* Gratuitous error */
+#define EBADMSG                        0x4000006b	/* Bad message */
+#define EIDRM                          0x4000006c	/* Identifier removed */
+#define EMULTIHOP                      0x4000006d	/* Multihop attempted */
+#define ENODATA                        0x4000006e	/* No data available */
+#define ENOLINK                        0x4000006f	/* Link has been severed */
+#define ENOMSG                         0x40000070	/* No message of desired type */
+#define ENOSR                          0x40000071	/* Out of streams resources */
+#define ENOSTR                         0x40000072	/* Device not a stream */
+#define EOVERFLOW                      0x40000073	/* Value too large for defined data type */
+#define EPROTO                         0x40000074	/* Protocol error */
+#define ETIME                          0x40000075	/* Timer expired */
+#define ECANCELED                      0x40000077	/* Operation canceled */
 
 /* Errors from <mach/message.h>.  */
 #define EMACH_SEND_IN_PROGRESS         0x10000001
@@ -390,28 +176,28 @@ typedef enum __error_t_codes error_t;
 #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
+#define EMIG_TYPE_ERROR                -300	/* client type check failure */
+#define EMIG_REPLY_MISMATCH            -301	/* wrong reply message ID */
+#define EMIG_REMOTE_ERROR              -302	/* server detected error */
+#define EMIG_BAD_ID                    -303	/* bad request message ID */
+#define EMIG_BAD_ARGUMENTS             -304	/* server type check failure */
+#define EMIG_NO_REPLY                  -305	/* no reply should be sent */
+#define EMIG_EXCEPTION                 -306	/* server raised exception */
+#define EMIG_ARRAY_TOO_LARGE           -307	/* array not large enough */
+#define EMIG_SERVER_DIED               -308	/* server died */
+#define EMIG_DESTROY_REQUEST           -309	/* destroy request with no reply */
 
 /* 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 ED_IO_ERROR                    2500	/* hardware IO error */
+#define ED_WOULD_BLOCK                 2501	/* would block, but D_NOWAIT set */
+#define ED_NO_SUCH_DEVICE              2502	/* no such device */
+#define ED_ALREADY_OPEN                2503	/* exclusive-use device already open */
+#define ED_DEVICE_DOWN                 2504	/* device has been shut down */
+#define ED_INVALID_OPERATION           2505	/* bad operation for device */
+#define ED_INVALID_RECNUM              2506	/* invalid record (block) number */
+#define ED_INVALID_SIZE                2507	/* invalid IO size */
+#define ED_NO_MEMORY                   2508	/* memory allocation failure */
+#define ED_READ_ONLY                   2509	/* device cannot be written to */
 
 #define _HURD_ERRNOS 120
 
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index d1ed8c4877..daf2943c83 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -147,73 +147,22 @@ in_device_errors && $1 == "#endif" \
     in_device_errors = 0;
   }
 
-function print_errno_enum(maxseq)
+END \
 {
   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++)
+  print "/* The Hurd uses Mach error system 0x10, subsystem 0.  */";
+  for (i = 0; i < seq; i++)
     {
       if (i in annot)
 	print annot[i];
+      else if (i in etexts && etexts[i] != "")
+	printf("#define %-*s %s\t/* %s */\n",
+	       maxerrlen, econsts[i], errnos[i], etexts[i]);
       else
 	printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]);
     }
   print "";
   printf("#define _HURD_ERRNOS %d\n", maxerrno+1);
+  print "";
+  print "#endif /* bits/errno.h.  */";
 }
-
-END \
-  {
-    print_errno_enum(seq);
-    print_errno_defines(seq);
-
-    print "";
-    print "#endif /* bits/errno.h.  */";
-  }
