The sparc64/sparcv9 code is incomplete. Furthermore there is
no real embedded hardware for sparc64 available, so better remove
it until someone comes up with a complete port.

Signed-off-by: Waldemar Brodkorb <[email protected]>
---

Test before patch: http://www.openadk.org/test/REPORT.sparc.uclibc
Test after patch: http://www.openadk.org/test/REPORT.sparc.uclibc.libc
No regression found.
Changes to libc/string/sparc/ are incomplete. What would the best way
to change libc/string/sparc/memchr.S and others?

---
 extra/Configs/Config.sparc                         |   6 -
 libc/string/sparc/sparc64/memchr.S                 | 258 ------
 libc/string/sparc/sparc64/memcpy.S                 | 922 ---------------------
 libc/string/sparc/sparc64/memset.S                 | 316 -------
 libc/string/sparc/sparc64/sparcv9b/memcpy.S        | 611 --------------
 libc/string/sparc/sparc64/stpcpy.S                 | 270 ------
 libc/string/sparc/sparc64/strcat.S                 | 338 --------
 libc/string/sparc/sparc64/strchr.S                 | 485 -----------
 libc/string/sparc/sparc64/strcmp.S                 | 278 -------
 libc/string/sparc/sparc64/strcpy.S                 | 244 ------
 libc/string/sparc/sparc64/strlen.S                 | 172 ----
 libc/sysdeps/linux/sparc/bits/setjmp.h             |  31 -
 libc/sysdeps/linux/sparc/bits/sigcontext.h         |  35 -
 libc/sysdeps/linux/sparc/crt1.S                    |  11 -
 libc/sysdeps/linux/sparc/jmpbuf-unwind.h           |  25 +-
 libc/sysdeps/linux/sparc/qp_ops.c                  |   8 -
 libc/sysdeps/linux/sparc/sparcv9/clone.S           | 101 ---
 libc/sysdeps/linux/sparc/sparcv9/rem.S             |  20 -
 libc/sysdeps/linux/sparc/sparcv9/sdiv.S            |  18 -
 libc/sysdeps/linux/sparc/sparcv9/udiv.S            |  15 -
 libc/sysdeps/linux/sparc/sparcv9/umul.S            |  15 -
 libc/sysdeps/linux/sparc/sparcv9/urem.S            |  17 -
 libc/sysdeps/linux/sparc/sys/procfs.h              |  88 --
 .../linuxthreads.old/sysdeps/sparc/pt-machine.h    |  86 +-
 .../sysdeps/sparc/sparc32/pt-machine.h             |  82 --
 .../sysdeps/sparc/sparc64/pt-machine.h             | 104 ---
 libpthread/linuxthreads/sysdeps/sparc/pspinlock.c  |  95 ++-
 libpthread/linuxthreads/sysdeps/sparc/pt-machine.h |  86 +-
 .../linuxthreads/sysdeps/sparc/sparc32/pspinlock.c |  87 --
 .../sysdeps/sparc/sparc32/pt-machine.h             |  82 --
 .../sysdeps/sparc/sparc32/sparcv9/pspinlock.c      |  93 ---
 .../linuxthreads/sysdeps/sparc/sparc64/pspinlock.c |  92 --
 .../sysdeps/sparc/sparc64/pt-machine.h             | 104 ---
 .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h  | 100 ---
 .../sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S  |  64 --
 .../unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c  |   1 -
 .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h  |  99 ---
 .../sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S  |  63 --
 .../sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h  | 102 ++-
 .../sysdeps/unix/sysv/linux/sparc/vfork.S          |  64 ++
 libpthread/nptl/sysdeps/jmpbuf-unwind.h            |  27 +
 libpthread/nptl/sysdeps/pthread_spin_lock.c        |  39 +
 libpthread/nptl/sysdeps/pthread_spin_trylock.c     |  28 +
 libpthread/nptl/sysdeps/pthreaddef.h               |  39 +
 libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h      |  32 +-
 libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c  |  44 +-
 .../nptl/sysdeps/sparc/pthread_spin_trylock.c      |  33 +-
 libpthread/nptl/sysdeps/sparc/pthreaddef.h         |  44 +-
 .../nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h     |  27 -
 .../nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c |  39 -
 .../sysdeps/sparc/sparc32/pthread_spin_trylock.c   |  28 -
 libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h |  39 -
 .../sparc/sparc32/sparcv9/pthread_spin_lock.c      |  38 -
 .../sparc/sparc32/sparcv9/pthread_spin_trylock.c   |   1 -
 .../sparc/sparc32/sparcv9/pthread_spin_unlock.c    |   1 -
 .../nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h     |  27 -
 .../nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c |  38 -
 .../sysdeps/sparc/sparc64/pthread_spin_trylock.c   |  33 -
 .../sysdeps/sparc/sparc64/pthread_spin_unlock.c    |  29 -
 libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h |  39 -
 .../nptl/sysdeps/unix/sysv/linux/sparc/clone.S     |   7 +-
 .../nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S  |  49 +-
 .../unix/sysv/linux/sparc/pthread_barrier_wait.c   |  94 ++-
 .../nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c  |  52 ++
 .../sysdeps/unix/sysv/linux/sparc/sem_timedwait.c  | 147 ++++
 .../sysdeps/unix/sysv/linux/sparc/sem_trywait.c    |  51 ++
 .../nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c  | 124 +++
 .../sysdeps/unix/sysv/linux/sparc/sparc32/clone.S  |   2 -
 .../unix/sysv/linux/sparc/sparc32/pt-vfork.S       |  44 -
 .../linux/sparc/sparc32/pthread_barrier_wait.c     |  93 ---
 .../unix/sysv/linux/sparc/sparc32/sem_post.c       |  52 --
 .../unix/sysv/linux/sparc/sparc32/sem_timedwait.c  | 147 ----
 .../unix/sysv/linux/sparc/sparc32/sem_trywait.c    |  51 --
 .../unix/sysv/linux/sparc/sparc32/sem_wait.c       | 124 ---
 .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h  | 111 ---
 .../sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S  |  48 --
 .../sysdeps/unix/sysv/linux/sparc/sparc64/clone.S  |   2 -
 .../unix/sysv/linux/sparc/sparc64/pt-vfork.S       |  44 -
 .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h  | 109 ---
 .../unix/sysv/linux/sparc/sparc64/timer_create.c   |   1 -
 .../unix/sysv/linux/sparc/sparc64/timer_delete.c   |   1 -
 .../unix/sysv/linux/sparc/sparc64/timer_getoverr.c |   1 -
 .../unix/sysv/linux/sparc/sparc64/timer_gettime.c  |   1 -
 .../unix/sysv/linux/sparc/sparc64/timer_settime.c  |   1 -
 .../sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S  |  48 --
 .../sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h  | 114 ++-
 .../nptl/sysdeps/unix/sysv/linux/sparc/vfork.S     |  53 +-
 87 files changed, 1350 insertions(+), 6534 deletions(-)
 delete mode 100644 libc/string/sparc/sparc64/memchr.S
 delete mode 100644 libc/string/sparc/sparc64/memcpy.S
 delete mode 100644 libc/string/sparc/sparc64/memset.S
 delete mode 100644 libc/string/sparc/sparc64/sparcv9b/memcpy.S
 delete mode 100644 libc/string/sparc/sparc64/stpcpy.S
 delete mode 100644 libc/string/sparc/sparc64/strcat.S
 delete mode 100644 libc/string/sparc/sparc64/strchr.S
 delete mode 100644 libc/string/sparc/sparc64/strcmp.S
 delete mode 100644 libc/string/sparc/sparc64/strcpy.S
 delete mode 100644 libc/string/sparc/sparc64/strlen.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/clone.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/rem.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/sdiv.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/udiv.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/umul.S
 delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/urem.S
 delete mode 100644 
libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h
 delete mode 100644 
libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h
 delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
 delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
 delete mode 100644 
libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
 delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
 delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
 delete mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
 delete mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
 delete mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
 delete mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
 delete mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
 create mode 100644 
libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
 create mode 100644 libpthread/nptl/sysdeps/jmpbuf-unwind.h
 create mode 100644 libpthread/nptl/sysdeps/pthread_spin_lock.c
 create mode 100644 libpthread/nptl/sysdeps/pthread_spin_trylock.c
 create mode 100644 libpthread/nptl/sysdeps/pthreaddef.h
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h
 delete mode 100644 
libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
 delete mode 100644 
libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c
 delete mode 100644 
libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
 delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h
 create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
 create mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
 create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
 create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
 delete mode 100644 
libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S

diff --git a/extra/Configs/Config.sparc b/extra/Configs/Config.sparc
index c6180c8..47c8ac2 100644
--- a/extra/Configs/Config.sparc
+++ b/extra/Configs/Config.sparc
@@ -26,10 +26,4 @@ config CONFIG_SPARC_V7
 config CONFIG_SPARC_V8
        bool "SPARC v8"
 
-config CONFIG_SPARC_V9
-       bool "SPARC v9"
-
-config CONFIG_SPARC_V9B
-       bool "SPARC v9b"
-
 endchoice
diff --git a/libc/string/sparc/sparc64/memchr.S 
b/libc/string/sparc/sparc64/memchr.S
deleted file mode 100644
index 6467f7f..0000000
diff --git a/libc/string/sparc/sparc64/memcpy.S 
b/libc/string/sparc/sparc64/memcpy.S
deleted file mode 100644
index df3e2d3..0000000
diff --git a/libc/string/sparc/sparc64/memset.S 
b/libc/string/sparc/sparc64/memset.S
deleted file mode 100644
index f76a637..0000000
diff --git a/libc/string/sparc/sparc64/sparcv9b/memcpy.S 
b/libc/string/sparc/sparc64/sparcv9b/memcpy.S
deleted file mode 100644
index 8bbdc84..0000000
diff --git a/libc/string/sparc/sparc64/stpcpy.S 
b/libc/string/sparc/sparc64/stpcpy.S
deleted file mode 100644
index 9af0d56..0000000
diff --git a/libc/string/sparc/sparc64/strcat.S 
b/libc/string/sparc/sparc64/strcat.S
deleted file mode 100644
index 56725cc..0000000
diff --git a/libc/string/sparc/sparc64/strchr.S 
b/libc/string/sparc/sparc64/strchr.S
deleted file mode 100644
index 25810fd..0000000
diff --git a/libc/string/sparc/sparc64/strcmp.S 
b/libc/string/sparc/sparc64/strcmp.S
deleted file mode 100644
index 7b85007..0000000
diff --git a/libc/string/sparc/sparc64/strcpy.S 
b/libc/string/sparc/sparc64/strcpy.S
deleted file mode 100644
index 28799e4..0000000
diff --git a/libc/string/sparc/sparc64/strlen.S 
b/libc/string/sparc/sparc64/strlen.S
deleted file mode 100644
index f58c1c2..0000000
diff --git a/libc/sysdeps/linux/sparc/bits/setjmp.h 
b/libc/sysdeps/linux/sparc/bits/setjmp.h
index 5ec4da5..26f6212 100644
--- a/libc/sysdeps/linux/sparc/bits/setjmp.h
+++ b/libc/sysdeps/linux/sparc/bits/setjmp.h
@@ -25,37 +25,6 @@
 
 #include <bits/wordsize.h>
 
-#if 0 /*__WORDSIZE == 64*/
-
-typedef struct __sparc64_jmp_buf
-  {
-    struct __sparc64_jmp_buf   *uc_link;
-    unsigned long              uc_flags;
-    unsigned long              uc_sigmask;
-    struct __sparc64_jmp_buf_mcontext
-      {
-       unsigned long           mc_gregs[19];
-       unsigned long           mc_fp;
-       unsigned long           mc_i7;
-       struct __sparc64_jmp_buf_fpu
-         {
-           union
-             {
-               unsigned int    sregs[32];
-               unsigned long   dregs[32];
-               long double     qregs[16];
-             }                 mcfpu_fpregs;
-           unsigned long       mcfpu_fprs;
-           unsigned long       mcfpu_gsr;
-           void                *mcfpu_fq;
-           unsigned char       mcfpu_qcnt;
-           unsigned char       mcfpu_qentsz;
-           unsigned char       mcfpu_enab;
-         }                     mc_fpregs;
-      }                                uc_mcontext;
-  } __jmp_buf[1];
-#else
 typedef int __jmp_buf[3];
-#endif
 
 #endif  /* bits/setjmp.h */
diff --git a/libc/sysdeps/linux/sparc/bits/sigcontext.h 
b/libc/sysdeps/linux/sparc/bits/sigcontext.h
index 9435485..251032f 100644
--- a/libc/sysdeps/linux/sparc/bits/sigcontext.h
+++ b/libc/sysdeps/linux/sparc/bits/sigcontext.h
@@ -21,8 +21,6 @@
 
 #include <bits/wordsize.h>
 
-#if __WORDSIZE == 32
-
 /* It is quite hard to choose what to put here, because
    Linux/sparc32 had at least 3 totally incompatible
    signal stack layouts.
@@ -42,36 +40,3 @@ struct sigcontext
     int                        si_mask;
   };
 
-#else /* sparc64 */
-
-typedef struct
-  {
-    unsigned int       si_float_regs [64];
-    unsigned long      si_fsr;
-    unsigned long      si_gsr;
-    unsigned long      si_fprs;
-  } __siginfo_fpu_t;
-
-struct sigcontext
-  {
-    char               sigc_info[128];
-    struct
-      {
-       unsigned long   u_regs[16]; /* globals and ins */
-       unsigned long   tstate;
-       unsigned long   tpc;
-       unsigned long   tnpc;
-       unsigned int    y;
-       unsigned int    fprs;
-      }                        sigc_regs;
-    __siginfo_fpu_t *  sigc_fpu_save;
-    struct
-      {
-       void *          ss_sp;
-       int             ss_flags;
-       unsigned long   ss_size;
-      }                        sigc_stack;
-    unsigned long      sigc_mask;
-};
-
-#endif /* sparc64 */
diff --git a/libc/sysdeps/linux/sparc/crt1.S b/libc/sysdeps/linux/sparc/crt1.S
index 25b5ee5..77e9147 100644
--- a/libc/sysdeps/linux/sparc/crt1.S
+++ b/libc/sysdeps/linux/sparc/crt1.S
@@ -39,16 +39,9 @@
 #include <features.h>
 #include <bits/wordsize.h>
 
-/* macro out the 32 / 64 bit differences */
-#if __WORDSIZE == 32
 # define STACK_BIAS 0
 # define ELE_SIZE 4
 # define LD ld
-#else
-# define STACK_BIAS 2047 /* see 
glibc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h */
-# define ELE_SIZE 8
-# define LD ldx
-#endif
 
 .text
 .align 4
@@ -116,11 +109,7 @@ _start:
        nop
 
        /* Die very horribly if exit returns.  */
-#if __WORDSIZE == 32
        unimp
-#else
-       illtrap 0
-#endif
 
 .size _start,.-_start
 
diff --git a/libc/sysdeps/linux/sparc/jmpbuf-unwind.h 
b/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
index 40303f0..90efb77 100644
--- a/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
+++ b/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
@@ -6,26 +6,19 @@
 #include <setjmp.h>
 #include <jmpbuf-offsets.h>
 
-#if __WORDSIZE == 64
-
-/* Test if longjmp to JMPBUF would unwind the frame
-   containing a local variable at ADDRESS.  */
-#define _JMPBUF_UNWINDS(jmpbuf, address) \
-  ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp)
-
-#else
-
 /* Test if longjmp to JMPBUF would unwind the frame
    containing a local variable at ADDRESS.  */
 #define _JMPBUF_UNWINDS(jmpbuf, address) \
   ((int) (address) < (jmpbuf)[JB_SP])
 
-#endif
-
 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
-#if defined(__arch64__)
-#include "sparc64/jmpbuf-unwind.h"
-#else
-#include "sparc32/jmpbuf-unwind.h"
-#endif
+#include <setjmp.h>
+#include <stdint.h>
+#include <unwind.h>
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
 #endif
diff --git a/libc/sysdeps/linux/sparc/qp_ops.c 
b/libc/sysdeps/linux/sparc/qp_ops.c
index 123be53..97f98da 100644
--- a/libc/sysdeps/linux/sparc/qp_ops.c
+++ b/libc/sysdeps/linux/sparc/qp_ops.c
@@ -1,5 +1,3 @@
-/* XXX add ops from glibc sysdeps/sparc/sparc64/soft-fp */
-
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -9,11 +7,7 @@ static void fakedef(void)
        exit(-1);
 }
 
-#ifdef __sparc_v9__
-# define fakedef(sym) strong_alias(fakedef, _Qp_##sym)
-#else
 # define fakedef(sym) strong_alias(fakedef, _Q_##sym)
-#endif
 
 fakedef(fne)
 fakedef(feq)
@@ -31,7 +25,6 @@ fakedef(qtos)
 fakedef(stoq)
 fakedef(itoq)
 fakedef(add)
-#ifndef __sparc_v9__
 fakedef(qtou)
 fakedef(utoq)
 fakedef(cmp)
@@ -44,4 +37,3 @@ fakedef(qtoll)
 fakedef(qtoull)
 fakedef(sqrt)
 fakedef(ulltoq)
-#endif
diff --git a/libc/sysdeps/linux/sparc/sparcv9/clone.S 
b/libc/sysdeps/linux/sparc/sparcv9/clone.S
deleted file mode 100644
index 2ee62a0..0000000
diff --git a/libc/sysdeps/linux/sparc/sparcv9/rem.S 
b/libc/sysdeps/linux/sparc/sparcv9/rem.S
deleted file mode 100644
index 1474e32..0000000
diff --git a/libc/sysdeps/linux/sparc/sparcv9/sdiv.S 
b/libc/sysdeps/linux/sparc/sparcv9/sdiv.S
deleted file mode 100644
index 45535bb..0000000
diff --git a/libc/sysdeps/linux/sparc/sparcv9/udiv.S 
b/libc/sysdeps/linux/sparc/sparcv9/udiv.S
deleted file mode 100644
index 303f29b..0000000
diff --git a/libc/sysdeps/linux/sparc/sparcv9/umul.S 
b/libc/sysdeps/linux/sparc/sparcv9/umul.S
deleted file mode 100644
index e65e4b9..0000000
diff --git a/libc/sysdeps/linux/sparc/sparcv9/urem.S 
b/libc/sysdeps/linux/sparc/sparcv9/urem.S
deleted file mode 100644
index 9354269..0000000
diff --git a/libc/sysdeps/linux/sparc/sys/procfs.h 
b/libc/sysdeps/linux/sparc/sys/procfs.h
index 37d6a61..edbd5a5 100644
--- a/libc/sysdeps/linux/sparc/sys/procfs.h
+++ b/libc/sysdeps/linux/sparc/sys/procfs.h
@@ -32,20 +32,6 @@
 
 __BEGIN_DECLS
 
-#if __WORDSIZE == 64
-
-#define ELF_NGREG              36
-
-typedef struct
-  {
-    unsigned long      pr_regs[32];
-    unsigned long      pr_fsr;
-    unsigned long      pr_gsr;
-    unsigned long      pr_fprs;
-  } elf_fpregset_t;
-
-#else /* sparc32 */
-
 #define ELF_NGREG              38
 
 typedef struct
@@ -63,8 +49,6 @@ typedef struct
     unsigned int       pr_q[64];
   } elf_fpregset_t;
 
-#endif /* sparc32 */
-
 typedef unsigned long elf_greg_t;
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
@@ -110,13 +94,8 @@ struct elf_prpsinfo
     char pr_zomb;                      /* Zombie.  */
     char pr_nice;                      /* Nice val.  */
     unsigned long int pr_flag;         /* Flags.  */
-#if __WORDSIZE == 64
-    unsigned int pr_uid;
-    unsigned int pr_gid;
-#else
     unsigned short int pr_uid;
     unsigned short int pr_gid;
-#endif
     int pr_pid, pr_ppid, pr_pgrp, pr_sid;
     /* Lots missing */
     char pr_fname[16];                 /* Filename of executable.  */
@@ -138,73 +117,6 @@ typedef __pid_t lwpid_t;
 typedef struct elf_prstatus prstatus_t;
 typedef struct elf_prpsinfo prpsinfo_t;
 
-#if __WORDSIZE == 64
-
-/* Provide 32-bit variants so that BFD can read 32-bit
-   core files.  */
-#define ELF_NGREG32            38
-typedef struct
-  {
-    union
-      {
-       unsigned int    pr_regs[32];
-       double          pr_dregs[16];
-      }                        pr_fr;
-    unsigned int       __unused;
-    unsigned int       pr_fsr;
-    unsigned char      pr_qcnt;
-    unsigned char      pr_q_entrysize;
-    unsigned char      pr_en;
-    unsigned int       pr_q[64];
-  } elf_fpregset_t32;
-
-typedef unsigned int elf_greg_t32;
-typedef elf_greg_t32 elf_gregset_t32[ELF_NGREG32];
-
-struct elf_prstatus32
-  {
-    struct elf_siginfo pr_info;                /* Info associated with signal. 
 */
-    short int pr_cursig;               /* Current signal.  */
-    unsigned int pr_sigpend;   /* Set of pending signals.  */
-    unsigned int pr_sighold;   /* Set of held signals.  */
-    __pid_t pr_pid;
-    __pid_t pr_ppid;
-    __pid_t pr_pgrp;
-    __pid_t pr_sid;
-    struct
-      {
-       int tv_sec, tv_usec;
-      } pr_utime,                      /* User time.  */
-        pr_stime,                      /* System time.  */
-        pr_cutime,                     /* Cumulative user time.  */
-        pr_cstime;                     /* Cumulative system time.  */
-    elf_gregset_t32 pr_reg;            /* GP registers.  */
-    int pr_fpvalid;                    /* True if math copro being used.  */
-  };
-
-struct elf_prpsinfo32
-  {
-    char pr_state;                     /* Numeric process state.  */
-    char pr_sname;                     /* Char for pr_state.  */
-    char pr_zomb;                      /* Zombie.  */
-    char pr_nice;                      /* Nice val.  */
-    unsigned int pr_flag;              /* Flags.  */
-    unsigned short int pr_uid;
-    unsigned short int pr_gid;
-    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
-    /* Lots missing */
-    char pr_fname[16];                 /* Filename of executable.  */
-    char pr_psargs[ELF_PRARGSZ];       /* Initial part of arg list.  */
-  };
-
-typedef elf_gregset_t32 prgregset32_t;
-typedef elf_fpregset_t32 prfpregset32_t;
-
-typedef struct elf_prstatus32 prstatus32_t;
-typedef struct elf_prpsinfo32 prpsinfo32_t;
-
-#endif  /* sparc64 */
-
 __END_DECLS
 
 #endif /* sys/procfs.h */
diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h 
b/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
index ab90810..d502c75 100644
--- a/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
+++ b/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
@@ -1,8 +1,82 @@
-#include <features.h>
-#include <bits/wordsize.h>
+/* Machine-dependent pthreads configuration and inline functions.
+   sparc version.
+   Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson <[email protected]>.
 
-#if __WORDSIZE == 32
-# include "sparc32/pt-machine.h"
-#else
-# include "sparc64/pt-machine.h"
+   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; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H   1
+
+#ifndef PT_EI
+# define PT_EI __extern_always_inline
 #endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Spinlock implementation; required.  */
+PT_EI long int
+testandset (int *spinlock)
+{
+  int ret;
+
+  __asm__ __volatile__("ldstub %1,%0"
+       : "=r"(ret), "=m"(*spinlock)
+       : "m"(*spinlock));
+
+  return ret;
+}
+
+
+/* Memory barrier; default is to do nothing */
+#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
+
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 64))
+register char *stack_pointer __asm__("%sp");
+
+
+/* Registers %g6 and %g7 are reserved by the ABI for "system use".
+   %g7 is specified in the TLS ABI as thread pointer -- we do the same.  */
+struct _pthread_descr_struct;
+register struct _pthread_descr_struct *__thread_self __asm__("%g7");
+
+/* Return the thread descriptor for the current thread.  */
+#define THREAD_SELF  __thread_self
+
+/* Initialize the thread-unique value.  */
+#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr))
+
+/* Access to data in the thread descriptor is easy.  */
+#define THREAD_GETMEM(descr, member) \
+  ((void) sizeof (descr), THREAD_SELF->member)
+#define THREAD_GETMEM_NC(descr, member) \
+  ((void) sizeof (descr), THREAD_SELF->member)
+#define THREAD_SETMEM(descr, member, value) \
+  ((void) sizeof (descr), THREAD_SELF->member = (value))
+#define THREAD_SETMEM_NC(descr, member, value) \
+  ((void) sizeof (descr), THREAD_SELF->member = (value))
+
+/* We want the OS to assign stack addresses.  */
+#define FLOATING_STACKS 1
+
+/* Maximum size of the stack if the rlimit is unlimited.  */
+#define ARCH_STACK_MAX_SIZE     8*1024*1024
+
+#endif /* pt-machine.h */
diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h 
b/libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h
deleted file mode 100644
index d502c75..0000000
diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h 
b/libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h
deleted file mode 100644
index e3c73d9..0000000
diff --git a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c 
b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
index 72a9af5..4de152b 100644
--- a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
+++ b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
@@ -1,14 +1,87 @@
-#include <features.h>
-#include <bits/wordsize.h>
+/* POSIX spinlock implementation.  SPARC32 version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-#if __WORDSIZE == 32
+   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.
 
-# if defined(__CONFIG_SPARC_V9B__)
-#  include "sparc32/sparcv9b/pspinlock.c"
-# else
-#  include "sparc32/pspinlock.c"
-# endif
+   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.
 
-#else
-# include "sparc64/pspinlock.c"
-#endif
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <pthread.h>
+#include "internals.h"
+
+/* This implementation is similar to the one used in the Linux kernel.  */
+int
+__pthread_spin_lock (pthread_spinlock_t *lock)
+{
+  __asm__ __volatile__
+    ("1: ldstub [%0], %%g2\n"
+     "   orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2f\n"
+     "   ldub   [%0], %%g2\n"
+     ".subsection 2\n"
+     "2: orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2b\n"
+     "   ldub   [%0], %%g2\n"
+     "   b,a    1b\n"
+     ".previous"
+     : /* no outputs */
+     : "r" (lock)
+     : "g2", "memory", "cc");
+  return 0;
+}
+weak_alias (__pthread_spin_lock, pthread_spin_lock)
+
+
+int
+__pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+  int result;
+  __asm__ __volatile__
+    ("ldstub [%1], %0"
+     : "=r" (result)
+     : "r" (lock)
+     : "memory");
+  return result == 0 ? 0 : EBUSY;
+}
+weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
+
+
+int
+__pthread_spin_unlock (pthread_spinlock_t *lock)
+{
+  *lock = 0;
+  return 0;
+}
+weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
+
+
+int
+__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
+{
+  /* We can ignore the `pshared' parameter.  Since we are busy-waiting
+     all processes which can access the memory location `lock' points
+     to can use the spinlock.  */
+  *lock = 0;
+  return 0;
+}
+weak_alias (__pthread_spin_init, pthread_spin_init)
+
+
+int
+__pthread_spin_destroy (pthread_spinlock_t *lock)
+{
+  /* Nothing to do.  */
+  return 0;
+}
+weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h 
b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
index ab90810..d502c75 100644
--- a/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
+++ b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
@@ -1,8 +1,82 @@
-#include <features.h>
-#include <bits/wordsize.h>
+/* Machine-dependent pthreads configuration and inline functions.
+   sparc version.
+   Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson <[email protected]>.
 
-#if __WORDSIZE == 32
-# include "sparc32/pt-machine.h"
-#else
-# include "sparc64/pt-machine.h"
+   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; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H   1
+
+#ifndef PT_EI
+# define PT_EI __extern_always_inline
 #endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Spinlock implementation; required.  */
+PT_EI long int
+testandset (int *spinlock)
+{
+  int ret;
+
+  __asm__ __volatile__("ldstub %1,%0"
+       : "=r"(ret), "=m"(*spinlock)
+       : "m"(*spinlock));
+
+  return ret;
+}
+
+
+/* Memory barrier; default is to do nothing */
+#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
+
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 64))
+register char *stack_pointer __asm__("%sp");
+
+
+/* Registers %g6 and %g7 are reserved by the ABI for "system use".
+   %g7 is specified in the TLS ABI as thread pointer -- we do the same.  */
+struct _pthread_descr_struct;
+register struct _pthread_descr_struct *__thread_self __asm__("%g7");
+
+/* Return the thread descriptor for the current thread.  */
+#define THREAD_SELF  __thread_self
+
+/* Initialize the thread-unique value.  */
+#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr))
+
+/* Access to data in the thread descriptor is easy.  */
+#define THREAD_GETMEM(descr, member) \
+  ((void) sizeof (descr), THREAD_SELF->member)
+#define THREAD_GETMEM_NC(descr, member) \
+  ((void) sizeof (descr), THREAD_SELF->member)
+#define THREAD_SETMEM(descr, member, value) \
+  ((void) sizeof (descr), THREAD_SELF->member = (value))
+#define THREAD_SETMEM_NC(descr, member, value) \
+  ((void) sizeof (descr), THREAD_SELF->member = (value))
+
+/* We want the OS to assign stack addresses.  */
+#define FLOATING_STACKS 1
+
+/* Maximum size of the stack if the rlimit is unlimited.  */
+#define ARCH_STACK_MAX_SIZE     8*1024*1024
+
+#endif /* pt-machine.h */
diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c 
b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
deleted file mode 100644
index 4de152b..0000000
diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h 
b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
deleted file mode 100644
index d502c75..0000000
diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c 
b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
deleted file mode 100644
index fb49ca3..0000000
diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c 
b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
deleted file mode 100644
index 743cb77..0000000
diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h 
b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
deleted file mode 100644
index e3c73d9..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
deleted file mode 100644
index bd9bb0d..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
deleted file mode 100644
index ab2286e..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
deleted file mode 100644
index d57283a..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
deleted file mode 100644
index 9972ee4..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
deleted file mode 100644
index 3ff16b1..0000000
diff --git 
a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
index fa656b3..bd9bb0d 100644
--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
+++ b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
@@ -1,10 +1,100 @@
-#ifndef SPARC_SYSDEP_CANCEL_H
-#define SPARC_SYSDEP_CANCEL_H
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2002.
 
-#if defined(__arch64__)
-#include <sparc64/sysdep-cancel.h>
-#else
-#include <sparc32/sysdep-cancel.h>
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <tls.h>
+#ifndef __ASSEMBLER__
+# include <linuxthreads/internals.h>
 #endif
 
+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args)                                    \
+       .text;                                                                \
+ENTRY(name)                                                                  \
+       ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;                              \
+       cmp %g1, 0;                                                           \
+       bne 1f;                                                               \
+        mov SYS_ify(syscall_name), %g1;                                      \
+       ta 0x10;                                                              \
+       bcs __syscall_error_handler;                                          \
+        nop;                                                                 \
+       .subsection 2;                                                        \
+1:     save %sp, -96, %sp;                                                   \
+       CENABLE;                                                              \
+        nop;                                                                 \
+       mov %o0, %l0;                                                         \
+       COPY_ARGS_##args                                                      \
+       mov SYS_ify(syscall_name), %g1;                                       \
+       ta 0x10;                                                              \
+       bcs __syscall_error_handler2;                                         \
+        mov %o0, %l1;                                                        \
+       CDISABLE;                                                             \
+        mov %l0, %o0;                                                        \
+       jmpl %i7 + 8, %g0;                                                    \
+        restore %g0, %l1, %o0;                                               \
+       .previous;                                                            \
+       SYSCALL_ERROR_HANDLER                                                 \
+       SYSCALL_ERROR_HANDLER2
+
+#define SYSCALL_ERROR_HANDLER2                                               \
+SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2)                        \
+       .global __errno_location;                                             \
+        .type   __errno_location,@function;                                  \
+       CDISABLE;                                                             \
+        mov    %l0, %o0;                                                     \
+       call    __errno_location;                                             \
+        nop;                                                                 \
+       st      %l1, [%o0];                                                   \
+       jmpl    %i7 + 8, %g0;                                                 \
+        restore %g0, -1, %o0;                                                \
+       .previous;
+
+# ifdef IS_IN_libpthread
+#  define CENABLE      call __pthread_enable_asynccancel
+#  define CDISABLE     call __pthread_disable_asynccancel
+# elif !defined NOT_IN_libc
+#  define CENABLE      call __libc_enable_asynccancel
+#  define CDISABLE     call __libc_disable_asynccancel
+# else
+#  define CENABLE      call __librt_enable_asynccancel
+#  define CDISABLE     call __librt_disable_asynccancel
+# endif
+
+#define COPY_ARGS_0    /* Nothing */
+#define COPY_ARGS_1    COPY_ARGS_0 mov %i0, %o0;
+#define COPY_ARGS_2    COPY_ARGS_1 mov %i1, %o1;
+#define COPY_ARGS_3    COPY_ARGS_2 mov %i2, %o2;
+#define COPY_ARGS_4    COPY_ARGS_3 mov %i3, %o3;
+#define COPY_ARGS_5    COPY_ARGS_4 mov %i4, %o4;
+#define COPY_ARGS_6    COPY_ARGS_5 mov %i5, %o5;
+
+# ifndef __ASSEMBLER__
+#  define SINGLE_THREAD_P \
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF,                                
      \
+                                  p_header.data.multiple_threads) == 0, 1)
+# else
+#  define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
+# endif
+
+#elif !defined __ASSEMBLER__
+
+/* This code should never be used but we define it anyhow.  */
+# define SINGLE_THREAD_P (1)
+
 #endif
diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S 
b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
new file mode 100644
index 0000000..ab2286e
--- /dev/null
+++ b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
@@ -0,0 +1,64 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep-cancel.h>
+
+       .text
+#ifdef SHARED
+.LLGETPC0:
+       retl
+        add    %o7, %o0, %o0
+#endif
+ENTRY(__vfork)
+#ifdef SHARED
+       mov     %o7, %o1
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
+       call    .LLGETPC0
+        add    %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
+       sethi   %hi(__libc_pthread_functions), %o2
+       mov     %o1, %o7
+       or      %o2, %lo(__libc_pthread_functions), %o2
+       ld      [%o0 + %o2], %o2
+       ld      [%o2], %o2
+       cmp     %o2, 0
+#else
+       .weak   pthread_create
+       sethi   %hi(pthread_create), %o0
+       orcc    %o0, %lo(pthread_create), %o0
+#endif
+#if defined SHARED && !defined BROKEN_SPARC_WDISP22
+       bne     HIDDEN_JUMPTARGET(fork)
+#else
+       bne     1f
+#endif
+        mov    __NR_vfork, %g1
+       ta      0x10
+       bcs     __syscall_error_handler
+        nop
+       sub     %o1, 1, %o1
+       retl
+        and    %o0, %o1, %o0
+#if !defined SHARED || defined BROKEN_SPARC_WDISP22
+1:     mov     %o7, %g1
+       call    HIDDEN_JUMPTARGET(fork)
+        mov    %g1, %o7
+#endif
+       SYSCALL_ERROR_HANDLER
+PSEUDO_END (__vfork)
+libc_hidden_def (__vfork)
+weak_alias (__vfork, vfork)
diff --git a/libpthread/nptl/sysdeps/jmpbuf-unwind.h 
b/libpthread/nptl/sysdeps/jmpbuf-unwind.h
new file mode 100644
index 0000000..2f64e7d
--- /dev/null
+++ b/libpthread/nptl/sysdeps/jmpbuf-unwind.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <setjmp.h>
+#include <stdint.h>
+#include <unwind.h>
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
diff --git a/libpthread/nptl/sysdeps/pthread_spin_lock.c 
b/libpthread/nptl/sysdeps/pthread_spin_lock.c
new file mode 100644
index 0000000..2dfcd3c
--- /dev/null
+++ b/libpthread/nptl/sysdeps/pthread_spin_lock.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "pthreadP.h"
+
+int
+pthread_spin_lock (pthread_spinlock_t *lock)
+{
+  __asm__ __volatile__
+    ("1: ldstub [%0], %%g2\n"
+     "   orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2f\n"
+     "   ldub   [%0], %%g2\n"
+     ".subsection 2\n"
+     "2: orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2b\n"
+     "   ldub   [%0], %%g2\n"
+     "   b,a    1b\n"
+     ".previous"
+     : /* no outputs */
+     : "r" (lock)
+     : "g2", "memory", "cc");
+  return 0;
+}
diff --git a/libpthread/nptl/sysdeps/pthread_spin_trylock.c 
b/libpthread/nptl/sysdeps/pthread_spin_trylock.c
new file mode 100644
index 0000000..c1b7b23
--- /dev/null
+++ b/libpthread/nptl/sysdeps/pthread_spin_trylock.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include "pthreadP.h"
+
+int
+pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+  int res;
+  __asm__ __volatile__ ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : 
"memory");
+  return res == 0 ? 0 : EBUSY;
+}
diff --git a/libpthread/nptl/sysdeps/pthreaddef.h 
b/libpthread/nptl/sysdeps/pthreaddef.h
new file mode 100644
index 0000000..435fedc
--- /dev/null
+++ b/libpthread/nptl/sysdeps/pthreaddef.h
@@ -0,0 +1,39 @@
+/* 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE        (2 * 1024 * 1024)
+
+/* Required stack pointer alignment at beginning.  */
+#define STACK_ALIGN            16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK     2048
+
+/* Alignment requirement for TCB.  */
+#define TCB_ALIGNMENT          16
+
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 64))
+register char *stack_pointer __asm__("%sp");
+
+/* XXX Until we have a better place keep the definitions here.  */
+
+/* While there is no such syscall.  */
+#define __exit_thread_inline(val) \
+  INLINE_SYSCALL (exit, 1, (val))
diff --git a/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h 
b/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
index 6cbb37b..2f64e7d 100644
--- a/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
+++ b/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
@@ -1,5 +1,27 @@
-#if defined(__arch64__)
-#include "sparc64/jmpbuf-unwind.h"
-#else
-#include "sparc32/jmpbuf-unwind.h"
-#endif
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <setjmp.h>
+#include <stdint.h>
+#include <unwind.h>
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
diff --git a/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c 
b/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
index dcc5ae2..2dfcd3c 100644
--- a/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
+++ b/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
@@ -1,5 +1,39 @@
-#if defined(__arch64__)
-#include "sparc64/pthread_spin_lock.c"
-#else
-#include "sparc32/pthread_spin_lock.c"
-#endif
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "pthreadP.h"
+
+int
+pthread_spin_lock (pthread_spinlock_t *lock)
+{
+  __asm__ __volatile__
+    ("1: ldstub [%0], %%g2\n"
+     "   orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2f\n"
+     "   ldub   [%0], %%g2\n"
+     ".subsection 2\n"
+     "2: orcc   %%g2, 0x0, %%g0\n"
+     "   bne,a  2b\n"
+     "   ldub   [%0], %%g2\n"
+     "   b,a    1b\n"
+     ".previous"
+     : /* no outputs */
+     : "r" (lock)
+     : "g2", "memory", "cc");
+  return 0;
+}
diff --git a/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c 
b/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
index af63eec..c1b7b23 100644
--- a/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
+++ b/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
@@ -1,5 +1,28 @@
-#if defined(__arch64__)
-#include "sparc64/pthread_spin_trylock.c"
-#else
-#include "sparc32/pthread_spin_trylock.c"
-#endif
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include "pthreadP.h"
+
+int
+pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+  int res;
+  __asm__ __volatile__ ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : 
"memory");
+  return res == 0 ? 0 : EBUSY;
+}
diff --git a/libpthread/nptl/sysdeps/sparc/pthreaddef.h 
b/libpthread/nptl/sysdeps/sparc/pthreaddef.h
index d4695c4..435fedc 100644
--- a/libpthread/nptl/sysdeps/sparc/pthreaddef.h
+++ b/libpthread/nptl/sysdeps/sparc/pthreaddef.h
@@ -1,5 +1,39 @@
-#if defined(__arch64__)
-#include "sparc64/pthreaddef.h"
-#else
-#include "sparc32/pthreaddef.h"
-#endif
+/* 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE        (2 * 1024 * 1024)
+
+/* Required stack pointer alignment at beginning.  */
+#define STACK_ALIGN            16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK     2048
+
+/* Alignment requirement for TCB.  */
+#define TCB_ALIGNMENT          16
+
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 64))
+register char *stack_pointer __asm__("%sp");
+
+/* XXX Until we have a better place keep the definitions here.  */
+
+/* While there is no such syscall.  */
+#define __exit_thread_inline(val) \
+  INLINE_SYSCALL (exit, 1, (val))
diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h 
b/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h
deleted file mode 100644
index 2f64e7d..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c 
b/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
deleted file mode 100644
index 2dfcd3c..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c 
b/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
deleted file mode 100644
index c1b7b23..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h 
b/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h
deleted file mode 100644
index 435fedc..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c 
b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
deleted file mode 100644
index 3d314be..0000000
diff --git 
a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c 
b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c
deleted file mode 100644
index 3b20a21..0000000
diff --git 
a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c 
b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
deleted file mode 100644
index 482cbe3..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h 
b/libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
deleted file mode 100644
index 2f64e7d..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c 
b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
deleted file mode 100644
index 0235056..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c 
b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
deleted file mode 100644
index b14621b..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c 
b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
deleted file mode 100644
index a00fad3..0000000
diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h 
b/libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h
deleted file mode 100644
index 845f4bf..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
index dfc5e82..a6142aa 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
@@ -1,5 +1,2 @@
-#if defined(__arch64__)
-#include "./sparc64/clone.S"
-#else
-#include "./sparc32/clone.S"
-#endif
+#define RESET_PID
+#include <libc/sysdeps/linux/sparc/clone.S>
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
index e8705c5..37231a8 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
@@ -1,5 +1,44 @@
-#if defined(__arch64__)
-#include "sparc64/pt-vfork.S"
-#else
-#include "sparc32/pt-vfork.S"
-#endif
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2004.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <tcb-offsets.h>
+
+       .text
+       .globl          __syscall_error
+ENTRY(__vfork)
+       ld      [%g7 + PID], %o5
+       sub     %g0, %o5, %o4
+       st      %o4, [%g7 + PID]
+
+       LOADSYSCALL(vfork)
+       ta      0x10
+       bcc     2f
+        mov    %o7, %g1
+       st      %o5, [%g7 + PID]
+       call    __syscall_error
+        mov    %g1, %o7
+2:     sub     %o1, 1, %o1
+       andcc   %o0, %o1, %o0
+       bne,a   1f
+        st     %o5, [%g7 + PID]
+1:     retl
+        nop
+END(__vfork)
+
+weak_alias (__vfork, vfork)
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
index 73eaa69..169f6e7 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
@@ -1 +1,93 @@
-#include "sparc32/pthread_barrier_wait.c"
+/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Martin Schwidefsky <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <lowlevellock.h>
+#include <pthreadP.h>
+
+/* Wait on barrier.  */
+int
+pthread_barrier_wait (
+     pthread_barrier_t *barrier)
+{
+  union sparc_pthread_barrier *ibarrier
+    = (union sparc_pthread_barrier *) barrier;
+  int result = 0;
+  int private = ibarrier->s.pshared ? LLL_SHARED : LLL_PRIVATE;
+
+  /* Make sure we are alone.  */
+  lll_lock (ibarrier->b.lock, private);
+
+  /* One more arrival.  */
+  --ibarrier->b.left;
+
+  /* Are these all?  */
+  if (ibarrier->b.left == 0)
+    {
+      /* Yes. Increment the event counter to avoid invalid wake-ups and
+        tell the current waiters that it is their turn.  */
+      ++ibarrier->b.curr_event;
+
+      /* Wake up everybody.  */
+      lll_futex_wake (&ibarrier->b.curr_event, INT_MAX, private);
+
+      /* This is the thread which finished the serialization.  */
+      result = PTHREAD_BARRIER_SERIAL_THREAD;
+    }
+  else
+    {
+      /* The number of the event we are waiting for.  The barrier's event
+        number must be bumped before we continue.  */
+      unsigned int event = ibarrier->b.curr_event;
+
+      /* Before suspending, make the barrier available to others.  */
+      lll_unlock (ibarrier->b.lock, private);
+
+      /* Wait for the event counter of the barrier to change.  */
+      do
+       lll_futex_wait (&ibarrier->b.curr_event, event, private);
+      while (event == ibarrier->b.curr_event);
+    }
+
+  /* Make sure the init_count is stored locally or in a register.  */
+  unsigned int init_count = ibarrier->b.init_count;
+
+  /* If this was the last woken thread, unlock.  */
+  if (__atomic_is_v9 || ibarrier->s.pshared == 0)
+    {
+      if (atomic_increment_val (&ibarrier->b.left) == init_count)
+       /* We are done.  */
+       lll_unlock (ibarrier->b.lock, private);
+    }
+  else
+    {
+      unsigned int left;
+      /* Slightly more complicated.  On pre-v9 CPUs, atomic_increment_val
+        is only atomic for threads within the same process, not for
+        multiple processes.  */
+      __sparc32_atomic_do_lock24 (&ibarrier->s.left_lock);
+      left = ++ibarrier->b.left;
+      __sparc32_atomic_do_unlock24 (&ibarrier->s.left_lock);
+      if (left == init_count)
+        /* We are done.  */
+       lll_unlock (ibarrier->b.lock, private);
+    }
+
+  return result;
+}
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
new file mode 100644
index 0000000..8da4193
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
@@ -0,0 +1,52 @@
+/* sem_post -- post to a POSIX semaphore.  SPARC version.
+   Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <lowlevellock.h>
+#include <internaltypes.h>
+#include <semaphore.h>
+
+int
+sem_post (sem_t *sem)
+{
+  struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
+  int nr;
+
+  if (__atomic_is_v9)
+    nr = atomic_increment_val (&isem->value);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      nr = ++(isem->value);
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+  atomic_full_barrier ();
+  if (isem->nwaiters > 0)
+    {
+      int err = lll_futex_wake (&isem->value, 1,
+                               isem->private ^ FUTEX_PRIVATE_FLAG);
+      if (__builtin_expect (err, 0) < 0)
+       {
+         __set_errno (-err);
+         return -1;
+       }
+    }
+  return 0;
+}
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
new file mode 100644
index 0000000..64c9abf
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
@@ -0,0 +1,147 @@
+/* sem_timedwait -- wait on a semaphore.  SPARC version.
+   Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Paul Mackerras <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <lowlevellock.h>
+#include <internaltypes.h>
+#include <semaphore.h>
+
+#include <pthreadP.h>
+
+
+extern void __sem_wait_cleanup (void *arg) attribute_hidden;
+
+
+int
+sem_timedwait (sem_t *sem, const struct timespec *abstime)
+{
+  struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
+  int err;
+  int val;
+
+  if (__atomic_is_v9)
+    val = atomic_decrement_if_positive (&isem->value);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      val = isem->value;
+      if (val > 0)
+        isem->value = val - 1;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+
+  if (val > 0)
+    return 0;
+
+  if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  if (__atomic_is_v9)
+    atomic_increment (&isem->nwaiters);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      isem->nwaiters++;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+
+  pthread_cleanup_push (__sem_wait_cleanup, isem);
+
+  while (1)
+    {
+      struct timeval tv;
+      struct timespec rt;
+      int sec, nsec;
+
+      /* Get the current time.  */
+      __gettimeofday (&tv, NULL);
+
+      /* Compute relative timeout.  */
+      sec = abstime->tv_sec - tv.tv_sec;
+      nsec = abstime->tv_nsec - tv.tv_usec * 1000;
+      if (nsec < 0)
+       {
+         nsec += 1000000000;
+         --sec;
+       }
+
+      /* Already timed out?  */
+      err = -ETIMEDOUT;
+      if (sec < 0)
+       {
+         __set_errno (ETIMEDOUT);
+         err = -1;
+         break;
+       }
+
+      /* Do wait.  */
+      rt.tv_sec = sec;
+      rt.tv_nsec = nsec;
+
+      /* Enable asynchronous cancellation.  Required by the standard.  */
+      int oldtype = __pthread_enable_asynccancel ();
+
+      err = lll_futex_timed_wait (&isem->value, 0, &rt,
+                                 isem->private ^ FUTEX_PRIVATE_FLAG);
+
+      /* Disable asynchronous cancellation.  */
+      __pthread_disable_asynccancel (oldtype);
+
+      if (err != 0 && err != -EWOULDBLOCK)
+       {
+         __set_errno (-err);
+         err = -1;
+         break;
+       }
+
+      if (__atomic_is_v9)
+       val = atomic_decrement_if_positive (&isem->value);
+      else
+       {
+         __sparc32_atomic_do_lock24 (&isem->lock);
+         val = isem->value;
+         if (val > 0)
+           isem->value = val - 1;
+         __sparc32_atomic_do_unlock24 (&isem->lock);
+       }
+
+      if (val > 0)
+       {
+         err = 0;
+         break;
+       }
+    }
+
+  pthread_cleanup_pop (0);
+
+  if (__atomic_is_v9)
+    atomic_decrement (&isem->nwaiters);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      isem->nwaiters--;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+
+  return err;
+}
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
new file mode 100644
index 0000000..36e859b
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
@@ -0,0 +1,51 @@
+/* sem_trywait -- wait on a semaphore.  SPARC version.
+   Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Paul Mackerras <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <lowlevellock.h>
+#include <internaltypes.h>
+#include <semaphore.h>
+
+
+int
+sem_trywait (sem_t *sem)
+{
+  struct sparc_old_sem *isem = (struct sparc_old_sem *) sem;
+  int val;
+
+  if (isem->value > 0)
+    {
+      if (__atomic_is_v9)
+       val = atomic_decrement_if_positive (&isem->value);
+      else
+       {
+         __sparc32_atomic_do_lock24 (&isem->lock);
+         val = isem->value;
+         if (val > 0)
+           isem->value = val - 1;
+         __sparc32_atomic_do_unlock24 (&isem->lock);
+       }
+      if (val > 0)
+       return 0;
+    }
+
+  __set_errno (EAGAIN);
+  return -1;
+}
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
new file mode 100644
index 0000000..5d887ab
--- /dev/null
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
@@ -0,0 +1,124 @@
+/* sem_wait -- wait on a semaphore.  Generic futex-using version.
+   Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Paul Mackerras <[email protected]>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <sysdep.h>
+#include <lowlevellock.h>
+#include <internaltypes.h>
+#include <semaphore.h>
+
+#include <pthreadP.h>
+
+
+void
+attribute_hidden
+__sem_wait_cleanup (void *arg)
+{
+  struct sparc_new_sem *isem = (struct sparc_new_sem *) arg;
+
+  if (__atomic_is_v9)
+    atomic_decrement (&isem->nwaiters);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      isem->nwaiters--;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+}
+
+
+int
+sem_wait (sem_t *sem)
+{
+  struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
+  int err;
+  int val;
+
+  if (__atomic_is_v9)
+    val = atomic_decrement_if_positive (&isem->value);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      val = isem->value;
+      if (val > 0)
+       isem->value = val - 1;
+      else
+       isem->nwaiters++;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+
+  if (val > 0)
+    return 0;
+
+  if (__atomic_is_v9)
+    atomic_increment (&isem->nwaiters);
+  else
+    /* Already done above while still holding isem->lock.  */;
+
+  pthread_cleanup_push (__sem_wait_cleanup, isem);
+
+  while (1)
+    {
+      /* Enable asynchronous cancellation.  Required by the standard.  */
+      int oldtype = __pthread_enable_asynccancel ();
+
+      err = lll_futex_wait (&isem->value, 0,
+                           isem->private ^ FUTEX_PRIVATE_FLAG);
+
+      /* Disable asynchronous cancellation.  */
+      __pthread_disable_asynccancel (oldtype);
+
+      if (err != 0 && err != -EWOULDBLOCK)
+       {
+         __set_errno (-err);
+         err = -1;
+         break;
+       }
+
+      if (__atomic_is_v9)
+       val = atomic_decrement_if_positive (&isem->value);
+      else
+       {
+         __sparc32_atomic_do_lock24 (&isem->lock);
+         val = isem->value;
+         if (val > 0)
+           isem->value = val - 1;
+         __sparc32_atomic_do_unlock24 (&isem->lock);
+       }
+
+      if (val > 0)
+       {
+         err = 0;
+         break;
+       }
+    }
+
+  pthread_cleanup_pop (0);
+
+  if (__atomic_is_v9)
+    atomic_decrement (&isem->nwaiters);
+  else
+    {
+      __sparc32_atomic_do_lock24 (&isem->lock);
+      isem->nwaiters--;
+      __sparc32_atomic_do_unlock24 (&isem->lock);
+    }
+
+  return err;
+}
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
deleted file mode 100644
index a6142aa..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S
deleted file mode 100644
index 37231a8..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
deleted file mode 100644
index 169f6e7..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
deleted file mode 100644
index 8da4193..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
deleted file mode 100644
index 64c9abf..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
deleted file mode 100644
index 36e859b..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
deleted file mode 100644
index 5d887ab..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
deleted file mode 100644
index b61ca7b..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
deleted file mode 100644
index 71f0662..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
deleted file mode 100644
index 64e3bfc..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S
deleted file mode 100644
index a058d89..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
deleted file mode 100644
index 0e9d263..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
deleted file mode 100644
index 0a9c337..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
deleted file mode 100644
index f0d4fd2..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
deleted file mode 100644
index 82121a7..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
deleted file mode 100644
index 313c05f..0000000
diff --git 
a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
deleted file mode 100644
index 76f549c..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
deleted file mode 100644
index bea4f2f..0000000
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
index 5be9beb..b61ca7b 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
@@ -1,5 +1,111 @@
-#if defined(__arch64__)
-#include "sparc64/sysdep-cancel.h"
-#else
-#include "sparc32/sysdep-cancel.h"
+/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2002.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <tls.h>
+#include <sysdep.h>
+#ifndef __ASSEMBLER__
+# include <pthreadP.h>
+#endif
+
+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args)      \
+       .text;                                  \
+       .globl          __syscall_error;        \
+ENTRY(name)                                    \
+       ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
+       cmp %g1, 0;                             \
+       bne 1f;                                 \
+.type  __##syscall_name##_nocancel,@function;  \
+.globl __##syscall_name##_nocancel;            \
+__##syscall_name##_nocancel:                   \
+        mov SYS_ify(syscall_name), %g1;        \
+       ta 0x10;                                \
+       bcc 8f;                                 \
+        mov %o7, %g1;                          \
+       call __syscall_error;                   \
+        mov %g1, %o7;                          \
+8:     jmpl %o7 + 8, %g0;                      \
+        nop;                                   \
+.size  __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
+1:     save %sp, -96, %sp;                     \
+       cfi_def_cfa_register(%fp);              \
+       cfi_window_save;                        \
+       cfi_register(%o7, %i7);                 \
+       CENABLE;                                \
+        nop;                                   \
+       mov %o0, %l0;                           \
+       COPY_ARGS_##args                        \
+       mov SYS_ify(syscall_name), %g1;         \
+       ta 0x10;                                \
+       bcc 1f;                                 \
+        mov %o0, %l1;                          \
+       CDISABLE;                               \
+        mov %l0, %o0;                          \
+       call __syscall_error;                   \
+        mov %l1, %o0;                          \
+       b 2f;                                   \
+        mov -1, %l1;                           \
+1:     CDISABLE;                               \
+        mov %l0, %o0;                          \
+2:     jmpl %i7 + 8, %g0;                      \
+        restore %g0, %l1, %o0;
+
+
+# ifdef IS_IN_libpthread
+#  define CENABLE      call __pthread_enable_asynccancel
+#  define CDISABLE     call __pthread_disable_asynccancel
+# elif !defined NOT_IN_libc
+#  define CENABLE      call __libc_enable_asynccancel
+#  define CDISABLE     call __libc_disable_asynccancel
+# elif defined IS_IN_librt
+#  define CENABLE      call __librt_enable_asynccancel
+#  define CDISABLE     call __librt_disable_asynccancel
+# else
+#  error Unsupported library
+# endif
+
+#define COPY_ARGS_0    /* Nothing */
+#define COPY_ARGS_1    COPY_ARGS_0 mov %i0, %o0;
+#define COPY_ARGS_2    COPY_ARGS_1 mov %i1, %o1;
+#define COPY_ARGS_3    COPY_ARGS_2 mov %i2, %o2;
+#define COPY_ARGS_4    COPY_ARGS_3 mov %i3, %o3;
+#define COPY_ARGS_5    COPY_ARGS_4 mov %i4, %o4;
+#define COPY_ARGS_6    COPY_ARGS_5 mov %i5, %o5;
+
+# ifndef __ASSEMBLER__
+#  define SINGLE_THREAD_P \
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF,                                
      \
+                                  header.multiple_threads) == 0, 1)
+# else
+#  define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
+# endif
+
+#elif !defined __ASSEMBLER__
+
+# define SINGLE_THREAD_P (1)
+# define NO_CANCELLATION 1
+
+#endif
+
+#ifndef __ASSEMBLER__
+# define RTLD_SINGLE_THREAD_P \
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+                                  header.multiple_threads) == 0, 1)
 #endif
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S 
b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
index 160cd0b..71f0662 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
@@ -1,5 +1,48 @@
-#if defined(__arch64__)
-#include "sparc64/vfork.S"
-#else
-#include "sparc32/vfork.S"
-#endif
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <[email protected]>, 2004.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#include <tcb-offsets.h>
+
+       .text
+       .globl          __syscall_error
+ENTRY(__vfork)
+       ld      [%g7 + PID], %o5
+       cmp     %o5, 0
+       bne     1f
+        sub    %g0, %o5, %o4
+       sethi   %hi(0x80000000), %o4
+1:     st      %o4, [%g7 + PID]
+
+       LOADSYSCALL(vfork)
+       ta      0x10
+       bcc     2f
+        mov    %o7, %g1
+       st      %o5, [%g7 + PID]
+       call    __syscall_error
+        mov    %g1, %o7
+2:     sub     %o1, 1, %o1
+       andcc   %o0, %o1, %o0
+       bne,a   1f
+        st     %o5, [%g7 + PID]
+1:     retl
+        nop
+END(__vfork)
+
+libc_hidden_def (vfork)
+weak_alias (__vfork, vfork)
-- 
1.8.5.2 (Apple Git-48)

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to