[PATCH 1/3] nptl: sysdep headers re-factoring

Khem Raj raj.khem at gmail.com
Tue Feb 9 17:13:48 UTC 2010


On Mon, Feb 8, 2010 at 11:15 PM, Carmelo AMOROSO <carmelo.amoroso at st.com> wrote:
> This patch will re-factor and simplify sysdep headers
> handling for nptl branch.
> The reason is to use some useful macros in asm code (i.e. ENTRY()) that are available
> only into nptl branch because are defined in sysdep.h header under the nptl folder
> even if they are not related to NPTL at all (this was likely due to a bad choice done
> at the early stage of NPTL porting).
> This is a required steps for integrating into master branch some asm code available in
> nptl branch for sh4.
>
> The main changes are described below:
>
> nptl/sysdeps/generic/sysdep.h (moved) ---> libc/sysdeps/linux/common/sysdep.h
> nptl/sysdeps/arm/sysdep.h     (moved) ---> libc/sysdeps/linux/arm/sysdep.h
>
> nptl/sysdeps/sh/sysdep.h ---------------------|
> nptl/sysdeps/unix/sh/sysdep.h ----------------|
> nptl/sysdeps/unix/sysv/linux/sh/sysdep.h -----|
> nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h -|
>                                              |(merged) ---> libc/sysdeps/linux/sh
>
> nptl/sysdeps/unix/sysdep.h (deleted)
>
> Similarly the mips and arm sysdep.h should be merged and updated as for sh arch.
>
> Signed-off-by: Carmelo Amoroso <carmelo.amoroso at st.com>

Acked-by: Khem Raj <raj.khem at gmail.com>

Austin wanted to pull more fixes to nptl from glibc. I dont know how far he is.
but your changes will conflict with his changes.

> ---
>  Rules.mak                                          |    2 +-
>  libc/sysdeps/linux/arm/sysdep.h                    |   91 +++++++
>  libc/sysdeps/linux/common/sysdep.h                 |  139 ++++++++++
>  libc/sysdeps/linux/sh/sysdep.h                     |  277 ++++++++++++++++++++
>  libpthread/nptl/sysdeps/arm/sysdep.h               |   91 -------
>  libpthread/nptl/sysdeps/generic/sysdep.h           |  137 ----------
>  libpthread/nptl/sysdeps/sh/sysdep.h                |   82 ------
>  libpthread/nptl/sysdeps/unix/sh/sysdep.h           |   29 --
>  libpthread/nptl/sysdeps/unix/sysdep.h              |   63 -----
>  .../nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h   |    4 -
>  .../nptl/sysdeps/unix/sysv/linux/sh/sysdep.h       |  224 ----------------
>  11 files changed, 508 insertions(+), 631 deletions(-)
>  create mode 100644 libc/sysdeps/linux/arm/sysdep.h
>  create mode 100644 libc/sysdeps/linux/common/sysdep.h
>  create mode 100644 libc/sysdeps/linux/sh/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/arm/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/generic/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/sh/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/unix/sh/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/unix/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h
>  delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sh/sysdep.h
>
> diff --git a/Rules.mak b/Rules.mak
> index afecb77..aaa8cb0 100644
> --- a/Rules.mak
> +++ b/Rules.mak
> @@ -548,6 +548,7 @@ NOSTDLIB_CFLAGS:=$(call check_gcc,-nostdlib,)
>  CFLAGS := -include $(top_srcdir)include/libc-symbols.h \
>        $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \
>        -nostdinc -I$(top_builddir)include -I$(top_srcdir)include -I. \
> +       -I$(top_srcdir)libc/sysdeps/linux \
>        -I$(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)
>  ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"")
>  CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS))
> @@ -637,7 +638,6 @@ PTINC:=     -I$(top_srcdir)$(PTDIR)                                         \
>        -I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux                 \
>        -I$(top_srcdir)$(PTDIR)/sysdeps/pthread                         \
>        -I$(top_srcdir)$(PTDIR)/sysdeps/pthread/bits                            \
> -       -I$(top_srcdir)$(PTDIR)/sysdeps/generic                         \
>        -I$(top_srcdir)ldso/ldso/$(TARGET_ARCH)                 \
>        -I$(top_srcdir)ldso/include
>  #
> diff --git a/libc/sysdeps/linux/arm/sysdep.h b/libc/sysdeps/linux/arm/sysdep.h
> new file mode 100644
> index 0000000..3c7a182
> --- /dev/null
> +++ b/libc/sysdeps/linux/arm/sysdep.h
> @@ -0,0 +1,91 @@
> +/* Assembler macros for ARM.
> +   Copyright (C) 1997, 1998, 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, write to the Free
> +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> +   02111-1307 USA.  */
> +
> +#include <common/sysdep.h>
> +
> +#ifdef __ASSEMBLER__
> +
> +/* Syntactic details of assembler.  */
> +
> +#define ALIGNARG(log2) log2
> +/* For ELF we need the `.type' directive to make shared libs work right.  */
> +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,%##typearg;
> +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
> +
> +/* In ELF C symbols are asm symbols.  */
> +#undef NO_UNDERSCORES
> +#define NO_UNDERSCORES
> +
> +#define PLTJMP(_x)     _x##(PLT)
> +
> +/* APCS-32 doesn't preserve the condition codes across function call. */
> +#ifdef __APCS_32__
> +#define LOADREGS(cond, base, reglist...)\
> +       ldm##cond       base,reglist
> +#ifdef __USE_BX__
> +#define RETINSTR(cond, reg)    \
> +       bx##cond        reg
> +#define DO_RET(_reg)           \
> +       bx _reg
> +#else
> +#define RETINSTR(cond, reg)    \
> +       mov##cond       pc, reg
> +#define DO_RET(_reg)           \
> +       mov pc, _reg
> +#endif
> +#else  /* APCS-26 */
> +#define LOADREGS(cond, base, reglist...)\
> +       ldm##cond       base,reglist^
> +#define RETINSTR(cond, reg)    \
> +       mov##cond##s    pc, reg
> +#define DO_RET(_reg)           \
> +       movs pc, _reg
> +#endif
> +
> +/* Define an entry point visible from C.  */
> +#define        ENTRY(name)                                                           \
> +  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
> +  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function)                          \
> +  .align ALIGNARG(4);                                                        \
> +  name##:                                                                     \
> +  CALL_MCOUNT
> +
> +#undef END
> +#define END(name)                                                            \
> +  ASM_SIZE_DIRECTIVE(name)
> +
> +/* If compiled for profiling, call `mcount' at the start of each function.  */
> +#ifdef PROF
> +#define CALL_MCOUNT                    \
> +       str     lr,[sp, #-4]!   ;       \
> +       bl      PLTJMP(mcount)  ;       \
> +       ldr     lr, [sp], #4    ;
> +#else
> +#define CALL_MCOUNT            /* Do nothing.  */
> +#endif
> +
> +#ifdef NO_UNDERSCORES
> +/* Since C identifiers are not normally prefixed with an underscore
> +   on this system, the asm identifier `syscall_error' intrudes on the
> +   C name space.  Make sure we use an innocuous name.  */
> +#define        syscall_error   __syscall_error
> +#define mcount         _mcount
> +#endif
> +
> +#endif /* __ASSEMBLER__ */
> diff --git a/libc/sysdeps/linux/common/sysdep.h b/libc/sysdeps/linux/common/sysdep.h
> new file mode 100644
> index 0000000..cd5b2f1
> --- /dev/null
> +++ b/libc/sysdeps/linux/common/sysdep.h
> @@ -0,0 +1,139 @@
> +/* Generic asm macros used on many machines.
> +   Copyright (C) 1991,92,93,96,98,2002,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, write to the Free
> +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> +   02111-1307 USA.  */
> +
> +#include <sys/syscall.h>
> +
> +#ifndef C_LABEL
> +
> +/* Define a macro we can use to construct the asm name for a C symbol.  */
> +#ifndef        __UCLIBC_UNDERSCORES__
> +#ifdef __STDC__
> +#define C_LABEL(name)          name##:
> +#else
> +#define C_LABEL(name)          name/**/:
> +#endif
> +#else
> +#ifdef __STDC__
> +#define C_LABEL(name)          _##name##:
> +#else
> +#define C_LABEL(name)          _/**/name/**/:
> +#endif
> +#endif
> +
> +#endif
> +
> +#ifdef __ASSEMBLER__
> +/* Mark the end of function named SYM.  This is used on some platforms
> +   to generate correct debugging information.  */
> +#ifndef END
> +#define END(sym)
> +#endif
> +
> +#ifndef JUMPTARGET
> +#define JUMPTARGET(sym)                sym
> +#endif
> +
> +/* Macros to generate eh_frame unwind information.  */
> +# ifdef HAVE_ASM_CFI_DIRECTIVES
> +#  define cfi_startproc                        .cfi_startproc
> +#  define cfi_endproc                  .cfi_endproc
> +#  define cfi_def_cfa(reg, off)                .cfi_def_cfa reg, off
> +#  define cfi_def_cfa_register(reg)    .cfi_def_cfa_register reg
> +#  define cfi_def_cfa_offset(off)      .cfi_def_cfa_offset off
> +#  define cfi_adjust_cfa_offset(off)   .cfi_adjust_cfa_offset off
> +#  define cfi_offset(reg, off)         .cfi_offset reg, off
> +#  define cfi_rel_offset(reg, off)     .cfi_rel_offset reg, off
> +#  define cfi_register(r1, r2)         .cfi_register r1, r2
> +#  define cfi_return_column(reg)       .cfi_return_column reg
> +#  define cfi_restore(reg)             .cfi_restore reg
> +#  define cfi_same_value(reg)          .cfi_same_value reg
> +#  define cfi_undefined(reg)           .cfi_undefined reg
> +#  define cfi_remember_state           .cfi_remember_state
> +#  define cfi_restore_state            .cfi_restore_state
> +#  define cfi_window_save              .cfi_window_save
> +# else
> +#  define cfi_startproc
> +#  define cfi_endproc
> +#  define cfi_def_cfa(reg, off)
> +#  define cfi_def_cfa_register(reg)
> +#  define cfi_def_cfa_offset(off)
> +#  define cfi_adjust_cfa_offset(off)
> +#  define cfi_offset(reg, off)
> +#  define cfi_rel_offset(reg, off)
> +#  define cfi_register(r1, r2)
> +#  define cfi_return_column(reg)
> +#  define cfi_restore(reg)
> +#  define cfi_same_value(reg)
> +#  define cfi_undefined(reg)
> +#  define cfi_remember_state
> +#  define cfi_restore_state
> +#  define cfi_window_save
> +# endif
> +
> +#else /* ! ASSEMBLER */
> +# ifdef HAVE_ASM_CFI_DIRECTIVES
> +#  define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name)
> +#  define CFI_STRINGIFY2(Name) #Name
> +#  define CFI_STARTPROC        ".cfi_startproc"
> +#  define CFI_ENDPROC  ".cfi_endproc"
> +#  define CFI_DEF_CFA(reg, off)        \
> +   ".cfi_def_cfa " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> +#  define CFI_DEF_CFA_REGISTER(reg) \
> +   ".cfi_def_cfa_register " CFI_STRINGIFY(reg)
> +#  define CFI_DEF_CFA_OFFSET(off) \
> +   ".cfi_def_cfa_offset " CFI_STRINGIFY(off)
> +#  define CFI_ADJUST_CFA_OFFSET(off) \
> +   ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off)
> +#  define CFI_OFFSET(reg, off) \
> +   ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> +#  define CFI_REL_OFFSET(reg, off) \
> +   ".cfi_rel_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> +#  define CFI_REGISTER(r1, r2) \
> +   ".cfi_register " CFI_STRINGIFY(r1) "," CFI_STRINGIFY(r2)
> +#  define CFI_RETURN_COLUMN(reg) \
> +   ".cfi_return_column " CFI_STRINGIFY(reg)
> +#  define CFI_RESTORE(reg) \
> +   ".cfi_restore " CFI_STRINGIFY(reg)
> +#  define CFI_UNDEFINED(reg) \
> +   ".cfi_undefined " CFI_STRINGIFY(reg)
> +#  define CFI_REMEMBER_STATE \
> +   ".cfi_remember_state"
> +#  define CFI_RESTORE_STATE \
> +   ".cfi_restore_state"
> +#  define CFI_WINDOW_SAVE \
> +   ".cfi_window_save"
> +# else
> +#  define CFI_STARTPROC
> +#  define CFI_ENDPROC
> +#  define CFI_DEF_CFA(reg, off)
> +#  define CFI_DEF_CFA_REGISTER(reg)
> +#  define CFI_DEF_CFA_OFFSET(off)
> +#  define CFI_ADJUST_CFA_OFFSET(off)
> +#  define CFI_OFFSET(reg, off)
> +#  define CFI_REL_OFFSET(reg, off)
> +#  define CFI_REGISTER(r1, r2)
> +#  define CFI_RETURN_COLUMN(reg)
> +#  define CFI_RESTORE(reg)
> +#  define CFI_UNDEFINED(reg)
> +#  define CFI_REMEMBER_STATE
> +#  define CFI_RESTORE_STATE
> +#  define CFI_WINDOW_SAVE
> +# endif
> +
> +#endif /* __ASSEMBLER__ */
> diff --git a/libc/sysdeps/linux/sh/sysdep.h b/libc/sysdeps/linux/sh/sysdep.h
> new file mode 100644
> index 0000000..1d49055
> --- /dev/null
> +++ b/libc/sysdeps/linux/sh/sysdep.h
> @@ -0,0 +1,277 @@
> +/* Assembler macros for SH.
> +   Copyright (C) 1999, 2000, 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 <common/sysdep.h>
> +
> +#include <features.h>
> +#include <libc-internal.h>
> +
> +#ifdef __ASSEMBLER__
> +
> +/* Syntactic details of assembler.  */
> +
> +#define ALIGNARG(log2) log2
> +/* For ELF we need the `.type' directive to make shared libs work right.  */
> +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,@##typearg;
> +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
> +
> +#ifdef SHARED
> +#define PLTJMP(_x)     _x##@PLT
> +#else
> +#define PLTJMP(_x)     _x
> +#endif
> +
> +/* Define an entry point visible from C.  */
> +#define        ENTRY(name)                                                           \
> +  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
> +  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function)                          \
> +  .align ALIGNARG(5);                                                        \
> +  C_LABEL(name)                                                                      \
> +  cfi_startproc;                                                             \
> +  CALL_MCOUNT
> +
> +#undef END
> +#define END(name)                                                            \
> +  cfi_endproc;                                                               \
> +  ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name))
> +
> +/* If compiled for profiling, call `mcount' at the start of each function.  */
> +#ifdef PROF
> +#define CALL_MCOUNT                                    \
> +       mov.l   1f,r1;                                  \
> +       sts.l   pr, at -r15;                               \
> +       cfi_adjust_cfa_offset (4);                      \
> +       cfi_rel_offset (pr, 0);                         \
> +       mova    2f,r0;                                  \
> +       jmp     @r1;                                    \
> +        lds    r0,pr;                                  \
> +       .align  2;                                      \
> +1:     .long   mcount;                                 \
> +2:     lds.l   @r15+,pr;                               \
> +       cfi_adjust_cfa_offset (-4);                     \
> +       cfi_restore (pr)
> +
> +#else
> +#define CALL_MCOUNT            /* Do nothing.  */
> +#endif
> +
> +#ifdef __UCLIBC_UNDERSCORES__
> +/* Since C identifiers are not normally prefixed with an underscore
> +   on this system, the asm identifier `syscall_error' intrudes on the
> +   C name space.  Make sure we use an innocuous name.  */
> +#define        syscall_error   __syscall_error
> +#define mcount         _mcount
> +#endif
> +
> +/* For Linux we can use the system call table in the header file
> +       /usr/include/asm/unistd.h
> +   of the kernel.  But these symbols do not follow the SYS_* syntax
> +   so we have to redefine the `SYS_ify' macro here.  */
> +#undef SYS_ify
> +#define SYS_ify(syscall_name)  (__NR_##syscall_name)
> +
> +#define ret    rts ; nop
> +/* The sh move insn is s, d.  */
> +#define MOVE(x,y)      mov x , y
> +
> +/* Linux uses a negative return value to indicate syscall errors,
> +   unlike most Unices, which use the condition codes' carry flag.
> +
> +   Since version 2.1 the return value of a system call might be
> +   negative even if the call succeeded.  E.g., the `lseek' system call
> +   might return a large offset.  Therefore we must not anymore test
> +   for < 0, but test for a real error by making sure the value in R0
> +   is a real error number.  Linus said he will make sure the no syscall
> +   returns a value in -1 .. -4095 as a valid result so we can savely
> +   test with -4095.  */
> +
> +#define _IMM1 #-1
> +#define _IMM12 #-12
> +#undef PSEUDO
> +#define        PSEUDO(name, syscall_name, args) \
> + .text; \
> + ENTRY (name); \
> +    DO_CALL (syscall_name, args); \
> +    mov r0,r1; \
> +    mov _IMM12,r2; \
> +    shad r2,r1; \
> +    not r1,r1; \
> +    tst r1,r1; \
> +    bf .Lpseudo_end; \
> +    SYSCALL_ERROR_HANDLER; \
> + .Lpseudo_end:
> +
> +#undef PSEUDO_END
> +#define        PSEUDO_END(name) \
> +  END (name)
> +
> +#undef PSEUDO_NOERRNO
> +#define        PSEUDO_NOERRNO(name, syscall_name, args) \
> + .text; \
> + ENTRY (name); \
> +    DO_CALL (syscall_name, args)
> +
> +#undef PSEUDO_END_NOERRNO
> +#define        PSEUDO_END_NOERRNO(name) \
> +  END (name)
> +
> +#define ret_NOERRNO ret
> +
> +#define        PSEUDO_ERRVAL(name, syscall_name, args) \
> + .text; \
> + ENTRY (name); \
> +    DO_CALL (syscall_name, args);
> +
> +#undef PSEUDO_END_ERRVAL
> +#define        PSEUDO_END_ERRVAL(name) \
> +  END (name)
> +
> +#define ret_ERRVAL ret
> +
> +#ifndef __PIC__
> +# define SYSCALL_ERROR_HANDLER \
> +       mov.l 0f,r1; \
> +       jmp @r1; \
> +        mov r0,r4; \
> +       .align 2; \
> +     0: .long __syscall_error
> +
> +#include <libc/sysdeps/linux/sh/syscall_error.S>
> +#else
> +# ifdef RTLD_PRIVATE_ERRNO
> +
> +#  define SYSCALL_ERROR_HANDLER        \
> +       neg r0,r1; \
> +       mov.l 0f,r12; \
> +       mova 0f,r0; \
> +       add r0,r12; \
> +       mov.l 1f,r0; \
> +       mov.l r1,@(r0,r12)
> +       bra .Lpseudo_end; \
> +        mov _IMM1,r0; \
> +       .align 2; \
> +     0: .long _GLOBAL_OFFSET_TABLE_; \
> +     1: .long rtld_errno at GOTOFF
> +
> +# elif defined _LIBC_REENTRANT
> +
> +#  if USE___THREAD
> +
> +#   ifndef NOT_IN_libc
> +#    define SYSCALL_ERROR_ERRNO __libc_errno
> +#   else
> +#    define SYSCALL_ERROR_ERRNO errno
> +#   endif
> +#   define SYSCALL_ERROR_HANDLER \
> +       neg r0,r1; \
> +       mov r12,r2; \
> +       mov.l 0f,r12; \
> +       mova 0f,r0; \
> +       add r0,r12; \
> +       mov.l 1f,r0; \
> +       stc gbr, r4; \
> +       mov.l @(r0,r12),r0; \
> +       bra .Lskip; \
> +       add r4,r0; \
> +       .align 2; \
> +       1: .long SYSCALL_ERROR_ERRNO at GOTTPOFF; \
> +       .Lskip: \
> +       mov r2,r12; \
> +       mov.l r1, at r0; \
> +       bra .Lpseudo_end; \
> +       mov _IMM1,r0; \
> +       .align 2; \
> +       0: .long _GLOBAL_OFFSET_TABLE_
> +#  else
> +
> +#   define SYSCALL_ERROR_HANDLER \
> +       neg r0,r1; \
> +       mov.l r14, at -r15; \
> +       mov.l r12, at -r15; \
> +       mov.l r1, at -r15; \
> +       mov.l 0f,r12; \
> +       mova 0f,r0; \
> +       add r0,r12; \
> +       sts.l pr, at -r15; \
> +       mov r15,r14; \
> +       mov.l 1f,r1; \
> +       bsrf r1; \
> +         nop; \
> +     2: mov r14,r15; \
> +       lds.l @r15+,pr; \
> +       mov.l @r15+,r1; \
> +       mov.l r1, at r0; \
> +       mov.l @r15+,r12; \
> +       mov.l @r15+,r14; \
> +       bra .Lpseudo_end; \
> +        mov _IMM1,r0; \
> +       .align 2; \
> +     0: .long _GLOBAL_OFFSET_TABLE_; \
> +     1: .long PLTJMP(C_SYMBOL_NAME(__errno_location))-(2b-.)
> +/* A quick note: it is assumed that the call to `__errno_location' does
> +   not modify the stack!  */
> +#  endif
> +# else
> +
> +/* Store (-r0) into errno through the GOT.  */
> +#  define SYSCALL_ERROR_HANDLER                                                      \
> +       neg r0,r1; \
> +       mov r12,r2; \
> +       mov.l 0f,r12; \
> +       mova 0f,r0; \
> +       add r0,r12; \
> +       mov.l 1f,r0; \
> +       mov.l @(r0,r12),r0; \
> +       mov r2,r12; \
> +       mov.l r1, at r0; \
> +       bra .Lpseudo_end; \
> +        mov _IMM1,r0; \
> +       .align 2; \
> +     0: .long _GLOBAL_OFFSET_TABLE_; \
> +     1: .long errno at GOT
> +# endif        /* _LIBC_REENTRANT */
> +#endif /* __PIC__ */
> +
> +# ifdef __SH4__
> +#  define SYSCALL_INST_PAD \
> +       or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0
> +# else
> +#  define SYSCALL_INST_PAD
> +# endif
> +
> +#define SYSCALL_INST0  trapa #0x10
> +#define SYSCALL_INST1  trapa #0x11
> +#define SYSCALL_INST2  trapa #0x12
> +#define SYSCALL_INST3  trapa #0x13
> +#define SYSCALL_INST4  trapa #0x14
> +#define SYSCALL_INST5  mov.l @(0,r15),r0; trapa #0x15
> +#define SYSCALL_INST6  mov.l @(0,r15),r0; mov.l @(4,r15),r1; trapa #0x16
> +
> +#undef DO_CALL
> +#define DO_CALL(syscall_name, args)    \
> +    mov.l 1f,r3;                       \
> +    SYSCALL_INST##args;                        \
> +    SYSCALL_INST_PAD;                  \
> +    bra 2f;                            \
> +     nop;                              \
> +    .align 2;                          \
> + 1: .long SYS_ify (syscall_name);      \
> + 2:
> +
> +#endif /* __ASSEMBLER__ */
> diff --git a/libpthread/nptl/sysdeps/arm/sysdep.h b/libpthread/nptl/sysdeps/arm/sysdep.h
> deleted file mode 100644
> index 19bd3c3..0000000
> --- a/libpthread/nptl/sysdeps/arm/sysdep.h
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -/* Assembler macros for ARM.
> -   Copyright (C) 1997, 1998, 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, write to the Free
> -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> -   02111-1307 USA.  */
> -
> -#include <sysdeps/generic/sysdep.h>
> -
> -#ifdef __ASSEMBLER__
> -
> -/* Syntactic details of assembler.  */
> -
> -#define ALIGNARG(log2) log2
> -/* For ELF we need the `.type' directive to make shared libs work right.  */
> -#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,%##typearg;
> -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
> -
> -/* In ELF C symbols are asm symbols.  */
> -#undef NO_UNDERSCORES
> -#define NO_UNDERSCORES
> -
> -#define PLTJMP(_x)     _x##(PLT)
> -
> -/* APCS-32 doesn't preserve the condition codes across function call. */
> -#ifdef __APCS_32__
> -#define LOADREGS(cond, base, reglist...)\
> -       ldm##cond       base,reglist
> -#ifdef __USE_BX__
> -#define RETINSTR(cond, reg)    \
> -       bx##cond        reg
> -#define DO_RET(_reg)           \
> -       bx _reg
> -#else
> -#define RETINSTR(cond, reg)    \
> -       mov##cond       pc, reg
> -#define DO_RET(_reg)           \
> -       mov pc, _reg
> -#endif
> -#else  /* APCS-26 */
> -#define LOADREGS(cond, base, reglist...)\
> -       ldm##cond       base,reglist^
> -#define RETINSTR(cond, reg)    \
> -       mov##cond##s    pc, reg
> -#define DO_RET(_reg)           \
> -       movs pc, _reg
> -#endif
> -
> -/* Define an entry point visible from C.  */
> -#define        ENTRY(name)                                                           \
> -  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
> -  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function)                          \
> -  .align ALIGNARG(4);                                                        \
> -  name##:                                                                     \
> -  CALL_MCOUNT
> -
> -#undef END
> -#define END(name)                                                            \
> -  ASM_SIZE_DIRECTIVE(name)
> -
> -/* If compiled for profiling, call `mcount' at the start of each function.  */
> -#ifdef PROF
> -#define CALL_MCOUNT                    \
> -       str     lr,[sp, #-4]!   ;       \
> -       bl      PLTJMP(mcount)  ;       \
> -       ldr     lr, [sp], #4    ;
> -#else
> -#define CALL_MCOUNT            /* Do nothing.  */
> -#endif
> -
> -#ifdef NO_UNDERSCORES
> -/* Since C identifiers are not normally prefixed with an underscore
> -   on this system, the asm identifier `syscall_error' intrudes on the
> -   C name space.  Make sure we use an innocuous name.  */
> -#define        syscall_error   __syscall_error
> -#define mcount         _mcount
> -#endif
> -
> -#endif /* __ASSEMBLER__ */
> diff --git a/libpthread/nptl/sysdeps/generic/sysdep.h b/libpthread/nptl/sysdeps/generic/sysdep.h
> deleted file mode 100644
> index 9627b3e..0000000
> --- a/libpthread/nptl/sysdeps/generic/sysdep.h
> +++ /dev/null
> @@ -1,137 +0,0 @@
> -/* Generic asm macros used on many machines.
> -   Copyright (C) 1991,92,93,96,98,2002,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, write to the Free
> -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> -   02111-1307 USA.  */
> -
> -#ifndef C_LABEL
> -
> -/* Define a macro we can use to construct the asm name for a C symbol.  */
> -#ifndef        __UCLIBC_UNDERSCORES__
> -#ifdef __STDC__
> -#define C_LABEL(name)          name##:
> -#else
> -#define C_LABEL(name)          name/**/:
> -#endif
> -#else
> -#ifdef __STDC__
> -#define C_LABEL(name)          _##name##:
> -#else
> -#define C_LABEL(name)          _/**/name/**/:
> -#endif
> -#endif
> -
> -#endif
> -
> -#ifdef __ASSEMBLER__
> -/* Mark the end of function named SYM.  This is used on some platforms
> -   to generate correct debugging information.  */
> -#ifndef END
> -#define END(sym)
> -#endif
> -
> -#ifndef JUMPTARGET
> -#define JUMPTARGET(sym)                sym
> -#endif
> -
> -/* Macros to generate eh_frame unwind information.  */
> -# ifdef HAVE_ASM_CFI_DIRECTIVES
> -#  define cfi_startproc                        .cfi_startproc
> -#  define cfi_endproc                  .cfi_endproc
> -#  define cfi_def_cfa(reg, off)                .cfi_def_cfa reg, off
> -#  define cfi_def_cfa_register(reg)    .cfi_def_cfa_register reg
> -#  define cfi_def_cfa_offset(off)      .cfi_def_cfa_offset off
> -#  define cfi_adjust_cfa_offset(off)   .cfi_adjust_cfa_offset off
> -#  define cfi_offset(reg, off)         .cfi_offset reg, off
> -#  define cfi_rel_offset(reg, off)     .cfi_rel_offset reg, off
> -#  define cfi_register(r1, r2)         .cfi_register r1, r2
> -#  define cfi_return_column(reg)       .cfi_return_column reg
> -#  define cfi_restore(reg)             .cfi_restore reg
> -#  define cfi_same_value(reg)          .cfi_same_value reg
> -#  define cfi_undefined(reg)           .cfi_undefined reg
> -#  define cfi_remember_state           .cfi_remember_state
> -#  define cfi_restore_state            .cfi_restore_state
> -#  define cfi_window_save              .cfi_window_save
> -# else
> -#  define cfi_startproc
> -#  define cfi_endproc
> -#  define cfi_def_cfa(reg, off)
> -#  define cfi_def_cfa_register(reg)
> -#  define cfi_def_cfa_offset(off)
> -#  define cfi_adjust_cfa_offset(off)
> -#  define cfi_offset(reg, off)
> -#  define cfi_rel_offset(reg, off)
> -#  define cfi_register(r1, r2)
> -#  define cfi_return_column(reg)
> -#  define cfi_restore(reg)
> -#  define cfi_same_value(reg)
> -#  define cfi_undefined(reg)
> -#  define cfi_remember_state
> -#  define cfi_restore_state
> -#  define cfi_window_save
> -# endif
> -
> -#else /* ! ASSEMBLER */
> -# ifdef HAVE_ASM_CFI_DIRECTIVES
> -#  define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name)
> -#  define CFI_STRINGIFY2(Name) #Name
> -#  define CFI_STARTPROC        ".cfi_startproc"
> -#  define CFI_ENDPROC  ".cfi_endproc"
> -#  define CFI_DEF_CFA(reg, off)        \
> -   ".cfi_def_cfa " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> -#  define CFI_DEF_CFA_REGISTER(reg) \
> -   ".cfi_def_cfa_register " CFI_STRINGIFY(reg)
> -#  define CFI_DEF_CFA_OFFSET(off) \
> -   ".cfi_def_cfa_offset " CFI_STRINGIFY(off)
> -#  define CFI_ADJUST_CFA_OFFSET(off) \
> -   ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off)
> -#  define CFI_OFFSET(reg, off) \
> -   ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> -#  define CFI_REL_OFFSET(reg, off) \
> -   ".cfi_rel_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
> -#  define CFI_REGISTER(r1, r2) \
> -   ".cfi_register " CFI_STRINGIFY(r1) "," CFI_STRINGIFY(r2)
> -#  define CFI_RETURN_COLUMN(reg) \
> -   ".cfi_return_column " CFI_STRINGIFY(reg)
> -#  define CFI_RESTORE(reg) \
> -   ".cfi_restore " CFI_STRINGIFY(reg)
> -#  define CFI_UNDEFINED(reg) \
> -   ".cfi_undefined " CFI_STRINGIFY(reg)
> -#  define CFI_REMEMBER_STATE \
> -   ".cfi_remember_state"
> -#  define CFI_RESTORE_STATE \
> -   ".cfi_restore_state"
> -#  define CFI_WINDOW_SAVE \
> -   ".cfi_window_save"
> -# else
> -#  define CFI_STARTPROC
> -#  define CFI_ENDPROC
> -#  define CFI_DEF_CFA(reg, off)
> -#  define CFI_DEF_CFA_REGISTER(reg)
> -#  define CFI_DEF_CFA_OFFSET(off)
> -#  define CFI_ADJUST_CFA_OFFSET(off)
> -#  define CFI_OFFSET(reg, off)
> -#  define CFI_REL_OFFSET(reg, off)
> -#  define CFI_REGISTER(r1, r2)
> -#  define CFI_RETURN_COLUMN(reg)
> -#  define CFI_RESTORE(reg)
> -#  define CFI_UNDEFINED(reg)
> -#  define CFI_REMEMBER_STATE
> -#  define CFI_RESTORE_STATE
> -#  define CFI_WINDOW_SAVE
> -# endif
> -
> -#endif /* __ASSEMBLER__ */
> diff --git a/libpthread/nptl/sysdeps/sh/sysdep.h b/libpthread/nptl/sysdeps/sh/sysdep.h
> deleted file mode 100644
> index 5b75198..0000000
> --- a/libpthread/nptl/sysdeps/sh/sysdep.h
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -/* Assembler macros for SH.
> -   Copyright (C) 1999, 2000, 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 <sysdeps/generic/sysdep.h>
> -
> -#include <features.h>
> -#include <libc-internal.h>
> -
> -#ifdef __ASSEMBLER__
> -
> -/* Syntactic details of assembler.  */
> -
> -#define ALIGNARG(log2) log2
> -/* For ELF we need the `.type' directive to make shared libs work right.  */
> -#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,@##typearg;
> -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
> -
> -#ifdef SHARED
> -#define PLTJMP(_x)     _x##@PLT
> -#else
> -#define PLTJMP(_x)     _x
> -#endif
> -
> -/* Define an entry point visible from C.  */
> -#define        ENTRY(name)                                                           \
> -  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
> -  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function)                          \
> -  .align ALIGNARG(5);                                                        \
> -  C_LABEL(name)                                                                      \
> -  cfi_startproc;                                                             \
> -  CALL_MCOUNT
> -
> -#undef END
> -#define END(name)                                                            \
> -  cfi_endproc;                                                               \
> -  ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name))
> -
> -/* If compiled for profiling, call `mcount' at the start of each function.  */
> -#ifdef PROF
> -#define CALL_MCOUNT                                    \
> -       mov.l   1f,r1;                                  \
> -       sts.l   pr, at -r15;                               \
> -       cfi_adjust_cfa_offset (4);                      \
> -       cfi_rel_offset (pr, 0);                         \
> -       mova    2f,r0;                                  \
> -       jmp     @r1;                                    \
> -        lds    r0,pr;                                  \
> -       .align  2;                                      \
> -1:     .long   mcount;                                 \
> -2:     lds.l   @r15+,pr;                               \
> -       cfi_adjust_cfa_offset (-4);                     \
> -       cfi_restore (pr)
> -
> -#else
> -#define CALL_MCOUNT            /* Do nothing.  */
> -#endif
> -
> -#ifdef __UCLIBC_UNDERSCORES__
> -/* Since C identifiers are not normally prefixed with an underscore
> -   on this system, the asm identifier `syscall_error' intrudes on the
> -   C name space.  Make sure we use an innocuous name.  */
> -#define        syscall_error   __syscall_error
> -#define mcount         _mcount
> -#endif
> -
> -#endif /* __ASSEMBLER__ */
> diff --git a/libpthread/nptl/sysdeps/unix/sh/sysdep.h b/libpthread/nptl/sysdeps/unix/sh/sysdep.h
> deleted file mode 100644
> index bf1ac0f..0000000
> --- a/libpthread/nptl/sysdeps/unix/sh/sysdep.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -/* Copyright (C) 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
> -   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 <sysdeps/unix/sysdep.h>
> -#include <sysdeps/sh/sysdep.h>
> -
> -#ifdef __ASSEMBLER__
> -
> -#define ret    rts ; nop
> -
> -/* The sh move insn is s, d.  */
> -#define MOVE(x,y)      mov x , y
> -
> -#endif
> diff --git a/libpthread/nptl/sysdeps/unix/sysdep.h b/libpthread/nptl/sysdeps/unix/sysdep.h
> deleted file mode 100644
> index 0e7c9da..0000000
> --- a/libpthread/nptl/sysdeps/unix/sysdep.h
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -/* Copyright (C) 1991, 92, 93, 96, 98, 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, write to the Free
> -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> -   02111-1307 USA.  */
> -
> -#include <sysdeps/generic/sysdep.h>
> -
> -#include <sys/syscall.h>
> -#define        HAVE_SYSCALLS
> -
> -/* Note that using a `PASTE' macro loses.  */
> -#ifdef __STDC__
> -#define        SYSCALL__(name, args)   PSEUDO (__##name, name, args)
> -#else
> -#define        SYSCALL__(name, args)   PSEUDO (__/**/name, name, args)
> -#endif
> -#define        SYSCALL(name, args)     PSEUDO (name, name, args)
> -
> -/* Machine-dependent sysdep.h files are expected to define the macro
> -   PSEUDO (function_name, syscall_name) to emit assembly code to define the
> -   C-callable function FUNCTION_NAME to do system call SYSCALL_NAME.
> -   r0 and r1 are the system call outputs.  MOVE(x, y) should be defined as
> -   an instruction such that "MOVE(r1, r0)" works.  ret should be defined
> -   as the return instruction.  */
> -
> -#ifndef SYS_ify
> -#ifdef __STDC__
> -#define SYS_ify(syscall_name) SYS_##syscall_name
> -#else
> -#define SYS_ify(syscall_name) SYS_/**/syscall_name
> -#endif
> -#endif
> -
> -/* Terminate a system call named SYM.  This is used on some platforms
> -   to generate correct debugging information.  */
> -#ifndef PSEUDO_END
> -#define PSEUDO_END(sym)
> -#endif
> -#ifndef PSEUDO_END_NOERRNO
> -#define PSEUDO_END_NOERRNO(sym)        PSEUDO_END(sym)
> -#endif
> -#ifndef PSEUDO_END_ERRVAL
> -#define PSEUDO_END_ERRVAL(sym) PSEUDO_END(sym)
> -#endif
> -
> -/* Wrappers around system calls should normally inline the system call code.
> -   But sometimes it is not possible or implemented and we use this code.  */
> -#ifndef INLINE_SYSCALL
> -#define INLINE_SYSCALL(name, nr, args...) __syscall_##name (args)
> -#endif
> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h
> deleted file mode 100644
> index 1aed1a1..0000000
> --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/sysdep.h
> +++ /dev/null
> @@ -1,4 +0,0 @@
> -/*  4 instruction cycles not accessing cache and TLB are needed after
> -    trapa instruction to avoid an SH-4 silicon bug.  */
> -#define NEED_SYSCALL_INST_PAD
> -#include_next <sysdep.h>
> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sysdep.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sysdep.h
> deleted file mode 100644
> index 7e9223b..0000000
> --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sysdep.h
> +++ /dev/null
> @@ -1,224 +0,0 @@
> -/* Copyright (C) 1992,1993,1995,1996,1997,1998,1999,2000,2002,2003,2004
> -       Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -   Contributed by Ulrich Drepper, <drepper at gnu.ai.mit.edu>, August 1995.
> -   Changed by Kaz Kojima, <kkojima at rr.iij4u.or.jp>.
> -
> -   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.  */
> -
> -#ifndef _LINUX_SH_SYSDEP_H
> -#define _LINUX_SH_SYSDEP_H 1
> -
> -/* There is some commonality.  */
> -#include <sysdeps/unix/sh/sysdep.h>
> -
> -/* For Linux we can use the system call table in the header file
> -       /usr/include/asm/unistd.h
> -   of the kernel.  But these symbols do not follow the SYS_* syntax
> -   so we have to redefine the `SYS_ify' macro here.  */
> -#undef SYS_ify
> -#define SYS_ify(syscall_name)  (__NR_##syscall_name)
> -
> -
> -#ifdef __ASSEMBLER__
> -
> -/* Linux uses a negative return value to indicate syscall errors,
> -   unlike most Unices, which use the condition codes' carry flag.
> -
> -   Since version 2.1 the return value of a system call might be
> -   negative even if the call succeeded.  E.g., the `lseek' system call
> -   might return a large offset.  Therefore we must not anymore test
> -   for < 0, but test for a real error by making sure the value in R0
> -   is a real error number.  Linus said he will make sure the no syscall
> -   returns a value in -1 .. -4095 as a valid result so we can savely
> -   test with -4095.  */
> -
> -#define _IMM1 #-1
> -#define _IMM12 #-12
> -#undef PSEUDO
> -#define        PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name); \
> -    DO_CALL (syscall_name, args); \
> -    mov r0,r1; \
> -    mov _IMM12,r2; \
> -    shad r2,r1; \
> -    not r1,r1; \
> -    tst r1,r1; \
> -    bf .Lpseudo_end; \
> -    SYSCALL_ERROR_HANDLER; \
> - .Lpseudo_end:
> -
> -#undef PSEUDO_END
> -#define        PSEUDO_END(name) \
> -  END (name)
> -
> -#undef PSEUDO_NOERRNO
> -#define        PSEUDO_NOERRNO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name); \
> -    DO_CALL (syscall_name, args)
> -
> -#undef PSEUDO_END_NOERRNO
> -#define        PSEUDO_END_NOERRNO(name) \
> -  END (name)
> -
> -#define ret_NOERRNO ret
> -
> -#define        PSEUDO_ERRVAL(name, syscall_name, args) \
> - .text; \
> - ENTRY (name); \
> -    DO_CALL (syscall_name, args);
> -
> -#undef PSEUDO_END_ERRVAL
> -#define        PSEUDO_END_ERRVAL(name) \
> -  END (name)
> -
> -#define ret_ERRVAL ret
> -
> -#ifndef __PIC__
> -# define SYSCALL_ERROR_HANDLER \
> -       mov.l 0f,r1; \
> -       jmp @r1; \
> -        mov r0,r4; \
> -       .align 2; \
> -     0: .long __syscall_error
> -
> -#include <libc/sysdeps/linux/sh/syscall_error.S>
> -#else
> -# ifdef RTLD_PRIVATE_ERRNO
> -
> -#  define SYSCALL_ERROR_HANDLER        \
> -       neg r0,r1; \
> -       mov.l 0f,r12; \
> -       mova 0f,r0; \
> -       add r0,r12; \
> -       mov.l 1f,r0; \
> -       mov.l r1,@(r0,r12)
> -       bra .Lpseudo_end; \
> -        mov _IMM1,r0; \
> -       .align 2; \
> -     0: .long _GLOBAL_OFFSET_TABLE_; \
> -     1: .long rtld_errno at GOTOFF
> -
> -# elif defined _LIBC_REENTRANT
> -
> -#  if USE___THREAD
> -
> -#   ifndef NOT_IN_libc
> -#    define SYSCALL_ERROR_ERRNO __libc_errno
> -#   else
> -#    define SYSCALL_ERROR_ERRNO errno
> -#   endif
> -#   define SYSCALL_ERROR_HANDLER \
> -       neg r0,r1; \
> -       mov r12,r2; \
> -       mov.l 0f,r12; \
> -       mova 0f,r0; \
> -       add r0,r12; \
> -       mov.l 1f,r0; \
> -       stc gbr, r4; \
> -       mov.l @(r0,r12),r0; \
> -       bra .Lskip; \
> -       add r4,r0; \
> -       .align 2; \
> -       1: .long SYSCALL_ERROR_ERRNO at GOTTPOFF; \
> -       .Lskip: \
> -       mov r2,r12; \
> -       mov.l r1, at r0; \
> -       bra .Lpseudo_end; \
> -       mov _IMM1,r0; \
> -       .align 2; \
> -       0: .long _GLOBAL_OFFSET_TABLE_
> -#  else
> -
> -#   define SYSCALL_ERROR_HANDLER \
> -       neg r0,r1; \
> -       mov.l r14, at -r15; \
> -       mov.l r12, at -r15; \
> -       mov.l r1, at -r15; \
> -       mov.l 0f,r12; \
> -       mova 0f,r0; \
> -       add r0,r12; \
> -       sts.l pr, at -r15; \
> -       mov r15,r14; \
> -       mov.l 1f,r1; \
> -       bsrf r1; \
> -         nop; \
> -     2: mov r14,r15; \
> -       lds.l @r15+,pr; \
> -       mov.l @r15+,r1; \
> -       mov.l r1, at r0; \
> -       mov.l @r15+,r12; \
> -       mov.l @r15+,r14; \
> -       bra .Lpseudo_end; \
> -        mov _IMM1,r0; \
> -       .align 2; \
> -     0: .long _GLOBAL_OFFSET_TABLE_; \
> -     1: .long PLTJMP(C_SYMBOL_NAME(__errno_location))-(2b-.)
> -/* A quick note: it is assumed that the call to `__errno_location' does
> -   not modify the stack!  */
> -#  endif
> -# else
> -
> -/* Store (-r0) into errno through the GOT.  */
> -#  define SYSCALL_ERROR_HANDLER                                                      \
> -       neg r0,r1; \
> -       mov r12,r2; \
> -       mov.l 0f,r12; \
> -       mova 0f,r0; \
> -       add r0,r12; \
> -       mov.l 1f,r0; \
> -       mov.l @(r0,r12),r0; \
> -       mov r2,r12; \
> -       mov.l r1, at r0; \
> -       bra .Lpseudo_end; \
> -        mov _IMM1,r0; \
> -       .align 2; \
> -     0: .long _GLOBAL_OFFSET_TABLE_; \
> -     1: .long errno at GOT
> -# endif        /* _LIBC_REENTRANT */
> -#endif /* __PIC__ */
> -
> -# ifdef NEED_SYSCALL_INST_PAD
> -#  define SYSCALL_INST_PAD \
> -       or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0
> -# else
> -#  define SYSCALL_INST_PAD
> -# endif
> -
> -#define SYSCALL_INST0  trapa #0x10
> -#define SYSCALL_INST1  trapa #0x11
> -#define SYSCALL_INST2  trapa #0x12
> -#define SYSCALL_INST3  trapa #0x13
> -#define SYSCALL_INST4  trapa #0x14
> -#define SYSCALL_INST5  mov.l @(0,r15),r0; trapa #0x15
> -#define SYSCALL_INST6  mov.l @(0,r15),r0; mov.l @(4,r15),r1; trapa #0x16
> -
> -#undef DO_CALL
> -#define DO_CALL(syscall_name, args)    \
> -    mov.l 1f,r3;                       \
> -    SYSCALL_INST##args;                        \
> -    SYSCALL_INST_PAD;                  \
> -    bra 2f;                            \
> -     nop;                              \
> -    .align 2;                          \
> - 1: .long SYS_ify (syscall_name);      \
> - 2:
> -
> -#endif /* __ASSEMBLER__ */
> -
> -#endif /* linux/sh/sysdep.h */
> --
> 1.6.0.6
>
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc
>


More information about the uClibc mailing list