about summary refs log tree commit diff
path: root/sysdeps/mach/hurd
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r--sysdeps/mach/hurd/Dist17
-rw-r--r--sysdeps/mach/hurd/Subdirs10
-rw-r--r--sysdeps/mach/hurd/alpha/Dist1
-rw-r--r--sysdeps/mach/hurd/alpha/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/bits/ioctls.h1
-rw-r--r--sysdeps/mach/hurd/bits/posix_opt.h108
-rw-r--r--sysdeps/mach/hurd/bits/stat.h7
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.h8
-rw-r--r--sysdeps/mach/hurd/errno.c1
-rw-r--r--sysdeps/mach/hurd/euidaccess.c3
-rw-r--r--sysdeps/mach/hurd/faccessat.c70
-rw-r--r--sysdeps/mach/hurd/fchmodat.c44
-rw-r--r--sysdeps/mach/hurd/fchownat.c46
-rw-r--r--sysdeps/mach/hurd/fdopendir.c58
-rw-r--r--sysdeps/mach/hurd/fork.c5
-rw-r--r--sysdeps/mach/hurd/fsetxattr.c34
-rw-r--r--sysdeps/mach/hurd/fxstatat.c33
-rw-r--r--sysdeps/mach/hurd/fxstatat64.c46
-rw-r--r--sysdeps/mach/hurd/getdents.c2
-rw-r--r--sysdeps/mach/hurd/getpeername.c14
-rw-r--r--sysdeps/mach/hurd/getresgid.c14
-rw-r--r--sysdeps/mach/hurd/getresuid.c14
-rw-r--r--sysdeps/mach/hurd/getsid.c3
-rw-r--r--sysdeps/mach/hurd/getxattr.c35
-rw-r--r--sysdeps/mach/hurd/hppa/bits/sigcontext.h94
-rw-r--r--sysdeps/mach/hurd/hppa/trampoline.c230
-rw-r--r--sysdeps/mach/hurd/i386/Dist3
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c25
-rw-r--r--sysdeps/mach/hurd/i386/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/i386/tls.h4
-rw-r--r--sysdeps/mach/hurd/i386/trampoline.c7
-rw-r--r--sysdeps/mach/hurd/ifreq.h (renamed from sysdeps/mach/hurd/ifreq.c)21
-rw-r--r--sysdeps/mach/hurd/init-posix.c2
-rw-r--r--sysdeps/mach/hurd/ioctl.c22
-rw-r--r--sysdeps/mach/hurd/jmp-unwind.c20
-rw-r--r--sysdeps/mach/hurd/lgetxattr.c36
-rw-r--r--sysdeps/mach/hurd/linkat.c66
-rw-r--r--sysdeps/mach/hurd/listxattr.c35
-rw-r--r--sysdeps/mach/hurd/lsetxattr.c37
-rw-r--r--sysdeps/mach/hurd/mig-reply.c4
-rw-r--r--sysdeps/mach/hurd/mips/Dist3
-rw-r--r--sysdeps/mach/hurd/mips/bits/sigcontext.h80
-rw-r--r--sysdeps/mach/hurd/mips/dl-machine.c132
-rw-r--r--sysdeps/mach/hurd/mips/exc2signal.c97
-rw-r--r--sysdeps/mach/hurd/mips/init-fault.c (renamed from sysdeps/mach/hurd/flistxattr.c)33
-rw-r--r--sysdeps/mach/hurd/mips/init-first.c414
-rw-r--r--sysdeps/mach/hurd/mips/intr-msg.h127
-rw-r--r--sysdeps/mach/hurd/mips/longjmp-ctx.c (renamed from sysdeps/mach/hurd/fremovexattr.c)33
-rw-r--r--sysdeps/mach/hurd/mips/longjmp-ts.c45
-rw-r--r--sysdeps/mach/hurd/mips/sigreturn.c223
-rw-r--r--sysdeps/mach/hurd/mips/trampoline.c292
-rw-r--r--sysdeps/mach/hurd/mkdirat.c42
-rw-r--r--sysdeps/mach/hurd/nfs/nfs.h (renamed from sysdeps/mach/hurd/fgetxattr.c)26
-rw-r--r--sysdeps/mach/hurd/open.c8
-rw-r--r--sysdeps/mach/hurd/open64.c1
-rw-r--r--sysdeps/mach/hurd/openat.c62
-rw-r--r--sysdeps/mach/hurd/openat64.c1
-rw-r--r--sysdeps/mach/hurd/opendir.c75
-rw-r--r--sysdeps/mach/hurd/powerpc/Dist1
-rw-r--r--sysdeps/mach/hurd/powerpc/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/powerpc/register-dump.h4
-rw-r--r--sysdeps/mach/hurd/powerpc/trampoline.c7
-rw-r--r--sysdeps/mach/hurd/ppoll.c30
-rw-r--r--sysdeps/mach/hurd/profil.c4
-rw-r--r--sysdeps/mach/hurd/readdir64_r.c2
-rw-r--r--sysdeps/mach/hurd/recv.c6
-rw-r--r--sysdeps/mach/hurd/removexattr.c35
-rw-r--r--sysdeps/mach/hurd/setitimer.c12
-rw-r--r--sysdeps/mach/hurd/setresgid.c11
-rw-r--r--sysdeps/mach/hurd/setresuid.c11
-rw-r--r--sysdeps/mach/hurd/setxattr.c36
-rw-r--r--sysdeps/mach/hurd/sigaltstack.c2
-rw-r--r--sysdeps/mach/hurd/symlinkat.c74
-rw-r--r--sysdeps/mach/hurd/tls.h9
-rw-r--r--sysdeps/mach/hurd/unlinkat.c55
-rw-r--r--sysdeps/mach/hurd/xmknod.c86
-rw-r--r--sysdeps/mach/hurd/xmknodat.c118
77 files changed, 2049 insertions, 1337 deletions
diff --git a/sysdeps/mach/hurd/Dist b/sysdeps/mach/hurd/Dist
new file mode 100644
index 0000000000..52c84297cb
--- /dev/null
+++ b/sysdeps/mach/hurd/Dist
@@ -0,0 +1,17 @@
+cthreads.c
+errlist.c
+errnos.awk
+err_hurd.sub
+libc-ldscript
+libc_p-ldscript
+bits/libc-tsd.h
+net/ethernet.h
+net/if_arp.h
+net/if_ether.h
+net/if_ppp.h
+net/route.h
+nfs/nfs.h
+set-init.c
+siglist.h
+statfsconv.c
+xstatconv.c
diff --git a/sysdeps/mach/hurd/Subdirs b/sysdeps/mach/hurd/Subdirs
index 7a7757582a..16b8348437 100644
--- a/sysdeps/mach/hurd/Subdirs
+++ b/sysdeps/mach/hurd/Subdirs
@@ -1,9 +1 @@
-# This file says that the hurd subdirectory should appear before all others.
-# The mach and hurd subdirectories have many generated header files which
-# much of the rest of the library depends on, so it is best to build them
-# first (and mach before hurd, at that).  The before-compile additions in
-# sysdeps/{mach,hurd}/Makefile should make it reliably work for these files
-# not to exist when making in other directories, but it will be slower that
-# way with more somewhat expensive `make' invocations.
-
-first hurd
+hurd
diff --git a/sysdeps/mach/hurd/alpha/Dist b/sysdeps/mach/hurd/alpha/Dist
new file mode 100644
index 0000000000..c58180257e
--- /dev/null
+++ b/sysdeps/mach/hurd/alpha/Dist
@@ -0,0 +1 @@
+static-start.S
diff --git a/sysdeps/mach/hurd/alpha/longjmp-ts.c b/sysdeps/mach/hurd/alpha/longjmp-ts.c
index f472dbcb30..b271d6d2a9 100644
--- a/sysdeps/mach/hurd/alpha/longjmp-ts.c
+++ b/sysdeps/mach/hurd/alpha/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  Alpha version.
-   Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2002 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
@@ -19,7 +19,6 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
-#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h
index 06a73df75e..206058bf2f 100644
--- a/sysdeps/mach/hurd/bits/ioctls.h
+++ b/sysdeps/mach/hurd/bits/ioctls.h
@@ -226,7 +226,6 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 };
 #define	SIOCSIFADDR	_IOW('i', 12, struct ifreq)	/* set ifnet address */
 #define	OSIOCGIFADDR	_IOWR('i',13, struct ifreq)	/* get ifnet address */
 #define	SIOCGIFADDR	_IOWR('i',33, struct ifreq)	/* get ifnet address */
-#define	SIOCGIFHWADDR	_IOWR('i',39, struct ifreq)	/* get hwaddress */
 #define	SIOCSIFDSTADDR	_IOW('i', 14, struct ifreq)	/* set p-p address */
 #define	OSIOCGIFDSTADDR	_IOWR('i',15, struct ifreq)	/* get p-p address */
 #define	SIOCGIFDSTADDR	_IOWR('i',34, struct ifreq)	/* get p-p address */
diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h
index 6747bc276e..326bebff7f 100644
--- a/sysdeps/mach/hurd/bits/posix_opt.h
+++ b/sysdeps/mach/hurd/bits/posix_opt.h
@@ -1,5 +1,5 @@
 /* Define POSIX options for GNU/Hurd.
-   Copyright (C) 1998,2000,2001,2002,2006 Free Software Foundation, Inc.
+   Copyright (C) 1998,2000,2001,2002 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
@@ -31,6 +31,13 @@
 /* Processes have a saved set-user-ID and a saved set-group-ID.  */
 #define	_POSIX_SAVED_IDS	1
 
+#if 0				/* XXX implement aio_* */
+/* Asynchronous I/O is supported.  */
+#define _POSIX_ASYNCHRONOUS_IO	1
+/* Alternative name for Unix98.  */
+#define _LFS_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
+#endif
+
 /* Synchronizing file data is supported, but msync is missing.  */
 #undef _POSIX_SYNCHRONIZED_IO
 
@@ -40,15 +47,15 @@
 /* Mapping of files to memory is supported.  */
 #define	_POSIX_MAPPED_FILES	200112L
 
-/* Locking of all memory could be supported in future.  */
-#define	_POSIX_MEMLOCK	0
-
 /* Locking of ranges of memory is supported.  */
 #define	_POSIX_MEMLOCK_RANGE	200112L
 
 /* Setting of memory protections is supported.  */
 #define	_POSIX_MEMORY_PROTECTION	200112L
 
+/* POSIX.4 shared memory objects are supported (using regular files).  */
+#define _POSIX_SHARED_MEMORY_OBJECTS	_POSIX_MAPPED_FILES
+
 /* Elements of the `c_cc' member of `struct termios' structure
    can be disabled by using the value _POSIX_VDISABLE.  */
 #define _POSIX_VDISABLE			((unsigned char) -1)
@@ -60,106 +67,13 @@
 #undef _POSIX_NO_TRUNC		/* Overlong file names get error?  */
 #undef _POSIX_SYNC_IO		/* File supports O_SYNC et al?  */
 
-
-/* We do not have the POSIX threads interface.  */
-#define _POSIX_THREADS	-1
-
-/* We have the reentrant functions described in POSIX.  */
-#define _POSIX_REENTRANT_FUNCTIONS      1
-#define _POSIX_THREAD_SAFE_FUNCTIONS	200112L
-
-/* These are all things that won't be supported when _POSIX_THREADS is not.  */
-#define _POSIX_THREAD_PRIORITY_SCHEDULING	-1
-#define _POSIX_THREAD_ATTR_STACKSIZE		-1
-#define _POSIX_THREAD_ATTR_STACKADDR		-1
-#define _POSIX_SEMAPHORES			-1
-
-/* Real-time signals are not yet supported.  */
-#define _POSIX_REALTIME_SIGNALS	-1
-
-/* Asynchronous I/O might supported with the existing ABI.  */
-#define _POSIX_ASYNCHRONOUS_IO	0
-/* Alternative name for Unix98.  */
-#define _LFS_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
-
-/* The LFS support in asynchronous I/O is also available.  */
-#define _LFS64_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
-
-/* The rest of the LFS is also available.  */
-#define _LFS_LARGEFILE		1
-#define _LFS64_LARGEFILE	1
-#define _LFS64_STDIO		1
-
-/* POSIX.4 shared memory objects are supported (using regular files).  */
-#define _POSIX_SHARED_MEMORY_OBJECTS	_POSIX_MAPPED_FILES
-
-/* CPU-time clocks support needs to be checked at runtime.  */
-#define _POSIX_CPUTIME	0
-
-/* Clock support in threads must be also checked at runtime.  */
-#define _POSIX_THREAD_CPUTIME	0
-
 /* GNU libc provides regular expression handling.  */
 #define _POSIX_REGEXP	1
 
-/* Reader/Writer locks are not available.  */
-#define _POSIX_READER_WRITER_LOCKS	-1
-
 /* We have a POSIX shell.  */
 #define _POSIX_SHELL	1
 
-/* We cannot support the Timeouts option without _POSIX_THREADS.  */
-#define _POSIX_TIMEOUTS	-1
-
 /* The `spawn' function family is supported.  */
 #define _POSIX_SPAWN	200112L
 
-/* We do not have POSIX timers, but could in future without ABI change.  */
-#define _POSIX_TIMERS	0
-
-/* The barrier functions are not available.  */
-#define _POSIX_BARRIERS	-1
-
-/* POSIX message queues could be available in future.  */
-#define	_POSIX_MESSAGE_PASSING	0
-
-/* Thread process-shared synchronization is not supported.  */
-#define _POSIX_THREAD_PROCESS_SHARED	-1
-
-/* The monotonic clock might be available.  */
-#define _POSIX_MONOTONIC_CLOCK	0
-
-/* The clock selection interfaces are available.  */
-#define _POSIX_CLOCK_SELECTION	200112L
-
-/* Advisory information interfaces could be available in future.  */
-#define _POSIX_ADVISORY_INFO	0
-
-/* IPv6 support is available.  */
-#define _POSIX_IPV6	200112L
-
-/* Raw socket support is available.  */
-#define _POSIX_RAW_SOCKETS	200112L
-
-/* We have at least one terminal.  */
-#define _POSIX2_CHAR_TERM	200112L
-
-/* Neither process nor thread sporadic server interfaces is available.  */
-#define _POSIX_SPORADIC_SERVER	-1
-#define _POSIX_THREAD_SPORADIC_SERVER	-1
-
-/* trace.h is not available.  */
-#define _POSIX_TRACE	-1
-#define _POSIX_TRACE_EVENT_FILTER	-1
-#define _POSIX_TRACE_INHERIT	-1
-#define _POSIX_TRACE_LOG	-1
-
-/* Typed memory objects are not available.  */
-#define _POSIX_TYPED_MEMORY_OBJECTS	-1
-
-/* No support for priority inheritance or protection so far.  */
-#define _POSIX_THREAD_PRIO_INHERIT	-1
-#define _POSIX_THREAD_PRIO_PROTECT	-1
-
-
 #endif /* bits/posix_opt.h */
diff --git a/sysdeps/mach/hurd/bits/stat.h b/sysdeps/mach/hurd/bits/stat.h
index c3f96660cc..172bc5ea8e 100644
--- a/sysdeps/mach/hurd/bits/stat.h
+++ b/sysdeps/mach/hurd/bits/stat.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,93,94,96,97,99,2000,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 93, 94, 96, 97, 99, 2000 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
@@ -182,11 +182,8 @@ struct stat64
 /* All the bits relevant to translators */
 #define S_ITRANS	000070000000
 
-/* Definitely no mmaps to this.  */
-#define S_IMMAP0	000100000000
-
 /* ALL the unused bits.  */
-#define	S_ISPARE	(~(S_IFMT|S_ITRANS|S_INOCACHE|S_IMMAP0|    \
+#define	S_ISPARE	(~(S_IFMT|S_ITRANS|S_INOCACHE|    \
 			   S_IUSEUNK|S_IUNKNOWN|07777))
 #endif
 
diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h
index 4b21b779ef..2dc9b0a910 100644
--- a/sysdeps/mach/hurd/dl-sysdep.h
+++ b/sysdeps/mach/hurd/dl-sysdep.h
@@ -1,5 +1,5 @@
 /* System-specific settings for dynamic linker code.  Hurd version.
-   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -23,9 +23,3 @@
    (open, mmap, etc).  */
 
 #define RTLD_PRIVATE_ERRNO 0
-
-#ifdef SHARED
-/* _dl_argv cannot be attribute_relro, because the stack-switching
-   libc initializer for using cthreads might write into it.  */
-# define DL_ARGV_NOT_RELRO 1
-#endif
diff --git a/sysdeps/mach/hurd/errno.c b/sysdeps/mach/hurd/errno.c
deleted file mode 100644
index a29091b5e2..0000000000
--- a/sysdeps/mach/hurd/errno.c
+++ /dev/null
@@ -1 +0,0 @@
-/* No definition of `errno' variable on the Hurd.  */
diff --git a/sysdeps/mach/hurd/euidaccess.c b/sysdeps/mach/hurd/euidaccess.c
index 57f2a015cc..4e72e2abb3 100644
--- a/sysdeps/mach/hurd/euidaccess.c
+++ b/sysdeps/mach/hurd/euidaccess.c
@@ -1,5 +1,5 @@
 /* Test for access to FILE using effective UID and GID.  Hurd version.
-   Copyright (C) 1991, 1995, 1997, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1995, 1997 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
@@ -57,4 +57,3 @@ __euidaccess (file, type)
   return 0;
 }
 weak_alias (__euidaccess, euidaccess)
-weak_alias (__euidaccess, eaccess)
diff --git a/sysdeps/mach/hurd/faccessat.c b/sysdeps/mach/hurd/faccessat.c
deleted file mode 100644
index bb3c9fe19f..0000000000
--- a/sysdeps/mach/hurd/faccessat.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Test for access to file, relative to open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-int
-faccessat (fd, file, type, flag)
-     int fd;
-     const char *file;
-     int type;
-     int flag;
-{
-  error_t err;
-  file_t port;
-  int allowed, flags;
-
-  if ((flag & AT_EACCESS) == 0)
-    {
-      if (fd == AT_FDCWD || file[0] == '/')
-	return __access (file, type);
-      __set_errno (ENOTSUP);	/* XXX later */
-      return -1;
-    }
-
-  port = __file_name_lookup_at (fd, flag &~ AT_EACCESS, file, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-
-  /* Find out what types of access we are allowed to this file.  */
-  err = __file_check_access (port, &allowed);
-  __mach_port_deallocate (__mach_task_self (), port);
-  if (err)
-    return __hurd_fail (err);
-
-  flags = 0;
-  if (type & R_OK)
-    flags |= O_READ;
-  if (type & W_OK)
-    flags |= O_WRITE;
-  if (type & X_OK)
-    flags |= O_EXEC;
-
-  if (flags & ~allowed)
-    /* We are not allowed all the requested types of access.  */
-    return __hurd_fail (EACCES);
-
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/fchmodat.c b/sysdeps/mach/hurd/fchmodat.c
deleted file mode 100644
index d27e845274..0000000000
--- a/sysdeps/mach/hurd/fchmodat.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Change the protections of file relative to open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-int
-fchmodat (fd, file, mode, flag)
-     int fd;
-     const char *file;
-     mode_t mode;
-     int flag;
-{
-  error_t err;
-  file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = __file_chmod (port, mode);
-  __mach_port_deallocate (__mach_task_self (), port);
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/fchownat.c b/sysdeps/mach/hurd/fchownat.c
deleted file mode 100644
index 1b99b29272..0000000000
--- a/sysdeps/mach/hurd/fchownat.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Change owner and group of a file relative to open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-/* Change the owner and group of FILE.  */
-int
-fchownat (fd, file, owner, group, flag)
-     int fd;
-     const char *file;
-     uid_t owner;
-     gid_t group;
-     int flag;
-{
-  error_t err;
-  file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = __file_chown (port, owner, group);
-  __mach_port_deallocate (__mach_task_self (), port);
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/fdopendir.c b/sysdeps/mach/hurd/fdopendir.c
deleted file mode 100644
index 016f825f1d..0000000000
--- a/sysdeps/mach/hurd/fdopendir.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Open a directory stream from a file descriptor.  Hurd version.
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <dirent.h>
-#include <errno.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <fcntl.h>
-
-DIR *_hurd_fd_opendir (struct hurd_fd *d); /* opendir.c */
-
-/* Open a directory stream on FD.  */
-DIR *
-__fdopendir (int fd)
-{
-  struct hurd_fd *d = _hurd_fd_get (fd);
-
-  if (d == NULL)
-    {
-      errno = EBADF;
-      return NULL;
-    }
-
-  /* Ensure that it's a directory.  */
-  error_t err = HURD_FD_PORT_USE
-    (d, ({
-	file_t dir = __file_name_lookup_under (port, "/",
-					       O_DIRECTORY | O_NOTRANS, 0);;
-	if (dir != MACH_PORT_NULL)
-	  __mach_port_deallocate (__mach_task_self (), dir);
-	dir != MACH_PORT_NULL ? 0 : errno;
-      }));
-
-  if (err)
-    {
-      errno = err;
-      return NULL;
-    }
-
-  return _hurd_fd_opendir (d);
-}
-weak_alias (__fdopendir, fdopendir)
diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c
index fa7da60204..8728596915 100644
--- a/sysdeps/mach/hurd/fork.c
+++ b/sysdeps/mach/hurd/fork.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005
-	Free Software Foundation, Inc.
+/* Copyright (C) 1994,95,96,97,99,2001,02, 04 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
@@ -22,7 +21,7 @@
 #include <hurd.h>
 #include <hurd/signal.h>
 #include <setjmp.h>
-#include <thread_state.h>
+#include "thread_state.h"
 #include <sysdep.h>		/* For stack growth direction.  */
 #include "set-hooks.h"
 #include <assert.h>
diff --git a/sysdeps/mach/hurd/fsetxattr.c b/sysdeps/mach/hurd/fsetxattr.c
deleted file mode 100644
index db8b676a06..0000000000
--- a/sysdeps/mach/hurd/fsetxattr.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <hurd/fd.h>
-
-ssize_t
-fsetxattr (int fd, const char *name, const void *value, size_t size, int flags)
-{
-  error_t err;
-
-  err = HURD_DPORT_USE (fd, _hurd_xattr_set (port, name, value, size, flags));
-
-  return err ? __hurd_dfail (fd, err) : 0;
-}
diff --git a/sysdeps/mach/hurd/fxstatat.c b/sysdeps/mach/hurd/fxstatat.c
deleted file mode 100644
index dd9d2796eb..0000000000
--- a/sysdeps/mach/hurd/fxstatat.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Get information about file named relative to open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/stat.h>
-
-#include "xstatconv.c"
-
-int
-__fxstatat (int vers, int fd, const char *filename, struct stat *buf, int flag)
-{
-  struct stat64 buf64;
-  return (__fxstatat64 (vers, fd, filename, &buf64, flag)
-	  ?: xstat64_conv (buf, &buf64));
-}
-libc_hidden_def (__fxstatat)
diff --git a/sysdeps/mach/hurd/fxstatat64.c b/sysdeps/mach/hurd/fxstatat64.c
deleted file mode 100644
index 6862e80d52..0000000000
--- a/sysdeps/mach/hurd/fxstatat64.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Get information about file named relative to open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-/* Get information about the file descriptor FD in BUF.  */
-int
-__fxstatat64 (int vers, int fd, const char *filename, struct stat64 *buf,
-	      int flag)
-{
-  error_t err;
-  io_t port;
-
-  if (vers != _STAT_VER)
-    return __hurd_fail (EINVAL);
-
-  port = __file_name_lookup_at (fd, flag, filename, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-
-  err = __io_stat (port, buf);
-  __mach_port_deallocate (__mach_task_self (), port);
-
-  return __hurd_fail (err);
-}
diff --git a/sysdeps/mach/hurd/getdents.c b/sysdeps/mach/hurd/getdents.c
index d15be3b8f3..4775f983b4 100644
--- a/sysdeps/mach/hurd/getdents.c
+++ b/sysdeps/mach/hurd/getdents.c
@@ -1 +1 @@
-#include <dirent/getdents.c>
+#include <sysdeps/generic/getdents.c>
diff --git a/sysdeps/mach/hurd/getpeername.c b/sysdeps/mach/hurd/getpeername.c
index 325b6fd75d..2e4f9f6a9d 100644
--- a/sysdeps/mach/hurd/getpeername.c
+++ b/sysdeps/mach/hurd/getpeername.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,1994,1997,1999,2000,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -47,22 +47,14 @@ __getpeername (int fd, __SOCKADDR_ARG addrarg, socklen_t *len)
 
   if (*len > buflen)
     *len = buflen;
-
+  
   if (buf != (char *) addr)
     {
       memcpy (addr, buf, *len);
       __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen);
     }
 
-  const sa_family_t family = type;
-  if (*len > offsetof (struct sockaddr, sa_family))
-    {
-      if (*len < (char *) (&addr->sa_family + 1) - (char *) addr)
-	memcpy (&addr->sa_family, &family,
-		*len - offsetof (struct sockaddr, sa_family));
-      else
-	addr->sa_family = family;
-    }
+  addr->sa_family = type;
 
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getresgid.c b/sysdeps/mach/hurd/getresgid.c
index 7847d213c4..a96aa49369 100644
--- a/sysdeps/mach/hurd/getresgid.c
+++ b/sysdeps/mach/hurd/getresgid.c
@@ -1,5 +1,5 @@
-/* getresgid -- fetch real group ID, effective group ID, and saved-set group ID
-   Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+/* getresgid -- fetch effective group ID, real group ID, and saved-set group ID
+   Copyright (C) 2002 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
@@ -22,13 +22,13 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Fetch the real group ID, effective group ID, and saved-set group ID,
+/* Fetch the effective group ID, real group ID, and saved-set group ID,
    of the calling process.  */
 int
-__getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
+__getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid)
 {
   error_t err;
-  gid_t real, eff, saved;
+  gid_t eff, real, saved;
 
   HURD_CRITICAL_BEGIN;
   __mutex_lock (&_hurd_id.lock);
@@ -42,8 +42,8 @@ __getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
       else
 	{
 	  real = _hurd_id.aux.gids[0];
+	  saved = _hurd_id.aux.ngids < 2 ? real :_hurd_id.aux.gids[1];
 	  eff = _hurd_id.gen.ngids < 1 ? real : _hurd_id.gen.gids[0];
-	  saved = _hurd_id.aux.ngids < 2 ? real : _hurd_id.aux.gids[1];
 	}
     }
 
@@ -53,8 +53,8 @@ __getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
   if (err)
     return __hurd_fail (err);
 
-  *rgid = real;
   *egid = eff;
+  *rgid = real;
   *sgid = saved;
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getresuid.c b/sysdeps/mach/hurd/getresuid.c
index 668e463a39..f4bfaeaf56 100644
--- a/sysdeps/mach/hurd/getresuid.c
+++ b/sysdeps/mach/hurd/getresuid.c
@@ -1,5 +1,5 @@
-/* getresuid -- fetch real user ID, effective user ID, and saved-set user ID
-   Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+/* getresuid -- fetch effective user ID, real user ID, and saved-set user ID
+   Copyright (C) 2002 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
@@ -22,13 +22,13 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Fetch the real user ID, effective user ID, and saved-set user ID,
+/* Fetch the effective user ID, real user ID, and saved-set user ID,
    of the calling process.  */
 int
-__getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
+__getresuid (uid_t *euid, uid_t *ruid, uid_t *suid)
 {
   error_t err;
-  uid_t real, eff, saved;
+  uid_t eff, real, saved;
 
   HURD_CRITICAL_BEGIN;
   __mutex_lock (&_hurd_id.lock);
@@ -42,8 +42,8 @@ __getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
       else
 	{
 	  real = _hurd_id.aux.uids[0];
+	  saved = _hurd_id.aux.nuids < 2 ? real :_hurd_id.aux.uids[1];
 	  eff = _hurd_id.gen.nuids < 1 ? real : _hurd_id.gen.uids[0];
-	  saved = _hurd_id.aux.nuids < 2 ? real : _hurd_id.aux.uids[1];
 	}
     }
 
@@ -53,8 +53,8 @@ __getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
   if (err)
     return __hurd_fail (err);
 
-  *ruid = real;
   *euid = eff;
+  *ruid = real;
   *suid = saved;
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getsid.c b/sysdeps/mach/hurd/getsid.c
index 9dcfa90fde..57c10c58b7 100644
--- a/sysdeps/mach/hurd/getsid.c
+++ b/sysdeps/mach/hurd/getsid.c
@@ -28,9 +28,6 @@ getsid (pid_t pid)
   error_t err;
   pid_t sid;
 
-  if (pid == 0)
-    pid = _hurd_pid;
-
   err = __USEPORT (PROC, __proc_getsid (port, pid, &sid));
   if (err)
     return (pid_t) __hurd_fail (err);
diff --git a/sysdeps/mach/hurd/getxattr.c b/sysdeps/mach/hurd/getxattr.c
deleted file mode 100644
index 8f688a1d2f..0000000000
--- a/sysdeps/mach/hurd/getxattr.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-
-ssize_t
-getxattr (const char *path, const char *name, void *value, size_t size)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_get (port, name, value, &size);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return err ? __hurd_fail (err) : size;
-}
diff --git a/sysdeps/mach/hurd/hppa/bits/sigcontext.h b/sysdeps/mach/hurd/hppa/bits/sigcontext.h
new file mode 100644
index 0000000000..5db43fc22c
--- /dev/null
+++ b/sysdeps/mach/hurd/hppa/bits/sigcontext.h
@@ -0,0 +1,94 @@
+/* Machine-dependent signal context structure for GNU Hurd.  HPPA version.
+   Copyright (C) 1995,97,2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
+# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
+#endif
+
+#ifndef sc_parisc_thread_state
+
+/* Signal handlers are actually called:
+   void handler (int sig, int code, struct sigcontext *scp);  */
+
+/* State of this thread when the signal was taken.  */
+struct sigcontext
+  {
+    /* These first members are machine-independent.  */
+
+    int sc_onstack;		/* Nonzero if running on sigstack.  */
+    __sigset_t sc_mask;		/* Blocked signals to restore.  */
+
+    /* MiG reply port this thread is using.  */
+    unsigned int sc_reply_port;
+
+    /* Port this thread is doing an interruptible RPC on.  */
+    unsigned int sc_intr_port;
+
+    /* Error code associated with this signal (interpreted as `error_t').  */
+    int sc_error;
+
+    /* All following members are machine-dependent.  The rest of this
+       structure is written to be laid out identically to a `struct
+       parisc_thread_state'.  trampoline.c knows this, so it must be
+       changed if this changes.  */
+
+#define sc_parisc_thread_state sc_flags /* Beginning of correspondence.  */
+    /* "General" registers $1..$31.  */
+    unsigned int sc_regs[31];
+
+    /* Control registers.  */
+    unsigned int sc_cr11;	/* sar */
+    /* These four registers make up the PC.  */
+    unsigned int iioq_head;
+    unsigned int iisq_head;
+    unsigned int iioq_tail;
+    unsigned int iisq_tail;
+    unsigned int sc_cr15;
+    unsigned int sc_cr19;
+    unsigned int sc_cr20;
+    unsigned int sc_cr21;
+    unsigned int sc_cr22;	/* ipsw */
+    unsigned int sc_bsd_goto;	/* unused */
+    unsigned int sc_sr4;
+    unsigned int sc_sr0;
+    unsigned int sc_sr1;
+    unsigned int sc_sr2;
+    unsigned int sc_sr3;
+    unsigned int sc_sr5;
+    unsigned int sc_sr6;
+    unsigned int sc_sr7;
+    unsigned int sc_cr0;
+    unsigned int sc_cr8;
+    unsigned int sc_cr9;
+    unsigned int sc_cr10;	/* unused */
+    unsigned int sc_cr12;
+    unsigned int sc_cr13;
+    unsigned int sc_cr24;	/* unused */
+    unsigned int sc_cr25;	/* unused */
+    unsigned int sc_cr26;	/* unused */
+    unsigned sc_mpsfu_high;	/* unused */
+    unsigned sc_mpsfu_low;	/* unused */
+    unsigned sc_mpsfu_ovflo;	/* unused */
+    int sc_pad;
+
+    /* Floating point registers $f0..$f31.  */
+    double sc_fpregs[32];
+  };
+
+#endif /* sc_parisc_thread_state */
diff --git a/sysdeps/mach/hurd/hppa/trampoline.c b/sysdeps/mach/hurd/hppa/trampoline.c
new file mode 100644
index 0000000000..bbb5b960ac
--- /dev/null
+++ b/sysdeps/mach/hurd/hppa/trampoline.c
@@ -0,0 +1,230 @@
+/* Set thread_state for sighandler, and sigcontext to recover.  HPPA version.
+   Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd/signal.h>
+#include "thread_state.h"
+#include <assert.h>
+#include <errno.h>
+#include "hurdfault.h"
+
+
+struct mach_msg_trap_regargs
+  {
+    /* These first four arguments are in registers 26..23.  */
+    mach_msg_size_t rcv_size;	/* arg3 */
+    mach_msg_size_t send_size;	/* arg2 */
+    mach_msg_option_t option;	/* arg1 */
+    mach_msg_header_t *msg;	/* arg0 */
+  };
+
+struct sigcontext *
+_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
+			int signo, long int sigcode,
+			volatile int rpc_wait,
+			struct machine_thread_all_state *state)
+{
+  __label__ trampoline, rpc_wait_trampoline;
+  void *volatile sigsp;
+  struct sigcontext *scp;
+
+  if (ss->context)
+    {
+      /* We have a previous sigcontext that sigreturn was about
+	 to restore when another signal arrived.  We will just base
+	 our setup on that.  */
+      if (_hurdsig_catch_fault (SIGSEGV))
+	assert (_hurdsig_fault_sigcode >= (long int) ss->context &&
+		_hurdsig_fault_sigcode < (long int) (ss->context + 1));
+      else
+	{
+	  memcpy (&state->basic, &ss->context->sc_parisc_thread_state,
+		  sizeof (state->basic));
+	  state->set = (1 << PARISC_THREAD_STATE);
+	  assert (! rpc_wait);
+	  /* The intr_port slot was cleared before sigreturn sent us the
+	     sig_post that made us notice this pending signal, so
+	     _hurd_internal_post_signal wouldn't do interrupt_operation.
+	     After we return, our caller will set SCP->sc_intr_port (in the
+	     new context) from SS->intr_port and clear SS->intr_port.  Now
+	     that we are restoring this old context recorded by sigreturn,
+	     we want to restore its intr_port too; so store it in
+	     SS->intr_port now, so it will end up in SCP->sc_intr_port
+	     later.  */
+	  ss->intr_port = ss->context->sc_intr_port;
+	}
+      /* If the sigreturn context was bogus, just ignore it.  */
+      ss->context = NULL;
+    }
+  else if (! machine_get_basic_state (ss->thread, state))
+    return NULL;
+
+  if ((ss->actions[signo].sa_flags & SA_ONSTACK) &&
+      !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK)))
+    {
+      sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size;
+      ss->sigaltstack.ss_flags |= SS_ONSTACK;
+      /* XXX need to set up base of new stack for
+	 per-thread variables, cthreads.  */
+    }
+  else
+    sigsp = (char *) state->basic.uesp;
+
+  /* Push the signal context on the stack.  */
+  sigsp -= sizeof (*scp);
+  scp = sigsp;
+
+  if (_hurdsig_catch_fault (SIGSEGV))
+    {
+      assert (_hurdsig_fault_sigcode >= (long int) scp &&
+	      _hurdsig_fault_sigcode <= (long int) (scp + 1));
+      /* We got a fault trying to write the stack frame.
+	 We cannot set up the signal handler.
+	 Returning NULL tells our caller, who will nuke us with a SIGILL.  */
+      return NULL;
+    }
+  else
+    {
+      int ok;
+
+      /* Set up the sigcontext from the current state of the thread.  */
+
+      scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0;
+
+      /* struct sigcontext is laid out so that starting at sc_regs mimics a
+	 struct parisc_thread_state.  */
+      memcpy (&scp->sc_parisc_thread_state,
+	      &state->basic, sizeof (state->basic));
+
+      _hurdsig_end_catch_fault ();
+
+      if (! ok)
+	return NULL;
+    }
+
+  /* Modify the thread state to call the trampoline code on the new stack.  */
+  if (rpc_wait)
+    {
+      /* The signalee thread was blocked in a mach_msg_trap system call,
+	 still waiting for a reply.  We will have it run the special
+	 trampoline code which retries the message receive before running
+	 the signal handler.
+
+	 To do this we change the OPTION argument on its stack to enable only
+	 message reception, since the request message has already been
+	 sent.  */
+
+      struct mach_msg_trap_regargs *args = (void *) &state->basic.r23;
+
+      if (_hurdsig_catch_fault (SIGSEGV))
+	{
+	  assert (_hurdsig_fault_sigcode >= (long int) args &&
+		  _hurdsig_fault_sigcode < (long int) (args + 1));
+	  /* Faulted accessing ARGS.  Bomb.  */
+	  return NULL;
+	}
+
+      assert (args->option & MACH_RCV_MSG);
+      /* Disable the message-send, since it has already completed.  The
+	 calls we retry need only wait to receive the reply message.  */
+      args->option &= ~MACH_SEND_MSG;
+
+      /* Limit the time to receive the reply message, in case the server
+	 claimed that `interrupt_operation' succeeded but in fact the RPC
+	 is hung.  */
+      args->option |= MACH_RCV_TIMEOUT;
+      args->timeout = _hurd_interrupted_rpc_timeout;
+
+      _hurdsig_end_catch_fault ();
+
+      MACHINE_THREAD_STATE_SET_PC (&state->basic, &&rpc_wait_trampoline);
+      /* The reply-receiving trampoline code runs initially on the original
+	 user stack.  We pass it the signal stack pointer in %r5.  */
+      state->basic.r5 = (int) sigsp;
+      /* After doing the message receive, the trampoline code will need to
+	 update the %r28 value to be restored by sigreturn.  To simplify
+	 the assembly code, we pass the address of its slot in SCP to the
+	 trampoline code in %r4.  */
+      state->basic.r4 = (unsigned int) &scp->sc_regs[27];
+      /* Set up the arguments for the handler function in callee-saved
+	 registers that we will move to the argument registers after
+	 mach_msg_trap returns.  */
+      state->basic.r6 = signo;
+      state->basic.r7 = sigcode;
+      state->basic.r8 = (unsigned int) scp;
+    }
+  else
+    {
+      MACHINE_THREAD_STATE_SET_PC (&state->basic, &&trampoline);
+      state->basic.r20 = (unsigned int) sigsp;
+      /* Set up the arguments for the handler function.  */
+      state->basic.r26 = signo;
+      state->basic.r25 = sigcode;
+      state->basic.r24 = (unsigned int) scp;
+    }
+
+  /* We pass the handler function to the trampoline code in %r9.  */
+  state->basic.r9 = (unsigned int) handler;
+  /* For convenience, we pass the address of __sigreturn in %r10.  */
+  state->basic.r10 = (unsigned int) &__sigreturn;
+  /* The extra copy of SCP for the __sigreturn arg goes in %r8.  */
+  state->basic.r10 = (unsigned int) scp;
+
+  return scp;
+
+  /* The trampoline code follows.  This is not actually executed as part of
+     this function, it is just convenient to write it that way.  */
+
+ rpc_wait_trampoline:
+  /* This is the entry point when we have an RPC reply message to receive
+     before running the handler.  The MACH_MSG_SEND bit has already been
+     cleared in the OPTION argument on our stack.  The interrupted user
+     stack pointer has not been changed, so the system call can find its
+     arguments; the signal stack pointer is in %ebx.  For our convenience,
+     %ecx points to the sc_eax member of the sigcontext.  */
+  asm volatile
+    (/* Retry the interrupted mach_msg system call.  */
+     "ldil L%0xC0000000,%r1\nble 4(%sr7,%r1)\n"
+     "ldi -25, %r22\n"		/* mach_msg_trap */
+     /* When the sigcontext was saved, %r28 was MACH_RCV_INTERRUPTED.  But
+	now the message receive has completed and the original caller of
+	the RPC (i.e. the code running when the signal arrived) needs to
+	see the final return value of the message receive in %r28.  So
+	store the new %r28 value into the sc_regs[27] member of the sigcontext
+	(whose address is in %r4 to make this code simpler).  */
+     "stw (%r4), %r28\n"
+     /* Switch to the signal stack.  */
+     "copy %r5, %r30\n"
+     /* Copy the handler arguments to the argument registers.  */
+     "copy %r6, %r26\n"
+     "copy %r7, %r25\n"
+     "copy %r8, %r24\n"
+     );
+
+ trampoline:
+  /* Entry point for running the handler normally.  The arguments to the
+     handler function are already in the argument registers.  */
+  asm volatile
+    ("bv (%r9); nop"		/* Call the handler function.  */
+     "bv (%r10)\n"		/* Call __sigreturn (SCP); never returns.  */
+     "copy %r8, %r26"		/* Set up arg in delay slot.  */
+     : : "i" (&__sigreturn));
+
+  /* NOTREACHED */
+  return NULL;
+}
diff --git a/sysdeps/mach/hurd/i386/Dist b/sysdeps/mach/hurd/i386/Dist
new file mode 100644
index 0000000000..82c44df00b
--- /dev/null
+++ b/sysdeps/mach/hurd/i386/Dist
@@ -0,0 +1,3 @@
+static-start.S
+sys/io.h
+ioperm.c
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index f9a7a58deb..caa232026d 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -1,6 +1,5 @@
 /* Initialization code run first thing by the ELF startup code.  For i386/Hurd.
-   Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05
-	Free Software Foundation, Inc.
+   Copyright (C) 1995,96,97,98,99,2000,01,02,03,04 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
@@ -55,7 +54,7 @@ extern int __libc_argc attribute_hidden;
 extern char **__libc_argv attribute_hidden;
 extern char **_dl_argv;
 
-extern void *(*_cthread_init_routine) (void) __attribute__ ((weak));
+void *(*_cthread_init_routine) (void); /* Returns new SP to use.  */
 void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
 
 /* Things that want to be run before _hurd_init or much anything else.
@@ -204,7 +203,7 @@ init (int *data)
      code as the return address, and the argument data immediately above
      that on the stack.  */
 
-  if (&_cthread_init_routine && _cthread_init_routine)
+  if (_cthread_init_routine)
     {
       /* Initialize cthreads, which will allocate us a new stack to run on.  */
       int *newsp = (*_cthread_init_routine) ();
@@ -272,7 +271,7 @@ init (int *data)
       /* The argument data is just above the stack frame we will unwind by
 	 returning.  Mutate our own return address to run the code below.  */
       usercode = data[-1];
-      data[-1] = (int) &call_init1;
+      ((void **) data)[-1] = call_init1;
       /* Force USERCODE into %eax and &init1 into %ecx, which are not
 	 restored by function return.  */
       asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));
@@ -320,11 +319,11 @@ first_init (void)
    stack set up just as the user will see it, so it can switch stacks.  */
 
 void
-_dl_init_first (void)
+_dl_init_first (int argc, ...)
 {
   first_init ();
 
-  init ((int *) __builtin_frame_address (0) + 2);
+  init (&argc);
 }
 #endif
 
@@ -351,23 +350,21 @@ strong_alias (posixland_init, __libc_init_first);
    This poorly-named function is called by static-start.S,
    which should not exist at all.  */
 void
-_hurd_stack_setup (void)
+_hurd_stack_setup (volatile int argc, ...)
 {
-  intptr_t caller = (intptr_t) __builtin_return_address (0);
-
   void doinit (intptr_t *data)
     {
       /* This function gets called with the argument data at TOS.  */
-      void doinit1 (void)
+      void doinit1 (volatile int argc, ...)
 	{
-	  init ((int *) __builtin_frame_address (0) + 2);
+	  init ((int *) &argc);
 	}
 
       /* Push the user return address after the argument data, and then
          jump to `doinit1' (above), so it is as if __libc_init_first's
          caller had called `doinit1' with the argument data already on the
          stack.  */
-      *--data = caller;
+      *--data = (&argc)[-1];
       asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack.  */
 		    "movl $0, %%ebp\n" /* Clear outermost frame pointer.  */
 		    "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp");
@@ -376,7 +373,7 @@ _hurd_stack_setup (void)
 
   first_init ();
 
-  _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit);
+  _hurd_startup ((void **) &argc, &doinit);
 }
 #endif
 
diff --git a/sysdeps/mach/hurd/i386/longjmp-ts.c b/sysdeps/mach/hurd/i386/longjmp-ts.c
index c902002cbc..586ce6b015 100644
--- a/sysdeps/mach/hurd/i386/longjmp-ts.c
+++ b/sysdeps/mach/hurd/i386/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  i386 version.
-   Copyright (C) 1991, 1994, 1995, 1997, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1994, 1995, 1997 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
@@ -19,7 +19,6 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
-#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
index 223a47d2f2..ff849716e0 100644
--- a/sysdeps/mach/hurd/i386/tls.h
+++ b/sysdeps/mach/hurd/i386/tls.h
@@ -98,7 +98,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
     {
       /* Fetch the selector set by the first call.  */
       int sel;
-      asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
+      asm ("mov %%gs, %w0" : "=q" (sel));
       if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */
 	{
 	  error_t err = __i386_set_ldt (tcb->self, sel, &desc, 1);
@@ -151,7 +151,7 @@ _hurd_tls_fork (thread_t child, struct i386_thread_state *state)
 {
   /* Fetch the selector set by _hurd_tls_init.  */
   int sel;
-  asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
+  asm ("mov %%gs, %w0" : "=q" (sel));
   if (sel == state->ds)		/* _hurd_tls_init was never called.  */
     return 0;
 
diff --git a/sysdeps/mach/hurd/i386/trampoline.c b/sysdeps/mach/hurd/i386/trampoline.c
index dddc6f3ef6..781a0441dc 100644
--- a/sysdeps/mach/hurd/i386/trampoline.c
+++ b/sysdeps/mach/hurd/i386/trampoline.c
@@ -1,6 +1,5 @@
 /* Set thread_state for sighandler, and sigcontext to recover.  i386 version.
-   Copyright (C) 1994,1995,1996,1997,1998,1999,2005
-	Free Software Foundation, Inc.
+   Copyright (C) 1994, 95, 96, 97, 98, 99 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
@@ -20,11 +19,11 @@
 
 #include <hurd/signal.h>
 #include <hurd/userlink.h>
-#include <thread_state.h>
+#include "thread_state.h"
 #include <assert.h>
 #include <errno.h>
 #include "hurdfault.h"
-#include <intr-msg.h>
+#include "intr-msg.h"
 
 
 struct sigcontext *
diff --git a/sysdeps/mach/hurd/ifreq.c b/sysdeps/mach/hurd/ifreq.h
index 9da8a6803a..77f0b9cac0 100644
--- a/sysdeps/mach/hurd/ifreq.c
+++ b/sysdeps/mach/hurd/ifreq.h
@@ -1,5 +1,5 @@
 /* Fetch the host's network interface list.  Hurd version.
-   Copyright (C) 2002,2005 Free Software Foundation, Inc.
+   Copyright (C) 2002 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
@@ -17,13 +17,14 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <ifreq.h>
+#include <net/if.h>
 #include <hurd.h>
 #include <hurd/pfinet.h>
+#include <sys/socket.h>
 #include <sys/mman.h>
 
 
-void
+static inline void
 __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
 {
   file_t server;
@@ -63,3 +64,17 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
     }
 
 }
+
+
+static inline struct ifreq *
+__if_nextreq (struct ifreq *ifr)
+{
+  return ifr + 1;
+}
+
+
+static inline void
+__if_freereq (struct ifreq *ifreqs, int num_ifs)
+{
+  __munmap (ifreqs, num_ifs * sizeof (struct ifreq));
+}
diff --git a/sysdeps/mach/hurd/init-posix.c b/sysdeps/mach/hurd/init-posix.c
index eaf6332fe1..3eecf62769 100644
--- a/sysdeps/mach/hurd/init-posix.c
+++ b/sysdeps/mach/hurd/init-posix.c
@@ -1,2 +1,2 @@
 /* We don't need the unix/bsd version.  */
-#include <posix/init-posix.c>
+#include <sysdeps/generic/init-posix.c>
diff --git a/sysdeps/mach/hurd/ioctl.c b/sysdeps/mach/hurd/ioctl.c
index bcc78bc84e..3d590d5845 100644
--- a/sysdeps/mach/hurd/ioctl.c
+++ b/sysdeps/mach/hurd/ioctl.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1992,93,94,95,96,97,99,2000,2002,2005
-	Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,96,97,99,2000,02 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
@@ -58,16 +57,7 @@ __ioctl (int fd, unsigned long int request, ...)
   struct
   {
 #ifdef MACH_MSG_TYPE_BIT
-    union
-    {
-      mig_reply_header_t header;
-      struct
-      {
-	mach_msg_header_t	Head;
-	int			RetCodeType;
-	kern_return_t		RetCode;
-      } header_typecheck;
-    };
+    mig_reply_header_t header;
     char data[3 * sizeof (mach_msg_type_t) +
 	     msg_align (_IOT_COUNT0 (type) * typesize (_IOT_TYPE0 (type))) +
 	     msg_align (_IOT_COUNT1 (type) * typesize (_IOT_TYPE1 (type))) +
@@ -146,11 +136,9 @@ __ioctl (int fd, unsigned long int request, ...)
 	     Rather than pointing to the value, ARG is the value itself.  */
 #ifdef MACH_MSG_TYPE_BIT
 	  *t++ = io2mach_type (1, _IOTS (integer_t));
-	  *(integer_t *) t = (integer_t) arg;
-	  t = (void *) t + sizeof (integer_t);
+	  *((integer_t *) t)++ = (integer_t) arg;
 #else
-	  *(integer_t *) p = (integer_t) arg;
-	  p = (void *) p + sizeof (integer_t);
+	  *((integer_t *) p)++ = (integer_t) arg;
 #endif
 	}
 
@@ -201,7 +189,7 @@ __ioctl (int fd, unsigned long int request, ...)
 	return MIG_TYPE_ERROR;
 
 #ifdef MACH_MSG_TYPE_BIT
-      if (msg.header_typecheck.RetCodeType !=
+      if (*(int *) &msg.header.RetCodeType !=
 	  ((union { mach_msg_type_t t; int i; })
 	   { t: io2mach_type (1, _IOTS (msg.header.RetCode)) }).i)
 	return MIG_TYPE_ERROR;
diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c
index e0e16e28b2..4624ad9e26 100644
--- a/sysdeps/mach/hurd/jmp-unwind.c
+++ b/sysdeps/mach/hurd/jmp-unwind.c
@@ -1,5 +1,5 @@
 /* _longjmp_unwind -- Clean up stack frames unwound by longjmp.  Hurd version.
-   Copyright (C) 1995,1996,2005,2006 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996 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
@@ -17,27 +17,17 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <jmpbuf-unwind.h>
+#include <setjmp.h>
 #include <hurd/userlink.h>
 #include <hurd/signal.h>
 #include <hurd/sigpreempt.h>
 #include <assert.h>
-#include <stdint.h>
 
 
 #ifndef _JMPBUF_UNWINDS
-#error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS"
+#error "<bits/setjmp.h> fails to define _JMPBUF_UNWINDS"
 #endif
 
-static inline uintptr_t
-demangle_ptr (uintptr_t x)
-{
-# ifdef PTR_DEMANGLE
-  PTR_DEMANGLE (x);
-# endif
-  return x;
-}
-
 /* This function is called by `longjmp' (with its arguments) to restore
    active resources to a sane state before the frames code using them are
    jumped out of.  */
@@ -56,7 +46,7 @@ _longjmp_unwind (jmp_buf env, int val)
 
   /* Remove local signal preemptors being unwound past.  */
   while (ss->preemptors &&
-	 _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors, demangle_ptr))
+	 _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors))
     ss->preemptors = ss->preemptors->next;
 
   __spin_unlock (&ss->lock);
@@ -66,7 +56,7 @@ _longjmp_unwind (jmp_buf env, int val)
      in stack frames being unwound by this jump.  */
 
   for (link = ss->active_resources;
-       link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link, demangle_ptr);
+       link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link);
        link = link->thread.next)
     /* Remove this link from the resource's users list,
        since the frame using the resource is being unwound.
diff --git a/sysdeps/mach/hurd/lgetxattr.c b/sysdeps/mach/hurd/lgetxattr.c
deleted file mode 100644
index 5ab591575e..0000000000
--- a/sysdeps/mach/hurd/lgetxattr.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <fcntl.h>
-
-ssize_t
-lgetxattr (const char *path, const char *name, void *value, size_t size)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, O_NOLINK, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_get (port, name, value, &size);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return err ? __hurd_fail (err) : size;
-}
diff --git a/sysdeps/mach/hurd/linkat.c b/sysdeps/mach/hurd/linkat.c
deleted file mode 100644
index 1942144e0f..0000000000
--- a/sysdeps/mach/hurd/linkat.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Make a link between file names relative to open directories.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-
-/* Make a link to FROM relative to FROMFD called TO relative to TOFD.  */
-int
-linkat (fromfd, from, tofd, to, flags)
-     int fromfd;
-     const char *from;
-     int tofd;
-     const char *to;
-     int flags;
-{
-  error_t err;
-  file_t oldfile, linknode, todir;
-  char *toname;
-
-  oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0);
-  if (oldfile == MACH_PORT_NULL)
-    return -1;
-
-  /* The file_getlinknode RPC returns the port that should be passed to
-     the receiving filesystem (the one containing TODIR) in dir_link.  */
-
-  err = __file_getlinknode (oldfile, &linknode);
-  __mach_port_deallocate (__mach_task_self (), oldfile);
-  if (err)
-    return __hurd_fail (err);
-
-  todir = __file_name_split_at (tofd, to, &toname);
-  if (todir != MACH_PORT_NULL)
-    {
-      err = __dir_link (todir, linknode, toname, 1);
-      __mach_port_deallocate (__mach_task_self (), todir);
-    }
-  __mach_port_deallocate (__mach_task_self (), linknode);
-  if (todir == MACH_PORT_NULL)
-    return -1;
-
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/listxattr.c b/sysdeps/mach/hurd/listxattr.c
deleted file mode 100644
index 5f84e88316..0000000000
--- a/sysdeps/mach/hurd/listxattr.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-
-ssize_t
-listxattr (const char *path, char *list, size_t size)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_list (port, list, &size);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return err ? __hurd_fail (err) : size;
-}
diff --git a/sysdeps/mach/hurd/lsetxattr.c b/sysdeps/mach/hurd/lsetxattr.c
deleted file mode 100644
index c2eae40e3a..0000000000
--- a/sysdeps/mach/hurd/lsetxattr.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <fcntl.h>
-
-ssize_t
-lsetxattr (const char *path, const char *name, const void *value, size_t size,
-	   int flags)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, O_NOLINK, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_set (port, name, value, size, flags);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return err ? __hurd_fail (err) : size;
-}
diff --git a/sysdeps/mach/hurd/mig-reply.c b/sysdeps/mach/hurd/mig-reply.c
index 5e40c147b4..78bac4bffc 100644
--- a/sysdeps/mach/hurd/mig-reply.c
+++ b/sysdeps/mach/hurd/mig-reply.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994,1995,1996,1997,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996, 1997 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
@@ -22,7 +22,7 @@
 #define GETPORT \
   mach_port_t *portloc = \
     (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY)
-#define reply_port (*(use_threadvar ? portloc : &global_reply_port))
+#define reply_port (use_threadvar ? *portloc : global_reply_port)
 
 static int use_threadvar;
 static mach_port_t global_reply_port;
diff --git a/sysdeps/mach/hurd/mips/Dist b/sysdeps/mach/hurd/mips/Dist
new file mode 100644
index 0000000000..b6f3ffa4c3
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/Dist
@@ -0,0 +1,3 @@
+longjmp-ctx.c
+init-fault.c
+dl-machine.c
diff --git a/sysdeps/mach/hurd/mips/bits/sigcontext.h b/sysdeps/mach/hurd/mips/bits/sigcontext.h
new file mode 100644
index 0000000000..14c618857e
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/bits/sigcontext.h
@@ -0,0 +1,80 @@
+/* Machine-dependent signal context structure for GNU Hurd.  MIPS version.
+   Copyright (C) 1994,97,2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
+# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
+#endif
+
+#ifndef sc_mips_thread_state
+
+/* Signal handlers are actually called:
+   void handler (int sig, int code, struct sigcontext *scp);  */
+
+/* State of this thread when the signal was taken.  */
+struct sigcontext
+  {
+    /* These first members are machine-independent.  */
+
+    int sc_onstack;		/* Nonzero if running on sigstack.  */
+    __sigset_t sc_mask;		/* Blocked signals to restore.  */
+
+    /* MiG reply port this thread is using.  */
+    unsigned int sc_reply_port;
+
+    /* Port this thread is doing an interruptible RPC on.  */
+    unsigned int sc_intr_port;
+
+    /* Error code associated with this signal (interpreted as `error_t').  */
+    int sc_error;
+
+    /* All following members are machine-dependent.  The rest of this
+       structure is written to be laid out identically to:
+	{
+	  struct mips_thread_state ts;
+	  struct mips_exc_state es;
+	  struct mips_float_state fs;
+	}
+       trampoline.c knows this, so it must be changed if this changes.  */
+#define	sc_mips_thread_state sc_gpr /* Beginning of correspondence.  */
+    int sc_gpr[31];		/* "General" registers; [0] is r1.  */
+    int sc_mdlo, sc_mdhi;	/* Low and high multiplication results.  */
+    int sc_pc;			/* Instruction pointer.  */
+
+    /* struct mips_exc_state */
+#define sc_mips_exc_state sc_cause
+    unsigned int sc_cause;	/* Machine-level trap code.  */
+#define SC_CAUSE_SST	0x00000044
+    unsigned int sc_badvaddr;
+    unsigned int sc_coproc_used; /* Which coprocessors the thread has used.  */
+#define SC_COPROC_USE_COP0	1 /* (by definition) */
+#define SC_COPROC_USE_COP1	2 /* FPA */
+#define	SC_COPROC_USE_FPU	SC_COPROC_USE_COP1
+#define SC_COPROC_USE_COP2	4
+#define SC_COPROC_USE_COP3	8
+
+    /* struct mips_float_state
+       This is only filled in if the SC_COPROC_USE_FPU bit
+       is set in sc_coproc_used.  */
+#define sc_mips_float_state sc_fpr
+    int sc_fpr[32];		/* FP registers.  */
+    int sc_fpcsr;		/* FPU status register.  */
+    int sc_fpeir;		/* FP exception instruction register.  */
+  };
+
+#endif /* sc_mips_thread_state */
diff --git a/sysdeps/mach/hurd/mips/dl-machine.c b/sysdeps/mach/hurd/mips/dl-machine.c
new file mode 100644
index 0000000000..ce2d5db510
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/dl-machine.c
@@ -0,0 +1,132 @@
+/* Operating system support for run-time dynamic linker.  MIPS specific
+   stuffs on Hurd.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd.h>
+#include <link.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <assert.h>
+#include <sysdep.h>
+#include <mach/mig_support.h>
+#include "../stdio-common/_itoa.h"
+#include <stdarg.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <libintl.h>
+
+void weak_function
+abort (void)
+{
+  _exit (127);
+}
+
+
+#include <string.h>
+#include <mach/error.h>
+#include <errorlib.h>
+
+#undef _
+#define _(x) x
+
+/* Return a string describing the errno code in ERRNUM.  */
+char * weak_function
+_strerror_internal (int errnum, char *buf, size_t buflen)
+{
+  int system;
+  int sub;
+  int code;
+  const struct error_system *es;
+  extern void __mach_error_map_compat (int *);
+
+  __mach_error_map_compat (&errnum);
+
+  system = err_get_system (errnum);
+  sub = err_get_sub (errnum);
+  code = err_get_code (errnum);
+
+  if (system > err_max_system || ! __mach_error_systems[system].bad_sub)
+    {
+      const char *unk = _("Error in unknown error system: ");
+      const size_t unklen = strlen (unk);
+      char *p = buf + buflen;
+      *--p = '\0';
+      p = _itoa (errnum, p, 16, 1);
+      return memcpy (p - unklen, unk, unklen);
+    }
+
+  es = &__mach_error_systems[system];
+
+  if (sub >= es->max_sub)
+    return (char *) es->bad_sub;
+
+  if (code >= es->subsystem[sub].max_code)
+    {
+      const char *unk = _("Unknown error ");
+      const size_t unklen = strlen (unk);
+      char *p = buf + buflen;
+      size_t len = strlen (es->subsystem[sub].subsys_name);
+      *--p = '\0';
+      p = _itoa (errnum, p, 16, 1);
+      *p-- = ' ';
+      p = memcpy (p - len, es->subsystem[sub].subsys_name, len);
+      return memcpy (p - unklen, unk, unklen);
+    }
+
+  return (char *) _(es->subsystem[sub].codes[code]);
+}
+
+/* Read the whole contents of FILE into new mmap'd space with given
+   protections.  The size of the file is returned in SIZE.  */
+void *
+_dl_sysdep_read_whole_file (const char *file, size_t *size, int prot)
+{
+  struct stat stat;
+  mach_port_t memobj_rd;
+  void *contents;
+  error_t err;
+
+  memobj_rd = __open (file, O_RDONLY, 0);
+  if (memobj_rd)
+    {
+      err = __io_stat ((file_t) memobj_rd, &stat);
+      if (err)
+	{
+	  __hurd_fail (err);
+	  contents = 0;
+	}
+      else
+	{
+	  /* Map a copy of the file contents.  */
+	  contents = __mmap (0, stat.st_size, prot, MAP_COPY, memobj_rd, 0);
+	  if (contents == (void *)-1)
+	    contents = 0;
+	  else
+	    *size = stat.st_size;
+	}
+
+      __mach_port_deallocate (__mach_task_self (), memobj_rd);
+    }
+  else
+    contents = 0;
+
+  return contents;
+}
diff --git a/sysdeps/mach/hurd/mips/exc2signal.c b/sysdeps/mach/hurd/mips/exc2signal.c
new file mode 100644
index 0000000000..c505ae5b22
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/exc2signal.c
@@ -0,0 +1,97 @@
+/* Translate Mach exception codes into signal numbers.  MIPS version.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd.h>
+#include <hurd/signal.h>
+#include <mach/exception.h>
+
+/* Translate the Mach exception codes, as received in an `exception_raise' RPC,
+   into a signal number and signal subcode.  */
+
+void
+_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
+{
+  detail->error = 0;
+
+  switch (detail->exc)
+    {
+    default:
+      *signo = SIGIOT;
+      detail->code = detail->exc;
+      break;
+      
+    case EXC_BAD_ACCESS:
+      if (detail->exc_code == KERN_PROTECTION_FAILURE)
+	*signo = SIGSEGV;
+      else
+	*signo = SIGBUS;
+      detail->code = detail->exc_subcode;
+      detail->error = detail->exc_code;
+      break;
+
+    case EXC_BAD_INSTRUCTION:
+      *signo = SIGILL;
+      if (detail->exc_code == EXC_MIPS_II)
+	detail->code = detail->exc_subcode;
+      else
+	detail->code = 0;
+      break;
+      
+    case EXC_ARITHMETIC:
+      switch (detail->exc_code)
+	{
+	case EXC_MIPS_OV:	/* integer overflow */
+	  *signo = SIGFPE;
+	  detail->code = detail->exc_subcode;
+	  break;
+
+	default:
+	  *signo = SIGFPE;
+	  detail->code = 0;
+	  break;
+
+	case EXC_MIPS_INT:
+	  /* Subcode is the fp_status word saved by the hardware.
+	     Give an error code corresponding to the first bit set.  */
+	  if (detail->exc_subcode == EXC_MIPS_FLT_UNIMP)
+	    *signo = SIGILL;
+	  else
+	    *signo = SIGFPE;
+	  detail->code = detail->exc_subcode;
+	  break;
+	}
+      break;
+
+    case EXC_EMULATION:		
+      /* 3.0 doesn't give this one, why, I don't know.  */
+      *signo = SIGEMT;
+      detail->code = 0;
+      break;
+
+    case EXC_SOFTWARE:
+      *signo = SIGEMT;
+      detail->code = 0;
+      break;
+      
+    case EXC_BREAKPOINT:
+      *signo = SIGTRAP;
+      detail->code = 0;
+      break;
+    }
+}
diff --git a/sysdeps/mach/hurd/flistxattr.c b/sysdeps/mach/hurd/mips/init-fault.c
index a577e4e393..05f48a3a56 100644
--- a/sysdeps/mach/hurd/flistxattr.c
+++ b/sysdeps/mach/hurd/mips/init-fault.c
@@ -1,5 +1,5 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+/* Set up a thread_state for proc_handle_exceptions.  MIPS version.
+   Copyright (C) 1996, 1997 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
@@ -17,18 +17,25 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <hurd/fd.h>
+#include <hurd/signal.h>
+#include <mach/thread_status.h>
+#include <string.h>
+#include <setjmp.h>
 
-ssize_t
-flistxattr (int fd, char *list, size_t size)
-{
-  error_t err;
+extern jmp_buf _hurd_sigthread_fault_env;
 
-  err = HURD_DPORT_USE (fd, _hurd_xattr_list (port, list, &size));
+static char fault_stack[32];
+static volatile void
+faulted (void)
+{
+  __longjmp (_hurd_sigthread_fault_env, 1);
+}
 
-  return err ? __hurd_dfail (fd, err) : size;
+void
+_hurd_initialize_fault_recovery_state (void *state)
+{
+  struct mips_thread_state *ts = state;
+  memset (ts, 0, sizeof (*ts));
+  ts->r29 = (int) &fault_stack[sizeof (fault_stack)];
+  ts->pc = (int) &faulted;
 }
diff --git a/sysdeps/mach/hurd/mips/init-first.c b/sysdeps/mach/hurd/mips/init-first.c
new file mode 100644
index 0000000000..6f53e839b3
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/init-first.c
@@ -0,0 +1,414 @@
+/* Initialization code run first thing by the ELF startup code.  For Mips/Hurd.
+   Copyright (C) 1996,1997,1998,2000,01,02,03 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include "hurdstartup.h"
+#include "set-hooks.h"
+#include "hurdmalloc.h"		/* XXX */
+
+extern void __mach_init (void);
+extern void __init_misc (int, char **, char **);
+#ifdef USE_NONOPTION_FLAGS
+extern void __getopt_clean_environment (char **);
+#endif
+#ifndef SHARED
+extern void _dl_non_dynamic_init (void) internal_function;
+#endif
+extern void __libc_global_ctors (void);
+
+unsigned int __hurd_threadvar_max;
+unsigned long int __hurd_threadvar_stack_offset;
+unsigned long int __hurd_threadvar_stack_mask;
+
+int __libc_multiple_libcs attribute_hidden = 1;
+
+int __libc_argc attribute_hidden;
+char **__libc_argv attribute_hidden;
+
+void *(*_cthread_init_routine) (void); /* Returns new SP to use.  */
+void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
+
+
+/* Things that want to be run before _hurd_init or much anything else.
+   Importantly, these are called before anything tries to use malloc.  */
+DEFINE_HOOK (_hurd_preinit_hook, (void));
+
+static void
+init1 (int argc, char *arg0, ...)
+{
+  char **argv = &arg0;
+  char **envp = &argv[argc + 1];
+  struct hurd_startup_data *d;
+
+  __libc_argc = argc;
+  __libc_argv = argv;
+  __environ = envp;
+  while (*envp)
+    ++envp;
+  d = (void *) ++envp;
+
+  /* If we are the bootstrap task started by the kernel,
+     then after the environment pointers there is no Hurd
+     data block; the argument strings start there.  */
+  if ((void *) d != argv[0])
+    {
+      _hurd_init_dtable = d->dtable;
+      _hurd_init_dtablesize = d->dtablesize;
+
+      {
+	/* Check if the stack we are now on is different from
+	   the one described by _hurd_stack_{base,size}.  */
+
+	char dummy;
+	const vm_address_t newsp = (vm_address_t) &dummy;
+
+	if (d->stack_size != 0 && (newsp < d->stack_base ||
+				   newsp - d->stack_base > d->stack_size))
+	  /* The new stack pointer does not intersect with the
+	     stack the exec server set up for us, so free that stack.  */
+	  __vm_deallocate (__mach_task_self (), d->stack_base, d->stack_size);
+      }
+    }
+
+  if (__hurd_threadvar_stack_mask == 0)
+    {
+      /* We are not using cthreads, so we will have just a single allocated
+	 area for the per-thread variables of the main user thread.  */
+      unsigned long int i;
+      __hurd_threadvar_stack_offset
+	= (unsigned long int) malloc (__hurd_threadvar_max *
+				      sizeof (unsigned long int));
+      if (__hurd_threadvar_stack_offset == 0)
+	__libc_fatal ("Can't allocate single-threaded per-thread variables.");
+      for (i = 0; i < __hurd_threadvar_max; ++i)
+	((unsigned long int *) __hurd_threadvar_stack_offset)[i] = 0;
+    }
+
+  if ((void *) d != argv[0] && (d->portarray || d->intarray))
+    /* Initialize library data structures, start signal processing, etc.  */
+    _hurd_init (d->flags, argv,
+		d->portarray, d->portarraysize,
+		d->intarray, d->intarraysize);
+
+#ifndef SHARED
+  _dl_non_dynamic_init ();
+#endif
+  __init_misc (argc, argv, __environ);
+
+#ifdef USE_NONOPTION_FLAGS
+  /* This is a hack to make the special getopt in GNU libc working.  */
+  __getopt_clean_environment (envp);
+#endif
+
+#ifdef SHARED
+  __libc_global_ctors ();
+#endif
+
+  (void) &init1;
+}
+
+static void *
+__init (int *data)
+{
+  int argc = *data;
+  char **argv = (void *) (data + 1);
+  char **envp = &argv[argc + 1];
+  struct hurd_startup_data *d;
+
+  __environ = envp;
+  while (*envp)
+    ++envp;
+  d = (void *) ++envp;
+
+  /* The user might have defined a value for this, to get more variables.
+     Otherwise it will be zero on startup.  We must make sure it is set
+     properly before before cthreads initialization, so cthreads can know
+     how much space to leave for thread variables.  */
+  if (__hurd_threadvar_max < _HURD_THREADVAR_MAX)
+    __hurd_threadvar_max = _HURD_THREADVAR_MAX;
+
+
+  /* After possibly switching stacks, call `init1' (above) with the user
+     code as the return address, and the argument data immediately above
+     that on the stack.  */
+
+  if (_cthread_init_routine)
+    {
+      /* Initialize cthreads, which will allocate us a new stack to run on.  */
+      void *newsp = (*_cthread_init_routine) ();
+      struct hurd_startup_data *od;
+
+      /* Copy the argdata from the old stack to the new one.  */
+      newsp = memcpy (newsp - ((char *) &d[1] - (char *) data), data,
+		      (char *) d - (char *) data);
+
+      /* Set up the Hurd startup data block immediately following
+	 the argument and environment pointers on the new stack.  */
+      od = (newsp + ((char *) d - (char *) data));
+      if ((void *) argv[0] == d)
+	/* We were started up by the kernel with arguments on the stack.
+	   There is no Hurd startup data, so zero the block.  */
+	memset (od, 0, sizeof *od);
+      else
+	/* Copy the Hurd startup data block to the new stack.  */
+	*od = *d;
+
+      /* Push the user code address on the top of the new stack.  It will
+	 be the return address for `init1'; we will jump there with NEWSP
+	 as the stack pointer.  */
+      return newsp;
+    }
+
+  /* The argument data is just above the stack frame we will unwind by
+     returning.  */
+  return (void *) data;
+
+  (void) &__init;
+}
+
+#ifdef SHARED
+/* This function is called to initialize the shared C library.
+   It is called just before the user _start code from mips/elf/start.S,
+   with the stack set up as that code gets it.  */
+
+/* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT
+   pointer in the dynamic section based solely on that.  It is convention
+   for this function to be in the `.init' section, but the symbol name is
+   the only thing that really matters!!  */
+/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/
+
+#if __mips64
+asm ("\
+	.section .init,\"ax\",@progbits\n\
+	.align 3\n\
+	.globl _init\n\
+	.type _init,@function\n\
+	.ent _init\n\
+_init:\n\
+	.set noreorder\n\
+	.cpload $25\n\
+	.set reorder\n\
+	dsubu $29, 8*8\n\
+	.cprestore 6*8\n\
+	sd $16, 4*8($29)\n\
+	sd $31, 5*8($29)\n\
+	jal preinit\n\
+	sd $28, 6*8($29)\n\
+	move $16, $29 # Save the old stack pointer to s0 ($16)\n\
+	daddu $4, $29, 4*8\n\
+	jal __init\n\
+	# Restore saved registers from the old stack.\n\
+	ld $28, 6*8($16)\n\
+	ld $31, 5*8($16)\n\
+	ld $16, 4*8($16)\n\
+	move $29, $2 # set new sp to SP\n\
+call_init1:\n\
+	ld $4, 0($29)\n\
+	ld $5, 1*8($29)\n\
+	ld $6, 2*8($29)\n\
+	ld $7, 3*8($29)\n\
+	dla $25, init1\n\
+	jr $25\n\
+	.end _init\n\
+	.text\n\
+");
+#else
+asm ("\
+	.section .init,\"ax\",@progbits\n\
+	.align 2\n\
+	.globl _init\n\
+	.type _init,@function\n\
+	.ent _init\n\
+_init:\n\
+	.set noreorder\n\
+	.cpload $25\n\
+	.set reorder\n\
+	subu $29, 32\n\
+	.cprestore 24\n\
+	sw $16, 16($29)\n\
+	sw $31, 20($29)\n\
+	jal preinit\n\
+	sw $28, 24($29)\n\
+	move $16, $29 # Save the old stack pointer to s0 ($16)\n\
+	addu $4, $29, 32\n\
+	jal __init\n\
+	# Restore saved registers from the old stack.\n\
+	lw $28, 24($16)\n\
+	lw $31, 20($16)\n\
+	lw $16, 16($16)\n\
+	move $29, $2 # set new sp to SP\n\
+call_init1:\n\
+	lw $4, 0($29)\n\
+	lw $5, 4($29)\n\
+	lw $6, 8($29)\n\
+	lw $7, 12($29)\n\
+	la $25, init1\n\
+	jr $25\n\
+	.end _init\n\
+	.text\n\
+");
+#endif
+
+static void
+preinit (void)
+{
+  /* Initialize data structures so we can do RPCs.  */
+  __mach_init ();
+
+  RUN_HOOK (_hurd_preinit_hook, ());
+
+  (void) &preinit;
+}
+
+void __libc_init_first (int argc, ...)
+{
+}
+#endif
+
+#ifndef SHARED
+/* An assembler code wrapping c function __init.  */
+#ifdef __mips64
+asm ("\
+	.text\n\
+	.align 3\n\
+init:\n\
+	dsubu $29, 8*8\n\
+	sd $16, 4*8($29)\n\
+	sd $31, 5*8($29)\n\
+	move $16, $29\n\
+	jal __init\n\
+	ld $31, 5*8($16)\n\
+	ld $16, 4*8($16)\n\
+	move $29, $2 # set new sp to SP\n\
+call_init1:\n\
+	ld $4, 0($29)\n\
+	ld $5, 1*8($29)\n\
+	ld $6, 2*8($29)\n\
+	ld $7, 3*8($29)\n\
+	dla $25, init1\n\
+	jr $25\n\
+");
+#else
+asm ("\
+	.text\n\
+	.align 2\n\
+init:\n\
+	subu $29, 32\n\
+	sw $16, 16($29)\n\
+	sw $31, 20($29)\n\
+	move $16, $29\n\
+	jal __init\n\
+	lw $31, 20($16)\n\
+	lw $16, 16($16)\n\
+	move $29, $2 # set new sp to SP\n\
+call_init1:\n\
+	lw $4, 0($29)\n\
+	lw $5, 4($29)\n\
+	lw $6, 8($29)\n\
+	lw $7, 12($29)\n\
+	la $25, init1\n\
+	jr $25\n\
+");
+#endif
+
+/* An assembler code wrapping c function ___libc_init_first.
+   ___libc_init_first does an RPC call to flush cache to put doinit
+   function on the stack, so we should call __mach_init first in
+   this wrap. */
+#ifdef __mips64
+asm ("\
+	.text\n\
+	.align 3\n\
+	.globl __libc_init_first\n\
+__libc_init_first:\n\
+	dsubu $29, 8\n\
+	sd $31, 0($29)\n\
+	jal __mach_init\n\
+	ld $4, 0($29)\n\
+	ld $5, 1*8($29)\n\
+	ld $6, 2*8($29)\n\
+	ld $7, 3*8($29)\n\
+	j ___libc_init_first\n\
+");
+#else
+asm ("\
+	.text\n\
+	.align 2\n\
+	.globl __libc_init_first\n\
+__libc_init_first:\n\
+	subu $29, 4\n\
+	sw $31, 0($29)\n\
+	jal __mach_init\n\
+	lw $4, 0($29)\n\
+	lw $5, 4($29)\n\
+	lw $6, 8($29)\n\
+	lw $7, 12($29)\n\
+	j ___libc_init_first\n\
+");
+#endif
+
+static void
+___libc_init_first (int return_addr, int argc, ...)
+{
+  void doinit (int *data)
+    {
+#if 0
+      /* This function gets called with the argument data at TOS.  */
+      void doinit1 (int argc, ...)
+	{
+	  init (&argc);
+	}
+#endif
+      extern void init (int *data);
+
+      /* Push the user return address after the argument data, and then
+	 jump to `doinit1' (above), so it is as if __libc_init_first's
+	 caller had called `init' with the argument data already on the
+	 stack.  */
+      *--data = return_addr;
+
+#ifdef __mips64
+      asm volatile ("ld $31, 0(%0)\n" /* Load the original return address.  */
+		    "daddu $29, %0, 8\n" /* Switch to new outermost stack.  */
+		    "move $4, $29\n"
+		    "jr %1" : : "r" (data), "r" (&init));
+#else
+      asm volatile ("lw $31, 0(%0)\n" /* Load the original return address.  */
+		    "addu $29, %0, 4\n" /* Switch to new outermost stack.  */
+		    "move $4, $29\n"
+		    "jr %1" : : "r" (data), "r" (&init));
+#endif
+      /* NOTREACHED */
+    }
+
+#if 0
+  /* Initialize data structures so we can do RPCs.  */
+  __mach_init ();
+#endif
+
+  RUN_HOOK (_hurd_preinit_hook, ());
+
+  _hurd_startup ((void **) &argc, &doinit);
+
+  (void) &___libc_init_first;
+}
+#endif
diff --git a/sysdeps/mach/hurd/mips/intr-msg.h b/sysdeps/mach/hurd/mips/intr-msg.h
new file mode 100644
index 0000000000..16c78972ac
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/intr-msg.h
@@ -0,0 +1,127 @@
+/* Machine-dependent details of interruptible RPC messaging.  Mips version.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+
+#ifdef __mips64
+#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \
+({									      \
+  error_t err;								      \
+  mach_port_t __rcv_name = (rcv_name);					      \
+  mach_msg_timeout_t __timeout = (timeout);	       			      \
+  mach_port_t __notify = (notify);					      \
+  asm (".globl _hurd_intr_rpc_msg_do_trap\n" 				      \
+       ".globl _hurd_intr_rpc_msg_in_trap\n"				      \
+       "				move $4, %1\n"			      \
+       "				move $5, %2\n"			      \
+       "				move $6, %3\n"			      \
+       "				move $7, %4\n"			      \
+       "				move $8, %5\n"			      \
+       "				move $9, %6\n"			      \
+       "				move $10, %7\n"			      \
+       "				dli $2, -25\n"			      \
+       "_hurd_intr_rpc_msg_do_trap:	syscall\n"			      \
+       "_hurd_intr_rpc_msg_in_trap:	move %0, $2\n"			      \
+       : "=r" (err)							      \
+       : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size),	      \
+         "r" (__rcv_name), "r" (__timeout), "r" (__notify)		      \
+       : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10",	      \
+         "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28");	      \
+  err;									      \
+})
+#else
+#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \
+({									      \
+  error_t err;								      \
+  mach_port_t __rcv_name = (rcv_name);					      \
+  mach_msg_timeout_t __timeout = (timeout);	       			      \
+  mach_port_t __notify = (notify);					      \
+  asm (".globl _hurd_intr_rpc_msg_do_trap\n" 				      \
+       ".globl _hurd_intr_rpc_msg_in_trap\n"				      \
+       "				move $4, %1\n"			      \
+       "				move $5, %2\n"			      \
+       "				move $6, %3\n"			      \
+       "				move $7, %4\n"			      \
+       "				move $8, %5\n"			      \
+       "				move $9, %6\n"			      \
+       "				move $10, %7\n"			      \
+       "				li $2, -25\n"			      \
+       "_hurd_intr_rpc_msg_do_trap:	syscall\n"			      \
+       "_hurd_intr_rpc_msg_in_trap:	move %0, $2\n"			      \
+       : "=r" (err)							      \
+       : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size),	      \
+         "r" (__rcv_name), "r" (__timeout), "r" (__notify)		      \
+       : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10",	      \
+         "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28");	      \
+  err;									      \
+})
+#endif
+
+static inline void
+INTR_MSG_BACK_OUT (struct mips_thread_state *state)
+{
+  return;
+}
+
+#include "hurdfault.h"
+
+static inline int
+SYSCALL_EXAMINE (struct mips_thread_state *state, int *callno)
+{
+  u_int32_t *p = (void *) (state->pc - 4);
+  int result;
+  if (_hurdsig_catch_memory_fault (p))
+    return 0;
+  if (result = (*p == 0x0000000c))
+    /* The PC is just after a `syscall' instruction.
+       This is a system call in progress; v0($2) holds the call number.  */
+    *callno = state->r2;
+  _hurdsig_end_catch_fault ();
+  return result;
+}
+
+
+struct mach_msg_trap_args
+  {
+    /* This is the order of arguments to mach_msg_trap.  */
+    mach_msg_header_t *msg;
+    mach_msg_option_t option;
+    mach_msg_size_t send_size;
+    mach_msg_size_t rcv_size;
+    mach_port_t rcv_name;
+    mach_msg_timeout_t timeout;
+    mach_port_t notify;
+  };
+
+
+static inline mach_port_t
+MSG_EXAMINE (struct mips_thread_state *state, int *msgid)
+{
+  mach_msg_header_t *msg;
+  mach_port_t send_port;
+
+  msg = (mach_msg_header_t *) state->r4;
+
+  if (_hurdsig_catch_memory_fault (msg))
+    return MACH_PORT_NULL;
+  send_port = msg->msgh_remote_port;
+  *msgid = msg->msgh_id;
+  _hurdsig_end_catch_fault ();
+
+  return send_port;
+}
diff --git a/sysdeps/mach/hurd/fremovexattr.c b/sysdeps/mach/hurd/mips/longjmp-ctx.c
index 5d3aca6093..66ee7b6fb8 100644
--- a/sysdeps/mach/hurd/fremovexattr.c
+++ b/sysdeps/mach/hurd/mips/longjmp-ctx.c
@@ -1,5 +1,5 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+/* Perform a `longjmp' on a `struct sigcontext'.  MIPS version.
+   Copyright (C) 1996, 1997 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
@@ -17,18 +17,25 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <hurd/fd.h>
+#include <setjmp.h>
+#include <hurd/signal.h>
+#include <string.h>
 
-int
-fremovexattr (int fd, const char *name)
+void
+_hurd_longjmp_sigcontext (struct sigcontext *scp, jmp_buf env, int retval)
 {
-  error_t err;
+  scp->sc_gpr[16] = env[0].__regs[0];
+  scp->sc_gpr[17] = env[0].__regs[1];
+  scp->sc_gpr[18] = env[0].__regs[2];
+  scp->sc_gpr[19] = env[0].__regs[3];
+  scp->sc_gpr[20] = env[0].__regs[4];
+  scp->sc_gpr[21] = env[0].__regs[5];
+  scp->sc_gpr[22] = env[0].__regs[6];
+  scp->sc_gpr[23] = env[0].__regs[7];
 
-  err = HURD_DPORT_USE (fd, _hurd_xattr_remove (port, name));
-
-  return err ? __hurd_dfail (fd, err) : 0;
+  scp->sc_gpr[28] = (int) env[0].__gp;
+  scp->sc_fp = (int) env[0].__fp;
+  scp->sc_sp = (int) env[0].__sp;
+  scp->sc_pc = (int) env[0].__pc;
+  scp->sc_gpr[2] = retval ?: 1;
 }
diff --git a/sysdeps/mach/hurd/mips/longjmp-ts.c b/sysdeps/mach/hurd/mips/longjmp-ts.c
new file mode 100644
index 0000000000..4c69e4e2b9
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/longjmp-ts.c
@@ -0,0 +1,45 @@
+/* Perform a `longjmp' on a Mach thread_state.  MIPS version.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd/signal.h>
+#include <setjmp.h>
+#include <mach/thread_status.h>
+
+
+/* Set up STATE to do the equivalent of `longjmp (ENV, VAL);'.  */
+
+void
+_hurd_longjmp_thread_state (void *state, jmp_buf env, int val)
+{
+  struct mips_thread_state *ts = state;
+
+  ts->r16 = env[0].__jmpbuf[0].__regs[0];
+  ts->r17 = env[0].__jmpbuf[0].__regs[1];
+  ts->r18 = env[0].__jmpbuf[0].__regs[2];
+  ts->r19 = env[0].__jmpbuf[0].__regs[3];
+  ts->r20 = env[0].__jmpbuf[0].__regs[4];
+  ts->r21 = env[0].__jmpbuf[0].__regs[5];
+  ts->r22 = env[0].__jmpbuf[0].__regs[6];
+  ts->r23 = env[0].__jmpbuf[0].__regs[7];
+  ts->r28 = (int) env[0].__jmpbuf[0].__gp;
+  ts->r29 = (int) env[0].__jmpbuf[0].__sp;
+  ts->r30 = (int) env[0].__jmpbuf[0].__fp;
+  ts->pc = (int) env[0].__jmpbuf[0].__pc;
+  ts->r2 = val ?: 1;
+}
diff --git a/sysdeps/mach/hurd/mips/sigreturn.c b/sysdeps/mach/hurd/mips/sigreturn.c
new file mode 100644
index 0000000000..a9f7673eb5
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/sigreturn.c
@@ -0,0 +1,223 @@
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd.h>
+#include <hurd/signal.h>
+#include <hurd/threadvar.h>
+#include <stdlib.h>
+#include <mach/mips/mips_instruction.h>
+
+int
+__sigreturn (struct sigcontext *scp)
+{
+  struct hurd_sigstate *ss;
+  struct hurd_userlink *link = (void *) &scp[1];
+  mach_port_t *reply_port;
+
+  if (scp == NULL || (scp->sc_mask & _SIG_CANT_MASK))
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  ss = _hurd_self_sigstate ();
+  __spin_lock (&ss->lock);
+
+  /* Remove the link on the `active resources' chain added by
+     _hurd_setup_sighandler.  Its purpose was to make sure
+     that we got called; now we have, it is done.  */
+  _hurd_userlink_unlink (link);
+
+  /* Restore the set of blocked signals, and the intr_port slot.  */
+  ss->blocked = scp->sc_mask;
+  ss->intr_port = scp->sc_intr_port;
+
+  /* Check for pending signals that were blocked by the old set.  */
+  if (ss->pending & ~ss->blocked)
+    {
+      /* There are pending signals that just became unblocked.  Wake up the
+	 signal thread to deliver them.  But first, squirrel away SCP where
+	 the signal thread will notice it if it runs another handler, and
+	 arrange to have us called over again in the new reality.  */
+      ss->context = scp;
+      __spin_unlock (&ss->lock);
+      __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
+      /* If a pending signal was handled, sig_post never returned.  */
+      __spin_lock (&ss->lock);
+      ss->context = NULL;
+    }
+
+  if (scp->sc_onstack)
+    {
+      ss->sigaltstack.ss_flags &= ~SS_ONSTACK; /* XXX threadvars */
+      /* XXX cannot unlock until off sigstack */
+      abort ();
+    }
+  else
+    __spin_unlock (&ss->lock);
+
+  /* Destroy the MiG reply port used by the signal handler, and restore the
+     reply port in use by the thread when interrupted.  */
+  reply_port =
+    (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
+  if (*reply_port)
+    {
+      mach_port_t port = *reply_port;
+
+      /* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port not to
+	 get another reply port, but avoids mig_dealloc_reply_port trying to
+	 deallocate it after the receive fails (which it will, because the
+	 reply port will be bogus, whether we do this or not).  */
+      *reply_port = MACH_PORT_DEAD;
+
+      __mach_port_destroy (__mach_task_self (), port);
+    }
+  *reply_port = scp->sc_reply_port;
+
+  if (scp->sc_coproc_used & SC_COPROC_USE_FPU)
+    {
+      /* Restore FPU state.  */
+#define restore_fpr(n) \
+  asm volatile ("l.d $f" #n ",%0" : : "m" (scp->sc_fpr[n]))
+
+      /* Restore floating-point registers. */
+#ifdef __mips64
+      restore_fpr (0);
+      restore_fpr (1);
+      restore_fpr (2);
+      restore_fpr (3);
+      restore_fpr (4);
+      restore_fpr (5);
+      restore_fpr (6);
+      restore_fpr (7);
+      restore_fpr (8);
+      restore_fpr (9);
+      restore_fpr (10);
+      restore_fpr (11);
+      restore_fpr (12);
+      restore_fpr (13);
+      restore_fpr (14);
+      restore_fpr (15);
+      restore_fpr (16);
+      restore_fpr (17);
+      restore_fpr (18);
+      restore_fpr (19);
+      restore_fpr (20);
+      restore_fpr (21);
+      restore_fpr (22);
+      restore_fpr (23);
+      restore_fpr (24);
+      restore_fpr (25);
+      restore_fpr (26);
+      restore_fpr (27);
+      restore_fpr (28);
+      restore_fpr (29);
+      restore_fpr (30);
+      restore_fpr (31);
+#else
+      restore_fpr (0);
+      restore_fpr (2);
+      restore_fpr (4);
+      restore_fpr (6);
+      restore_fpr (8);
+      restore_fpr (10);
+      restore_fpr (12);
+      restore_fpr (14);
+      restore_fpr (16);
+      restore_fpr (18);
+      restore_fpr (20);
+      restore_fpr (22);
+      restore_fpr (24);
+      restore_fpr (26);
+      restore_fpr (28);
+      restore_fpr (30);
+#endif
+
+      /* Restore the floating-point control/status register ($f31).  */
+      asm volatile ("ctc1 %0,$f31" : : "r" (scp->sc_fpcsr));
+    }
+
+  /* Load all the registers from the sigcontext.  */
+#ifdef __mips64
+#define restore_gpr(n) \
+  asm volatile ("ld $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
+#else
+#define restore_gpr(n) \
+  asm volatile ("lw $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
+#endif
+
+  {
+    register const struct sigcontext *const scpreg asm ("$1") = scp;
+    register int *at asm ("$1");
+
+    /* First restore the multiplication result registers.  The compiler
+       will use some temporary registers, so we do this before restoring
+       the general registers.  */
+    asm volatile ("mtlo %0" : : "r" (scpreg->sc_mdlo));
+    asm volatile ("mthi %0" : : "r" (scpreg->sc_mdhi));
+
+    /* In the word after the saved PC, store the saved $1 value.  */
+    (&scpreg->sc_pc)[1] = scpreg->sc_gpr[0];
+
+    asm volatile (".set noreorder; .set noat;");
+
+    /* Restore the normal registers.  */
+    restore_gpr (2);
+    restore_gpr (3);
+    restore_gpr (4);
+    restore_gpr (5);
+    restore_gpr (6);
+    restore_gpr (7);
+    restore_gpr (8);
+    restore_gpr (9);
+    restore_gpr (10);
+    restore_gpr (11);
+    restore_gpr (12);
+    restore_gpr (13);
+    restore_gpr (14);
+    restore_gpr (15);
+    restore_gpr (16);
+    restore_gpr (17);
+    restore_gpr (18);
+    restore_gpr (19);
+    restore_gpr (20);
+    restore_gpr (21);
+    restore_gpr (22);
+    restore_gpr (23);
+    restore_gpr (24);
+    restore_gpr (25);
+    /* Registers 26-27 are kernel-only.  */
+    restore_gpr (28);
+    restore_gpr (29);		/* Stack pointer.  */
+    restore_gpr (30);		/* Frame pointer.  */
+    restore_gpr (31);		/* Return address.  */
+
+    at = &scpreg->sc_pc;
+    /* This is an emulated instruction that will find at the address in $1
+       two words: the PC value to restore, and the $1 value to restore.  */
+    asm volatile (".word %0" : : "i" (op_sigreturn));
+    asm volatile (".set reorder; .set at;");
+    /* NOTREACHED */
+    return at;		/* To prevent optimization.  */
+  }
+
+  /* NOTREACHED */
+  return -1;
+}
+
+weak_alias (__sigreturn, sigreturn)
diff --git a/sysdeps/mach/hurd/mips/trampoline.c b/sysdeps/mach/hurd/mips/trampoline.c
new file mode 100644
index 0000000000..dd42dfc1c6
--- /dev/null
+++ b/sysdeps/mach/hurd/mips/trampoline.c
@@ -0,0 +1,292 @@
+/* Set thread_state for sighandler, and sigcontext to recover.  MIPS version.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <hurd/signal.h>
+#include <hurd/userlink.h>
+#include "thread_state.h"
+#include <assert.h>
+#include <errno.h>
+#include "hurdfault.h"
+#include "intr-msg.h"
+
+
+struct sigcontext *
+_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
+			int signo, struct hurd_signal_detail *detail,
+			volatile int rpc_wait,
+			struct machine_thread_all_state *state)
+{
+  __label__ trampoline, rpc_wait_trampoline, firewall;
+  void *volatile sigsp;
+  struct sigcontext *scp;
+  struct 
+    {
+      int signo;
+      long int sigcode;
+      struct sigcontext *scp;	/* Points to ctx, below.  */
+      void *sigreturn_addr;
+      void *sigreturn_returns_here;
+      struct sigcontext *return_scp; /* Same; arg to sigreturn.  */
+      struct sigcontext ctx;
+      struct hurd_userlink link;
+    } *stackframe;
+
+  if (ss->context)
+    {
+      /* We have a previous sigcontext that sigreturn was about
+	 to restore when another signal arrived.  We will just base
+	 our setup on that.  */
+      if (! _hurdsig_catch_memory_fault (ss->context))
+	{
+	  memcpy (&state->basic, &ss->context->sc_mips_thread_state,
+		  sizeof (state->basic));
+	  memcpy (&state->exc, &ss->context->sc_mips_exc_state,
+		  sizeof (state->exc));
+	  state->set = (1 << MIPS_THREAD_STATE) | (1 << MIPS_EXC_STATE);
+	  if (state->exc.coproc_state & SC_COPROC_USE_FPU)
+	    {
+	      memcpy (&state->fpu, &ss->context->sc_mips_float_state,
+		      sizeof (state->fpu));
+	      state->set |= (1 << MIPS_FLOAT_STATE);
+	    }
+	}
+    }
+
+  if (! machine_get_basic_state (ss->thread, state))
+    return NULL;
+
+  /* Save the original SP in the gratuitous s0 ($16) slot.
+     We may need to reset the SP (the `r29' slot) to avoid clobbering an
+     interrupted RPC frame.  */
+  state->basic.r16 = state->basic.r29;
+
+  if ((ss->actions[signo].sa_flags & SA_ONSTACK) &&
+      !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK)))
+    {
+      sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size;
+      ss->sigaltstack.ss_flags |= SS_ONSTACK;
+      /* XXX need to set up base of new stack for
+	 per-thread variables, cthreads.  */
+    }
+  else
+    sigsp = (char *) state->basic.r29;
+
+  /* Push the arguments to call `trampoline' on the stack.  */
+  sigsp -= sizeof (*stackframe);
+  stackframe = sigsp;
+
+  if (_hurdsig_catch_memory_fault (stackframe))
+    {
+      /* We got a fault trying to write the stack frame.
+	 We cannot set up the signal handler.
+	 Returning NULL tells our caller, who will nuke us with a SIGILL.  */
+      return NULL;
+    }
+  else
+    {
+      int ok;
+
+      extern void _hurdsig_longjmp_from_handler (void *, jmp_buf, int);
+
+      /* Add a link to the thread's active-resources list.  We mark this as
+	 the only user of the "resource", so the cleanup function will be
+	 called by any longjmp which is unwinding past the signal frame.
+	 The cleanup function (in sigunwind.c) will make sure that all the
+	 appropriate cleanups done by sigreturn are taken care of.  */
+      stackframe->link.cleanup = &_hurdsig_longjmp_from_handler;
+      stackframe->link.cleanup_data = &stackframe->ctx;
+      stackframe->link.resource.next = NULL;
+      stackframe->link.resource.prevp = NULL;
+      stackframe->link.thread.next = ss->active_resources;
+      stackframe->link.thread.prevp = &ss->active_resources;
+      if (stackframe->link.thread.next)
+	stackframe->link.thread.next->thread.prevp
+	  = &stackframe->link.thread.next;
+      ss->active_resources = &stackframe->link;
+
+      /* Set up the arguments for the signal handler.  */
+      stackframe->signo = signo;
+      stackframe->sigcode = detail->code;
+      stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx;
+      stackframe->sigreturn_addr = &__sigreturn;
+      stackframe->sigreturn_returns_here = &&firewall; /* Crash on return.  */
+
+      /* Set up the sigcontext from the current state of the thread.  */
+
+      scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0;
+
+      /* struct sigcontext is laid out so that starting at sc_gpr
+	 mimics a struct mips_thread_state.  */
+      memcpy (&scp->sc_mips_thread_state,
+	      &state->basic, sizeof (state->basic));
+
+      /* struct sigcontext is laid out so that starting at sc_cause
+	 mimics a struct mips_exc_state.  */
+      ok = machine_get_state (ss->thread, state, MIPS_EXC_STATE,
+			      &state->exc, &scp->sc_cause,
+			      sizeof (state->exc));
+
+      if (ok && (scp->sc_coproc_used & SC_COPROC_USE_FPU))
+	/* struct sigcontext is laid out so that starting at sc_fpr
+	   mimics a struct mips_float_state.  This state
+	   is only meaningful if the coprocessor was used.  */
+	  ok = machine_get_state (ss->thread, state, MIPS_FLOAT_STATE,
+				  &state->fpu, &scp->sc_mips_float_state,
+				  sizeof (state->fpu));
+
+      _hurdsig_end_catch_fault ();
+
+      if (! ok)
+	return NULL;
+    }
+
+  /* Modify the thread state to call the trampoline code on the new stack.  */
+  if (rpc_wait)
+    {
+      /* The signalee thread was blocked in a mach_msg_trap system call,
+	 still waiting for a reply.  We will have it run the special
+	 trampoline code which retries the message receive before running
+	 the signal handler.
+	 
+	 To do this we change the OPTION argument in its registers to
+	 enable only message reception, since the request message has
+	 already been sent.  */
+
+      /* The system call arguments are stored in consecutive registers
+	 starting with a0 ($4).  */
+      struct mach_msg_trap_args *args = (void *) &state->basic.r4;
+
+      if (_hurdsig_catch_memory_fault (args))
+	{
+	  /* Faulted accessing ARGS.  Bomb.  */
+	  return NULL;
+	}
+
+      assert (args->option & MACH_RCV_MSG);
+      /* Disable the message-send, since it has already completed.  The
+	 calls we retry need only wait to receive the reply message.  */
+      args->option &= ~MACH_SEND_MSG;
+
+      /* Limit the time to receive the reply message, in case the server
+	 claimed that `interrupt_operation' succeeded but in fact the RPC
+	 is hung.  */
+      args->option |= MACH_RCV_TIMEOUT;
+      args->timeout = _hurd_interrupted_rpc_timeout;
+
+      _hurdsig_end_catch_fault ();
+
+      state->basic.pc = (int) &&rpc_wait_trampoline;
+      /* The reply-receiving trampoline code runs initially on the original
+	 user stack.  We pass it the signal stack pointer in s4 ($20).  */
+      state->basic.r29 = state->basic.r16; /* Restore mach_msg syscall SP.  */
+      state->basic.r20 = (int) sigsp;
+      /* After doing the message receive, the trampoline code will need to
+	 update the v0 ($2) value to be restored by sigreturn.  To simplify
+	 the assembly code, we pass the address of its slot in SCP to the
+	 trampoline code in s5 ($21).  */
+      state->basic.r21 = (int) &scp->sc_gpr[1];
+      /* We must preserve the mach_msg_trap args in a0..t2 ($4..$10).
+	 Pass the handler args to the trampoline code in s1..s3 ($17..$19).  */
+      state->basic.r17 = signo;
+      state->basic.r18 = detail->code;
+      state->basic.r19 = (int) scp;
+    }
+  else
+    {
+      state->basic.pc = (int) &&trampoline;
+      state->basic.r29 = (int) sigsp;
+      state->basic.r4 = signo;
+      state->basic.r5 = detail->code;
+      state->basic.r6 = (int) scp;
+    }
+
+  /* We pass the handler function to the trampoline code in s6 ($22).  */
+  state->basic.r22 = (int) handler;
+  /* In the callee-saved register s0 ($16), we save the SCP value to pass
+     to __sigreturn after the handler returns.  */
+  state->basic.r16 = (int) scp;
+
+  return scp;
+
+  /* The trampoline code follows.  This is not actually executed as part of
+     this function, it is just convenient to write it that way.  */
+
+ rpc_wait_trampoline:
+  /* This is the entry point when we have an RPC reply message to receive
+     before running the handler.  The MACH_MSG_SEND bit has already been
+     cleared in the OPTION argument in our registers.  For our convenience,
+     $3 points to the sc_gpr[1] member of the sigcontext (saved v0 ($2)).  */
+  asm volatile
+    (".set noat; .set noreorder; .set nomacro\n"
+     /* Retry the interrupted mach_msg system call.  */
+#ifdef __mips64
+     "dli $2, -25\n"		/* mach_msg_trap */
+#else
+     "li $2, -25\n"		/* mach_msg_trap */
+#endif
+     "syscall\n"
+     /* When the sigcontext was saved, v0 was MACH_RCV_INTERRUPTED.  But
+	now the message receive has completed and the original caller of
+	the RPC (i.e. the code running when the signal arrived) needs to
+	see the final return value of the message receive in v0.  So
+	store the new v0 value into the sc_gpr[1] member of the sigcontext
+	(whose address is in s5 to make this code simpler).  */
+#ifdef __mips64
+     "sd $2, ($21)\n"
+#else
+     "sw $2, ($21)\n"
+#endif
+     /* Since the argument registers needed to have the mach_msg_trap
+	arguments, we've stored the arguments to the handler function
+	in registers s1..s3 ($17..$19).  */
+     "move $4, $17\n"
+     "move $5, $18\n"
+     "move $6, $19\n"
+     /* Switch to the signal stack.  */
+     "move $29, $20\n");
+
+ trampoline:
+  /* Entry point for running the handler normally.  The arguments to the
+     handler function are already in the standard registers:
+
+       a0	SIGNO
+       a1	SIGCODE
+       a2	SCP
+     */
+  asm volatile
+    ("move $25, $22\n"		/* Copy s6 to t9 for MIPS ABI.  */
+     "jal $25; nop\n"		/* Call the handler function.  */
+     /* Call __sigreturn (SCP); this cannot return.  */
+#ifdef __mips64
+     "dla $1,%0\n"
+#else
+     "la $1,%0\n"
+#endif
+     "j $1\n"
+     "move $4, $16"		/* Set up arg from saved SCP in delay slot.  */
+     : : "i" (&__sigreturn));
+
+  /* NOTREACHED */
+  asm volatile (".set reorder; .set at; .set macro");
+
+ firewall:
+  asm volatile ("hlt: j hlt");
+
+  return NULL;
+}
diff --git a/sysdeps/mach/hurd/mkdirat.c b/sysdeps/mach/hurd/mkdirat.c
deleted file mode 100644
index 321d59f2fd..0000000000
--- a/sysdeps/mach/hurd/mkdirat.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Create a directory named relative to another open directory.  Hurd version.
-   Copyright (C) 1991,1993,1994,1995,1996,1997,2002,2006
-	Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <hurd.h>
-
-int
-mkdirat (fd, path, mode)
-     int fd;
-     const char *path;
-     mode_t mode;
-{
-  error_t err;
-  const char *name;
-  file_t parent = __directory_name_split (path, (char **) &name);
-  if (parent == MACH_PORT_NULL)
-    return -1;
-  err = __dir_mkdir (parent, name, mode & ~_hurd_umask);
-  __mach_port_deallocate (__mach_task_self (), parent);
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/fgetxattr.c b/sysdeps/mach/hurd/nfs/nfs.h
index 2eb6db06c7..e83a874fe6 100644
--- a/sysdeps/mach/hurd/fgetxattr.c
+++ b/sysdeps/mach/hurd/nfs/nfs.h
@@ -1,5 +1,5 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2004 Free Software Foundation, Inc.
+/* <nfs/nfs.h> -- ill-specified NFS-related definitions
+   Copyright (C) 1999 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
@@ -17,18 +17,16 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <hurd/fd.h>
+#ifndef _NFS_NFS_H
+#define _NFS_NFS_H 1
 
-ssize_t
-fgetxattr (int fd, const char *name, void *value, size_t size)
-{
-  error_t err;
+/* This file is empty for now.  Its contents do not seem to be
+   standardized in any way.  It exists solely for the sake of
+   <rpcsvc/bootparam_prot.h> which insists on including <nfs/nfs.h>.
 
-  err = HURD_DPORT_USE (fd, _hurd_xattr_get (port, name, value, &size));
+   For the time being, we just provide this file here to smooth building
+   the libc distribution (i.e. librpcsvc).  We do not install this file for
+   users, since we haven't really figured out what the right thing to go
+   here is.  */
 
-  return err ? __hurd_dfail (fd, err) : size;
-}
+#endif /* nfs/nfs.h */
diff --git a/sysdeps/mach/hurd/open.c b/sysdeps/mach/hurd/open.c
index bdfed5e311..dd575a47b1 100644
--- a/sysdeps/mach/hurd/open.c
+++ b/sysdeps/mach/hurd/open.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,93,94,95,97,2000,2002,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,97,2000,2002 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
@@ -51,9 +51,3 @@ libc_hidden_def (__libc_open)
 weak_alias (__libc_open, __open)
 libc_hidden_weak (__open)
 weak_alias (__libc_open, open)
-
-/* open64 is just the same as open for us.  */
-weak_alias (__libc_open, __libc_open64)
-weak_alias (__libc_open, __open64)
-libc_hidden_weak (_open64)
-weak_alias (__libc_open, open64)
diff --git a/sysdeps/mach/hurd/open64.c b/sysdeps/mach/hurd/open64.c
deleted file mode 100644
index 018ac94f28..0000000000
--- a/sysdeps/mach/hurd/open64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* open64 is defined in open.c as an alias.  */
diff --git a/sysdeps/mach/hurd/openat.c b/sysdeps/mach/hurd/openat.c
deleted file mode 100644
index 1faf857e16..0000000000
--- a/sysdeps/mach/hurd/openat.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* openat -- Open a file named relative to an open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-/* Open FILE with access OFLAG.  Interpret relative paths relative to
-   the directory associated with FD.  If OFLAG includes O_CREAT, a
-   third argument is the file protection.  */
-int
-__openat (fd, file, oflag)
-     int fd;
-     const char *file;
-     int oflag;
-{
-  int mode;
-  io_t port;
-
-  if (oflag & O_CREAT)
-    {
-      va_list arg;
-      va_start (arg, oflag);
-      mode = va_arg (arg, int);
-      va_end (arg);
-    }
-  else
-    mode = 0;
-
-  port = __file_name_lookup_at (fd, 0, file, oflag, mode);
-  if (port == MACH_PORT_NULL)
-    return -1;
-
-  return _hurd_intern_fd (port, oflag, 1);
-}
-libc_hidden_def (__openat)
-weak_alias (__openat, openat)
-
-/* openat64 is just the same as openat for us.  */
-weak_alias (__openat, __openat64)
-libc_hidden_weak (__openat64)
-weak_alias (__openat, openat64)
diff --git a/sysdeps/mach/hurd/openat64.c b/sysdeps/mach/hurd/openat64.c
deleted file mode 100644
index 15d9d6a183..0000000000
--- a/sysdeps/mach/hurd/openat64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* openat64 is defined in openat.c as an alias.  */
diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c
index 23e04ede0e..a1ff947f06 100644
--- a/sysdeps/mach/hurd/opendir.c
+++ b/sysdeps/mach/hurd/opendir.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1993,1994,1995,1996,1997,1998,2001,2003,2005,2006
-	Free Software Foundation, Inc.
+/* Copyright (C) 1993,94,95,96,97,98,2001,2003 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
@@ -33,29 +32,62 @@
 #include "dirstream.h"
 
 
-/* Open a directory stream on a file descriptor in Hurd internal form.
-   We do no checking here on the descriptor.  */
+/* Open a directory stream on NAME.  */
 DIR *
-_hurd_fd_opendir (struct hurd_fd *d)
+__opendir (const char *name)
 {
   DIR *dirp;
+  int fd;
+  struct hurd_fd *d;
 
-  if (d == NULL)
+  if (name[0] == '\0')
     {
-      errno = EBADF;
+      /* POSIX.1-1990 says an empty name gets ENOENT;
+	 but `open' might like it fine.  */
+      __set_errno (ENOENT);
       return NULL;
     }
 
+  {
+    /* Append trailing slash to directory name to force ENOTDIR
+       if it's not a directory.
+
+       We open using the O_NONBLOCK flag so that a nondirectory with
+       blocking behavior (FIFO or device) gets ENOTDIR immediately
+       rather than waiting for the special file's open wakeup predicate.  */
+
+    size_t len = strlen (name);
+    if (name[len - 1] == '/')
+      fd = __open (name, O_RDONLY | O_NONBLOCK);
+    else
+      {
+	char n[len + 2];
+	memcpy (n, name, len);
+	n[len] = '/';
+	n[len + 1] = '\0';
+	fd = __open (n, O_RDONLY | O_NONBLOCK);
+      }
+  }
+  if (fd < 0)
+    return NULL;
+
   dirp = (DIR *) malloc (sizeof (DIR));
   if (dirp == NULL)
-    return NULL;
+    {
+      __close (fd);
+      return NULL;
+    }
+
+  /* Extract the pointer to the descriptor structure.  */
+  __mutex_lock (&_hurd_dtable_lock);
+  d = dirp->__fd = _hurd_dtable[fd];
+  __mutex_unlock (&_hurd_dtable_lock);
 
   /* Set the descriptor to close on exec. */
   __spin_lock (&d->port.lock);
   d->flags |= FD_CLOEXEC;
   __spin_unlock (&d->port.lock);
 
-  dirp->__fd = d;
   dirp->__data = dirp->__ptr = NULL;
   dirp->__entry_data = dirp->__entry_ptr = 0;
   dirp->__allocation = 0;
@@ -65,29 +97,4 @@ _hurd_fd_opendir (struct hurd_fd *d)
 
   return dirp;
 }
-
-
-/* Open a directory stream on NAME.  */
-DIR *
-__opendir (const char *name)
-{
-  if (name[0] == '\0')
-    {
-      /* POSIX.1-1990 says an empty name gets ENOENT;
-	 but `open' might like it fine.  */
-      __set_errno (ENOENT);
-      return NULL;
-    }
-
-  int fd = __open (name, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
-  if (fd < 0)
-    return NULL;
-
-  /* Extract the pointer to the descriptor structure.  */
-  DIR *dirp = _hurd_fd_opendir (_hurd_fd_get (fd));
-  if (dirp == NULL)
-    __close (fd);
-
-  return dirp;
-}
 weak_alias (__opendir, opendir)
diff --git a/sysdeps/mach/hurd/powerpc/Dist b/sysdeps/mach/hurd/powerpc/Dist
new file mode 100644
index 0000000000..c58180257e
--- /dev/null
+++ b/sysdeps/mach/hurd/powerpc/Dist
@@ -0,0 +1 @@
+static-start.S
diff --git a/sysdeps/mach/hurd/powerpc/longjmp-ts.c b/sysdeps/mach/hurd/powerpc/longjmp-ts.c
index 757366bc47..4a59f16aa8 100644
--- a/sysdeps/mach/hurd/powerpc/longjmp-ts.c
+++ b/sysdeps/mach/hurd/powerpc/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  PowerPC version.
-   Copyright (C) 1991,94,95,97,2001, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1991,94,95,97,2001 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
@@ -19,7 +19,6 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
-#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/powerpc/register-dump.h b/sysdeps/mach/hurd/powerpc/register-dump.h
index c0b1d06236..0377175227 100644
--- a/sysdeps/mach/hurd/powerpc/register-dump.h
+++ b/sysdeps/mach/hurd/powerpc/register-dump.h
@@ -1,5 +1,5 @@
 /* Dump registers.  PowerPC/Hurd version.
-   Copyright (C) 1998, 2001, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2001 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
@@ -113,7 +113,7 @@ register_dump (int fd, struct sigcontext *ctx)
     }
 
   /* Write the output.  */
-  write (fd, buffer, sizeof(buffer) - 1);
+  write (fd, buffer, sizeof(buffer));
 }
 
 #define REGISTER_DUMP \
diff --git a/sysdeps/mach/hurd/powerpc/trampoline.c b/sysdeps/mach/hurd/powerpc/trampoline.c
index 4e1ea4b9d9..4e5d675258 100644
--- a/sysdeps/mach/hurd/powerpc/trampoline.c
+++ b/sysdeps/mach/hurd/powerpc/trampoline.c
@@ -1,6 +1,5 @@
 /* Set thread_state for sighandler, and sigcontext to recover.  For PowerPC.
-   Copyright (C) 1994,1995,1996,1997,1998,1999,2001,2005
-	Free Software Foundation, Inc.
+   Copyright (C) 1994,95,96,97,98,99,2001 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
@@ -20,11 +19,11 @@
 
 #include <hurd/signal.h>
 #include <hurd/userlink.h>
-#include <thread_state.h>
+#include "thread_state.h"
 #include <assert.h>
 #include <errno.h>
 #include "hurdfault.h"
-#include <intr-msg.h>
+#include "intr-msg.h"
 
 struct sigcontext *
 _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
diff --git a/sysdeps/mach/hurd/ppoll.c b/sysdeps/mach/hurd/ppoll.c
deleted file mode 100644
index 693bc13839..0000000000
--- a/sysdeps/mach/hurd/ppoll.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* poll file descriptors.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <sys/poll.h>
-#include <sys/time.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-int
-ppoll (struct pollfd *fds, nfds_t nfds,
-       const struct timespec *timeout, const sigset_t *sigmask)
-{
-  return _hurd_select (nfds, fds, NULL, NULL, NULL, timeout, sigmask);
-}
diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c
index 0426f67b6f..d212872643 100644
--- a/sysdeps/mach/hurd/profil.c
+++ b/sysdeps/mach/hurd/profil.c
@@ -1,5 +1,5 @@
 /* Low-level statistical profiling support function.  Mach/Hurd version.
-   Copyright (C) 1995, 1996, 1997, 2000, 2002, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -49,7 +49,6 @@ static kern_return_t profil_task_get_sampled_pcs (mach_port_t,
 						  sampled_pc_array_t,
 						  mach_msg_type_number_t *);
 static void fetch_samples (void);
-static void profile_waiter (void);
 
 /* Enable statistical profiling, writing samples of the PC into at most
    SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling
@@ -65,6 +64,7 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
   if (profile_thread == MACH_PORT_NULL)
     {
       /* Set up the profiling collector thread.  */
+      static void profile_waiter (void);
       err = __thread_create (__mach_task_self (), &profile_thread);
       if (! err)
 	err = __mach_setup_thread (__mach_task_self (), profile_thread,
diff --git a/sysdeps/mach/hurd/readdir64_r.c b/sysdeps/mach/hurd/readdir64_r.c
index 5b5a7fe362..c26b35bb70 100644
--- a/sysdeps/mach/hurd/readdir64_r.c
+++ b/sysdeps/mach/hurd/readdir64_r.c
@@ -109,4 +109,4 @@ __readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
   return dp ? 0 : err ? errno : 0;
 }
 
-weak_alias (__readdir64_r, readdir64_r)
+weak_alias(__readdir64_r, readdir64_r)
diff --git a/sysdeps/mach/hurd/recv.c b/sysdeps/mach/hurd/recv.c
index b001729d18..a2b8fd5be5 100644
--- a/sysdeps/mach/hurd/recv.c
+++ b/sysdeps/mach/hurd/recv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994,1997,2001,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1997, 2001 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
@@ -26,8 +26,9 @@
 /* Read N bytes into BUF from socket FD.
    Returns the number read or -1 for errors.  */
 
+/* XXX should be __recv ? */
 ssize_t
-__recv (fd, buf, n, flags)
+recv (fd, buf, n, flags)
      int fd;
      void *buf;
      size_t n;
@@ -61,4 +62,3 @@ __recv (fd, buf, n, flags)
 
   return nread;
 }
-weak_alias (__recv, recv)
diff --git a/sysdeps/mach/hurd/removexattr.c b/sysdeps/mach/hurd/removexattr.c
deleted file mode 100644
index bbfee3d304..0000000000
--- a/sysdeps/mach/hurd/removexattr.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-
-ssize_t
-removexattr (const char *path, const char *name)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_remove (port, name);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return __hurd_fail (err);
-}
diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c
index fec64a8cb5..9fef56287d 100644
--- a/sysdeps/mach/hurd/setitimer.c
+++ b/sysdeps/mach/hurd/setitimer.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1994,1995,1996,1997,2000,2001,2005
-	Free Software Foundation, Inc.
+/* Copyright (C) 1994,1995,1996,1997,2000,2001 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
@@ -42,7 +41,7 @@ static void
 quantize_timeval (struct timeval *tv)
 {
   static time_t quantum = -1;
-
+  
   if (quantum == -1)
     quantum = 1000000 / __getclktck ();
 
@@ -128,15 +127,14 @@ timer_thread (void)
 }
 
 
-/* Forward declaration.  */
-static int setitimer_locked (const struct itimerval *new,
-			     struct itimerval *old, void *crit);
-
 static sighandler_t
 restart_itimer (struct hurd_signal_preemptor *preemptor,
 		struct hurd_sigstate *ss,
 		int *signo, struct hurd_signal_detail *detail)
 {
+  static int setitimer_locked (const struct itimerval *new,
+			       struct itimerval *old, void *crit);
+
   /* This function gets called in the signal thread
      each time a SIGALRM is arriving (even if blocked).  */
   struct itimerval it;
diff --git a/sysdeps/mach/hurd/setresgid.c b/sysdeps/mach/hurd/setresgid.c
index 8fcf26eaf1..d0ee412b46 100644
--- a/sysdeps/mach/hurd/setresgid.c
+++ b/sysdeps/mach/hurd/setresgid.c
@@ -1,5 +1,5 @@
-/* setresgid -- set real group ID, effective group ID, and saved-set group ID
-   Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
+/* setresgid -- set effective group ID, real group ID, and saved-set group ID
+   Copyright (C) 2002 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
@@ -22,10 +22,10 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Set the real group ID, effective group ID, and saved-set group ID,
-   of the calling process to RGID, EGID, and SGID, respectively.  */
+/* Set the effective group ID, real group ID, and saved-set group ID,
+   of the calling process to EGID, RGID, and SGID, respectively.  */
 int
-__setresgid (gid_t rgid, gid_t egid, gid_t sgid)
+__setresgid (gid_t egid, gid_t rgid, gid_t sgid)
 {
   auth_t newauth;
   error_t err;
@@ -75,4 +75,3 @@ __setresgid (gid_t rgid, gid_t egid, gid_t sgid)
   return err;
 }
 libc_hidden_def (__setresgid)
-weak_alias (__setresgid, setresgid)
diff --git a/sysdeps/mach/hurd/setresuid.c b/sysdeps/mach/hurd/setresuid.c
index ccf8d08d40..2d05dbc850 100644
--- a/sysdeps/mach/hurd/setresuid.c
+++ b/sysdeps/mach/hurd/setresuid.c
@@ -1,5 +1,5 @@
-/* setresuid -- set real user ID, effective user ID, and saved-set user ID
-   Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
+/* setresuid -- set effective user ID, real user ID, and saved-set user ID
+   Copyright (C) 2002 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
@@ -22,10 +22,10 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Set the real user ID, effective user ID, and saved-set user ID,
-   of the calling process to RUID, EUID, and SUID, respectively.  */
+/* Set the effective user ID, real user ID, and saved-set user ID,
+   of the calling process to EUID, RUID, and SUID, respectively.  */
 int
-__setresuid (uid_t ruid, uid_t euid, uid_t suid)
+__setresuid (uid_t euid, uid_t ruid, uid_t suid)
 {
   auth_t newauth;
   error_t err;
@@ -75,4 +75,3 @@ __setresuid (uid_t ruid, uid_t euid, uid_t suid)
   return err;
 }
 libc_hidden_def (__setresuid)
-weak_alias (__setresuid, setresuid)
diff --git a/sysdeps/mach/hurd/setxattr.c b/sysdeps/mach/hurd/setxattr.c
deleted file mode 100644
index afabc8ee06..0000000000
--- a/sysdeps/mach/hurd/setxattr.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Access to extended attributes on files.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/xattr.h>
-#include <hurd.h>
-#include <hurd/xattr.h>
-
-ssize_t
-setxattr (const char *path, const char *name, const void *value, size_t size,
-	  int flags)
-{
-  error_t err;
-  file_t port = __file_name_lookup (path, 0, 0);
-  if (port == MACH_PORT_NULL)
-    return -1;
-  err = _hurd_xattr_set (port, name, value, size, flags);
-  __mach_port_deallocate (__mach_task_self (), port);
-  return __hurd_fail (err);
-}
diff --git a/sysdeps/mach/hurd/sigaltstack.c b/sysdeps/mach/hurd/sigaltstack.c
index 5b2f06561b..ea3e07d26b 100644
--- a/sysdeps/mach/hurd/sigaltstack.c
+++ b/sysdeps/mach/hurd/sigaltstack.c
@@ -60,4 +60,4 @@ __sigaltstack (argss, oss)
 
   return 0;
 }
-weak_alias (__sigaltstack, sigaltstack)
+weak_alias(__sigaltstack, sigaltstack)
diff --git a/sysdeps/mach/hurd/symlinkat.c b/sysdeps/mach/hurd/symlinkat.c
deleted file mode 100644
index 9a51c66d8d..0000000000
--- a/sysdeps/mach/hurd/symlinkat.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Create a symbolic link named relative to an open directory.  Hurd version.
-   Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2006
-	Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/paths.h>
-#include <hurd/fd.h>
-#include <string.h>
-
-
-/* Make a link to FROM called TO relative to FD.  */
-int
-symlinkat (from, fd, to)
-     const char *from;
-     int fd;
-     const char *to;
-{
-  error_t err;
-  file_t dir, node;
-  char *name;
-  const size_t len = strlen (from) + 1;
-  char buf[sizeof (_HURD_SYMLINK) + len];
-
-  /* A symlink is a file whose translator is "/hurd/symlink\0target\0".  */
-
-  memcpy (buf, _HURD_SYMLINK, sizeof (_HURD_SYMLINK));
-  memcpy (&buf[sizeof (_HURD_SYMLINK)], from, len);
-
-  dir = __file_name_split_at (fd, to, &name);
-  if (dir == MACH_PORT_NULL)
-    return -1;
-
-  /* Create a new, unlinked node in the target directory.  */
-  err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node);
-
-  if (! err)
-    /* Set the node's translator to make it a symlink.  */
-    err = __file_set_translator (node,
-				 FS_TRANS_EXCL|FS_TRANS_SET,
-				 FS_TRANS_EXCL|FS_TRANS_SET, 0,
-				 buf, sizeof (_HURD_SYMLINK) + len,
-				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
-
-  if (! err)
-    /* Link the node, now a valid symlink, into the target directory.  */
-    err = __dir_link (dir, node, name, 1);
-
-  __mach_port_deallocate (__mach_task_self (), dir);
-  __mach_port_deallocate (__mach_task_self (), node);
-
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h
index cce42ef374..bc15b4dab6 100644
--- a/sysdeps/mach/hurd/tls.h
+++ b/sysdeps/mach/hurd/tls.h
@@ -1,5 +1,5 @@
 /* Definitions for thread-local data handling.  Hurd version.
-   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -23,7 +23,6 @@
 #if defined HAVE_TLS_SUPPORT && !defined ASSEMBLER
 
 # include <stddef.h>
-# include <stdbool.h>
 # include <mach/mig_errors.h>
 # include <mach.h>
 
@@ -32,11 +31,7 @@
 typedef union dtv
 {
   size_t counter;
-  struct
-  {
-    void *val;
-    bool is_static;
-  } pointer;
+  void *pointer;
 } dtv_t;
 
 
diff --git a/sysdeps/mach/hurd/unlinkat.c b/sysdeps/mach/hurd/unlinkat.c
deleted file mode 100644
index 7740c5a297..0000000000
--- a/sysdeps/mach/hurd/unlinkat.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* unlinkat -- Remove a name relative to an open directory.  Hurd version.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-
-/* Remove the link named NAME.  */
-int
-unlinkat (fd, name, flag)
-     int fd;
-     const char *name;
-     int flag;
-{
-  error_t err;
-  file_t dir;
-  const char *file;
-
-  if ((flag &~ AT_REMOVEDIR) != 0)
-    {
-      __set_errno (EINVAL);
-      return -1;
-    }
-
-  dir = __directory_name_split_at (fd, name, (char **) &file);
-  if (dir == MACH_PORT_NULL)
-    return -1;
-
-  err = ((flag & AT_REMOVEDIR) ? __dir_rmdir : __dir_unlink) (dir, file);
-  __mach_port_deallocate (__mach_task_self (), dir);
-
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}
diff --git a/sysdeps/mach/hurd/xmknod.c b/sysdeps/mach/hurd/xmknod.c
index 5f40188fb6..2989215d9c 100644
--- a/sysdeps/mach/hurd/xmknod.c
+++ b/sysdeps/mach/hurd/xmknod.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
-	Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,99,2002 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
@@ -18,10 +17,13 @@
    02111-1307 USA.  */
 
 #include <errno.h>
+#include <sys/stat.h>
+#include <hurd.h>
+#include <hurd/paths.h>
 #include <fcntl.h>
-#include <stddef.h>
+#include "stdio-common/_itoa.h"
+#include <string.h>
 #include <sys/types.h>
-#include <sys/stat.h>
 
 
 /* Create a device file named FILE_NAME, with permission and special bits MODE
@@ -30,6 +32,80 @@
 int
 __xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
 {
-  return __xmknodat (vers, AT_FDCWD, file_name, mode, dev);
+  error_t err;
+  file_t dir, node;
+  char *name;
+  char buf[100], *bp;
+  const char *translator;
+  size_t len;
+
+  if (vers != _MKNOD_VER)
+    return __hurd_fail (EINVAL);
+
+  if (S_ISCHR (mode))
+    {
+      translator = _HURD_CHRDEV;
+      len = sizeof (_HURD_CHRDEV);
+    }
+  else if (S_ISBLK (mode))
+    {
+      translator = _HURD_BLKDEV;
+      len = sizeof (_HURD_BLKDEV);
+    }
+  else if (S_ISFIFO (mode))
+    {
+      translator = _HURD_FIFO;
+      len = sizeof (_HURD_FIFO);
+    }
+  else
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  if (! S_ISFIFO (mode))
+    {
+      /* We set the translator to "ifmt\0major\0minor\0", where IFMT
+	 depends on the S_IFMT bits of our MODE argument, and MAJOR and
+	 MINOR are ASCII decimal (octal or hex would do as well)
+	 representations of our arguments.  Thus the convention is that
+	 CHRDEV and BLKDEV translators are invoked with two non-switch
+	 arguments, giving the major and minor device numbers in %i format. */
+
+      bp = buf + sizeof (buf);
+      *--bp = '\0';
+      bp = _itoa (minor (*dev), bp, 10, 0);
+      *--bp = '\0';
+      bp = _itoa (major (*dev), bp, 10, 0);
+      memcpy (bp - len, translator, len);
+      translator = bp - len;
+      len = buf + sizeof (buf) - translator;
+    }
+
+  dir = __file_name_split (file_name, &name);
+  if (dir == MACH_PORT_NULL)
+    return -1;
+
+  /* Create a new, unlinked node in the target directory.  */
+  err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
+
+  if (! err)
+    /* Set the node's translator to make it a device.  */
+    err = __file_set_translator (node,
+				 FS_TRANS_EXCL | FS_TRANS_SET,
+				 FS_TRANS_EXCL | FS_TRANS_SET, 0,
+				 translator, len,
+				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
+
+  if (! err)
+    /* Link the node, now a valid device, into the target directory.  */
+    err = __dir_link (dir, node, name, 1);
+
+  __mach_port_deallocate (__mach_task_self (), dir);
+  __mach_port_deallocate (__mach_task_self (), node);
+
+  if (err)
+    return __hurd_fail (err);
+  return 0;
 }
 libc_hidden_def (__xmknod)
diff --git a/sysdeps/mach/hurd/xmknodat.c b/sysdeps/mach/hurd/xmknodat.c
deleted file mode 100644
index b2227593c9..0000000000
--- a/sysdeps/mach/hurd/xmknodat.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Create a device file relative to an open directory.  Hurd version.
-   Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
-	Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <sys/stat.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/paths.h>
-#include <fcntl.h>
-#include "stdio-common/_itoa.h"
-#include <string.h>
-#include <sys/types.h>
-
-/* Create a device file named PATH relative to FD, with permission and
-   special bits MODE and device number DEV (which can be constructed
-   from major and minor device numbers with the `makedev' macro
-   above).  */
-int
-__xmknodat (int vers, int fd, const char *path, mode_t mode, dev_t *dev)
-{
-  error_t err;
-  file_t dir, node;
-  char *name;
-  char buf[100], *bp;
-  const char *translator;
-  size_t len;
-
-  if (vers != _MKNOD_VER)
-    return __hurd_fail (EINVAL);
-
-  if (S_ISCHR (mode))
-    {
-      translator = _HURD_CHRDEV;
-      len = sizeof (_HURD_CHRDEV);
-    }
-  else if (S_ISBLK (mode))
-    {
-      translator = _HURD_BLKDEV;
-      len = sizeof (_HURD_BLKDEV);
-    }
-  else if (S_ISFIFO (mode))
-    {
-      translator = _HURD_FIFO;
-      len = sizeof (_HURD_FIFO);
-    }
-  else if (S_ISREG (mode))
-    {
-      translator = NULL;
-      len = 0;
-    }
-  else
-    {
-      errno = EINVAL;
-      return -1;
-    }
-
-  if (translator != NULL && ! S_ISFIFO (mode))
-    {
-      /* We set the translator to "ifmt\0major\0minor\0", where IFMT
-	 depends on the S_IFMT bits of our MODE argument, and MAJOR and
-	 MINOR are ASCII decimal (octal or hex would do as well)
-	 representations of our arguments.  Thus the convention is that
-	 CHRDEV and BLKDEV translators are invoked with two non-switch
-	 arguments, giving the major and minor device numbers in %i format. */
-
-      bp = buf + sizeof (buf);
-      *--bp = '\0';
-      bp = _itoa (minor (*dev), bp, 10, 0);
-      *--bp = '\0';
-      bp = _itoa (major (*dev), bp, 10, 0);
-      memcpy (bp - len, translator, len);
-      translator = bp - len;
-      len = buf + sizeof (buf) - translator;
-    }
-
-  dir = __file_name_split_at (fd, path, &name);
-  if (dir == MACH_PORT_NULL)
-    return -1;
-
-  /* Create a new, unlinked node in the target directory.  */
-  err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
-
-  if (! err && translator != NULL)
-    /* Set the node's translator to make it a device.  */
-    err = __file_set_translator (node,
-				 FS_TRANS_EXCL | FS_TRANS_SET,
-				 FS_TRANS_EXCL | FS_TRANS_SET, 0,
-				 translator, len,
-				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
-
-  if (! err)
-    /* Link the node, now a valid device, into the target directory.  */
-    err = __dir_link (dir, node, name, 1);
-
-  __mach_port_deallocate (__mach_task_self (), dir);
-  __mach_port_deallocate (__mach_task_self (), node);
-
-  if (err)
-    return __hurd_fail (err);
-  return 0;
-}