[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