[git commit nptl] mips/sysdep.h: Unify mips sysdep.h
Khem Raj
raj.khem at gmail.com
Fri Feb 12 19:33:19 UTC 2010
On Fri, Feb 12, 2010 at 5:47 AM, Carmelo AMOROSO <carmelo.amoroso at st.com> wrote:
> On 2/10/2010 3:24 PM, Khem Raj wrote:
>>
>> commit: http://git.uclibc.org/uClibc/commit/?id=d7af6538924e8be444b60dc255da23c369b2c072
>> branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/nptl
>>
>> Signed-off-by: Khem Raj <raj.khem at gmail.com>
>
> Thanks Khem for this. It is another step toward nptl integration.
Yes indeed. I have to make sure that LT still works with these changes
on the branch.
>
> Carmelo
>
>> ---
>> libc/sysdeps/linux/mips/sysdep.h | 366 +++++++++++++++++++-
>> libpthread/nptl/sysdeps/mips/sysdep.h | 110 ------
>> .../nptl/sysdeps/unix/sysv/linux/mips/sysdep.h | 302 ----------------
>> 3 files changed, 350 insertions(+), 428 deletions(-)
>> delete mode 100644 libpthread/nptl/sysdeps/mips/sysdep.h
>> delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep.h
>>
>> diff --git a/libc/sysdeps/linux/mips/sysdep.h b/libc/sysdeps/linux/mips/sysdep.h
>> index 38d4ce9..0c30e20 100644
>> --- a/libc/sysdeps/linux/mips/sysdep.h
>> +++ b/libc/sysdeps/linux/mips/sysdep.h
>> @@ -1,6 +1,4 @@
>> -/* Adapted from glibc's sysdeps/unix/mips/sysdep.h */
>> -
>> -/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003
>> +/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003, 2004
>> Free Software Foundation, Inc.
>> This file is part of the GNU C Library.
>> Contributed by Brendan Kehoe (brendan at zen.org).
>> @@ -20,28 +18,72 @@
>> Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
>> 02111-1307 USA. */
>>
>> -#include <features.h>
>> +#ifndef _LINUX_MIPS_SYSDEP_H
>> +#define _LINUX_MIPS_SYSDEP_H 1
>> +
>> +#include <sgidefs.h>
>> +#include <common/sysdep.h>
>>
>> -#if __UCLIBC_HAS_THREADS_NATIVE__
>> -#include_next <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
>> +#ifdef __STDC__
>> +# define SYS_ify(syscall_name) __NR_##syscall_name
>> #else
>> +# define SYS_ify(syscall_name) __NR_/**/syscall_name
>> +#endif
>>
>> #ifdef __ASSEMBLER__
>>
>> -#include <sgidefs.h>
>> -#include <sys/regdef.h>
>> +#include <regdef.h>
>>
>> -#define ENTRY(name) \
>> - .globl name; \
>> - .align 2; \
>> - .ent name,0; \
>> +#define ENTRY(name) \
>> + .globl name; \
>> + .align 2; \
>> + .ent name,0; \
>> name##:
>>
>> #undef END
>> -#define END(function) \
>> - .end function; \
>> - .size function,.-function
>> +#define END(function) \
>> + .end function; \
>> + .size function,.-function
>> +
>> +#define ret j ra ; nop
>> +
>> +#undef PSEUDO_END
>> +#define PSEUDO_END(sym) .end sym; .size sym,.-sym
>> +
>> +#define PSEUDO_NOERRNO(name, syscall_name, args) \
>> + .align 2; \
>> + ENTRY(name) \
>> + .set noreorder; \
>> + li v0, SYS_ify(syscall_name); \
>> + syscall
>> +
>> +#undef PSEUDO_END_NOERRNO
>> +#define PSEUDO_END_NOERRNO(sym) .end sym; .size sym,.-sym
>> +
>> +#define ret_NOERRNO ret
>> +
>> +#define PSEUDO_ERRVAL(name, syscall_name, args) \
>> + .align 2; \
>> + ENTRY(name) \
>> + .set noreorder; \
>> + li v0, SYS_ify(syscall_name); \
>> + syscall
>> +
>> +#undef PSEUDO_END_ERRVAL
>> +#define PSEUDO_END_ERRVAL(sym) .end sym; .size sym,.-sym
>> +
>> +#define ret_ERRVAL ret
>> +
>> +#define r0 v0
>> +#define r1 v1
>> +/* The mips move insn is d,s. */
>> +#define MOVE(x,y) move y , x
>>
>> #if _MIPS_SIM == _ABIO32
>> # define L(label) $L ## label
>> @@ -49,6 +91,298 @@
>> # define L(label) .L ## label
>> #endif
>>
>> +/* Note that while it's better structurally, going back to call __syscall_error
>> + can make things confusing if you're debugging---it looks like it's jumping
>> + backwards into the previous fn. */
>> +
>> +#ifdef __PIC__
>> +#define PSEUDO(name, syscall_name, args) \
>> + .align 2; \
>> + 99: la t9,__syscall_error; \
>> + jr t9; \
>> + ENTRY(name) \
>> + .set noreorder; \
>> + .cpload t9; \
>> + li v0, SYS_ify(syscall_name); \
>> + syscall; \
>> + .set reorder; \
>> + bne a3, zero, 99b; \
>> +L(syse1):
>> +#else
>> +#define PSEUDO(name, syscall_name, args) \
>> + .set noreorder; \
>> + .align 2; \
>> + 99: j __syscall_error; \
>> + nop; \
>> + ENTRY(name) \
>> + .set noreorder; \
>> + li v0, SYS_ify(syscall_name); \
>> + syscall; \
>> + .set reorder; \
>> + bne a3, zero, 99b; \
>> +L(syse1):
>> +#endif
>> +
>> +/* We don't want the label for the error handler to be visible in the symbol
>> + table when we define it here. */
>> +#ifdef __PIC__
>> +# define SYSCALL_ERROR_LABEL 99b
>> #endif
>>
>> -#endif /* __UCLIBC_HAS_THREADS_NATIVE__ */
>> +#else /* ! __ASSEMBLER__ */
>> +
>> +/* Define a macro which expands into the inline wrapper code for a system
>> + call. */
>> +#undef INLINE_SYSCALL
>> +#define INLINE_SYSCALL(name, nr, args...) \
>> + ({ INTERNAL_SYSCALL_DECL(err); \
>> + long result_var = INTERNAL_SYSCALL (name, err, nr, args); \
>> + if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \
>> + { \
>> + __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
>> + result_var = -1L; \
>> + } \
>> + result_var; })
>> +
>> +#undef INTERNAL_SYSCALL_DECL
>> +#define INTERNAL_SYSCALL_DECL(err) long err
>> +
>> +#undef INTERNAL_SYSCALL_ERROR_P
>> +#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err))
>> +
>> +#undef INTERNAL_SYSCALL_ERRNO
>> +#define INTERNAL_SYSCALL_ERRNO(val, err) (val)
>> +
>> +#undef INTERNAL_SYSCALL
>> +#define INTERNAL_SYSCALL(name, err, nr, args...) \
>> + internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t", \
>> + "i" (SYS_ify (name)), err, args)
>> +
>> +#undef INTERNAL_SYSCALL_NCS
>> +#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
>> + internal_syscall##nr (= number, , "r" (__v0), err, args)
>> +#undef internal_syscall0
>> +#define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \
>> +({ \
>> + long _sys_result; \
>> + \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a3 __asm__("$7"); \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + ".set reorder" \
>> + : "=r" (__v0), "=r" (__a3) \
>> + : input \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall1
>> +#define internal_syscall1(ncs_init, cs_init, input, err, arg1) \
>> +({ \
>> + long _sys_result; \
>> + \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a3 __asm__("$7"); \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + ".set reorder" \
>> + : "=r" (__v0), "=r" (__a3) \
>> + : input, "r" (__a0) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall2
>> +#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \
>> +({ \
>> + long _sys_result; \
>> + \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a3 __asm__("$7"); \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "=r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall3
>> +#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3)\
>> +({ \
>> + long _sys_result; \
>> + \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a2 __asm__("$6") = (long) arg3; \
>> + register long __a3 __asm__("$7"); \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "=r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1), "r" (__a2) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall4
>> +#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4)\
>> +({ \
>> + long _sys_result; \
>> + \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a2 __asm__("$6") = (long) arg3; \
>> + register long __a3 __asm__("$7") = (long) arg4; \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "+r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1), "r" (__a2) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +/* We need to use a frame pointer for the functions in which we
>> + adjust $sp around the syscall, or debug information and unwind
>> + information will be $sp relative and thus wrong during the syscall. As
>> + of GCC 3.4.3, this is sufficient. */
>> +#define FORCE_FRAME_POINTER alloca (4)
>> +
>> +#undef internal_syscall5
>> +#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5)\
>> +({ \
>> + long _sys_result; \
>> + \
>> + FORCE_FRAME_POINTER; \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a2 __asm__("$6") = (long) arg3; \
>> + register long __a3 __asm__("$7") = (long) arg4; \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + "subu\t$29, 32\n\t" \
>> + "sw\t%6, 16($29)\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + "addiu\t$29, 32\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "+r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> + "r" ((long)arg5) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall6
>> +#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6)\
>> +({ \
>> + long _sys_result; \
>> + \
>> + FORCE_FRAME_POINTER; \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a2 __asm__("$6") = (long) arg3; \
>> + register long __a3 __asm__("$7") = (long) arg4; \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + "subu\t$29, 32\n\t" \
>> + "sw\t%6, 16($29)\n\t" \
>> + "sw\t%7, 20($29)\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + "addiu\t$29, 32\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "+r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> + "r" ((long)arg5), "r" ((long)arg6) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef internal_syscall7
>> +#define internal_syscall7(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
>> +({ \
>> + long _sys_result; \
>> + \
>> + FORCE_FRAME_POINTER; \
>> + { \
>> + register long __v0 __asm__("$2") ncs_init; \
>> + register long __a0 __asm__("$4") = (long) arg1; \
>> + register long __a1 __asm__("$5") = (long) arg2; \
>> + register long __a2 __asm__("$6") = (long) arg3; \
>> + register long __a3 __asm__("$7") = (long) arg4; \
>> + __asm__ volatile ( \
>> + ".set\tnoreorder\n\t" \
>> + "subu\t$29, 32\n\t" \
>> + "sw\t%6, 16($29)\n\t" \
>> + "sw\t%7, 20($29)\n\t" \
>> + "sw\t%8, 24($29)\n\t" \
>> + cs_init \
>> + "syscall\n\t" \
>> + "addiu\t$29, 32\n\t" \
>> + ".set\treorder" \
>> + : "=r" (__v0), "+r" (__a3) \
>> + : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> + "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7) \
>> + : __SYSCALL_CLOBBERS); \
>> + err = __a3; \
>> + _sys_result = __v0; \
>> + } \
>> + _sys_result; \
>> +})
>> +
>> +#undef __SYSCALL_CLOBBERS
>> +#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
>> + "$14", "$15", "$24", "$25", "memory"
>> +
>> +
>> +#endif /* __ASSEMBLER__ */
>> +#endif /* _LINUX_MIPS_SYSDEP_H */
>> diff --git a/libpthread/nptl/sysdeps/mips/sysdep.h b/libpthread/nptl/sysdeps/mips/sysdep.h
>> deleted file mode 100644
>> index b53c9a9..0000000
>> --- a/libpthread/nptl/sysdeps/mips/sysdep.h
>> +++ /dev/null
>> @@ -1,110 +0,0 @@
>> -/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003, 2004
>> - Free Software Foundation, Inc.
>> - This file is part of the GNU C Library.
>> - Contributed by Brendan Kehoe (brendan at zen.org).
>> -
>> - 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 <sgidefs.h>
>> -#include <common/sysdep.h>
>> -
>> -#ifdef __ASSEMBLER__
>> -
>> -#include <regdef.h>
>> -
>> -#define ENTRY(name) \
>> - .globl name; \
>> - .align 2; \
>> - .ent name,0; \
>> - name##:
>> -
>> -#undef END
>> -#define END(function) \
>> - .end function; \
>> - .size function,.-function
>> -
>> -#define ret j ra ; nop
>> -
>> -#undef PSEUDO_END
>> -#define PSEUDO_END(sym) .end sym; .size sym,.-sym
>> -
>> -#define PSEUDO_NOERRNO(name, syscall_name, args) \
>> - .align 2; \
>> - ENTRY(name) \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall
>> -
>> -#undef PSEUDO_END_NOERRNO
>> -#define PSEUDO_END_NOERRNO(sym) .end sym; .size sym,.-sym
>> -
>> -#define ret_NOERRNO ret
>> -
>> -#define PSEUDO_ERRVAL(name, syscall_name, args) \
>> - .align 2; \
>> - ENTRY(name) \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall
>> -
>> -#undef PSEUDO_END_ERRVAL
>> -#define PSEUDO_END_ERRVAL(sym) .end sym; .size sym,.-sym
>> -
>> -#define ret_ERRVAL ret
>> -
>> -#define r0 v0
>> -#define r1 v1
>> -/* The mips move insn is d,s. */
>> -#define MOVE(x,y) move y , x
>> -
>> -#if _MIPS_SIM == _ABIO32
>> -# define L(label) $L ## label
>> -#else
>> -# define L(label) .L ## label
>> -#endif
>> -
>> -/* Note that while it's better structurally, going back to call __syscall_error
>> - can make things confusing if you're debugging---it looks like it's jumping
>> - backwards into the previous fn. */
>> -#ifdef __PIC__
>> -#define PSEUDO(name, syscall_name, args) \
>> - .align 2; \
>> - 99: la t9,__syscall_error; \
>> - jr t9; \
>> - ENTRY(name) \
>> - .set noreorder; \
>> - .cpload t9; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, 99b; \
>> -L(syse1):
>> -#else
>> -#define PSEUDO(name, syscall_name, args) \
>> - .set noreorder; \
>> - .align 2; \
>> - 99: j __syscall_error; \
>> - nop; \
>> - ENTRY(name) \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, 99b; \
>> -L(syse1):
>> -#endif
>> -
>> -#endif
>> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep.h b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep.h
>> deleted file mode 100644
>> index bfaab1f..0000000
>> --- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/sysdep.h
>> +++ /dev/null
>> @@ -1,302 +0,0 @@
>> -/* Copyright (C) 2000, 2002, 2003, 2004, 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. */
>> -
>> -#ifndef _LINUX_MIPS_MIPS32_SYSDEP_H
>> -#define _LINUX_MIPS_MIPS32_SYSDEP_H 1
>> -
>> -#include <sys/syscall.h>
>> -
>> -/* There is some commonality. */
>> -#include <sysdeps/mips/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
>> -#ifdef __STDC__
>> -# define SYS_ify(syscall_name) __NR_##syscall_name
>> -#else
>> -# define SYS_ify(syscall_name) __NR_/**/syscall_name
>> -#endif
>> -
>> -#ifdef __ASSEMBLER__
>> -
>> -/* We don't want the label for the error handler to be visible in the symbol
>> - table when we define it here. */
>> -#ifdef __PIC__
>> -# define SYSCALL_ERROR_LABEL 99b
>> -#endif
>> -
>> -#else /* ! __ASSEMBLER__ */
>> -
>> -/* Define a macro which expands into the inline wrapper code for a system
>> - call. */
>> -#undef INLINE_SYSCALL
>> -#define INLINE_SYSCALL(name, nr, args...) \
>> - ({ INTERNAL_SYSCALL_DECL(err); \
>> - long result_var = INTERNAL_SYSCALL (name, err, nr, args); \
>> - if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \
>> - { \
>> - __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
>> - result_var = -1L; \
>> - } \
>> - result_var; })
>> -
>> -#undef INTERNAL_SYSCALL_DECL
>> -#define INTERNAL_SYSCALL_DECL(err) long err
>> -
>> -#undef INTERNAL_SYSCALL_ERROR_P
>> -#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err))
>> -
>> -#undef INTERNAL_SYSCALL_ERRNO
>> -#define INTERNAL_SYSCALL_ERRNO(val, err) (val)
>> -
>> -#undef INTERNAL_SYSCALL
>> -#define INTERNAL_SYSCALL(name, err, nr, args...) \
>> - internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t", \
>> - "i" (SYS_ify (name)), err, args)
>> -
>> -#undef INTERNAL_SYSCALL_NCS
>> -#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
>> - internal_syscall##nr (= number, , "r" (__v0), err, args)
>> -#undef internal_syscall0
>> -#define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \
>> -({ \
>> - long _sys_result; \
>> - \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a3 __asm__("$7"); \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - ".set reorder" \
>> - : "=r" (__v0), "=r" (__a3) \
>> - : input \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall1
>> -#define internal_syscall1(ncs_init, cs_init, input, err, arg1) \
>> -({ \
>> - long _sys_result; \
>> - \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a3 __asm__("$7"); \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - ".set reorder" \
>> - : "=r" (__v0), "=r" (__a3) \
>> - : input, "r" (__a0) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall2
>> -#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \
>> -({ \
>> - long _sys_result; \
>> - \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a3 __asm__("$7"); \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "=r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall3
>> -#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3)\
>> -({ \
>> - long _sys_result; \
>> - \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a2 __asm__("$6") = (long) arg3; \
>> - register long __a3 __asm__("$7"); \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "=r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1), "r" (__a2) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall4
>> -#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4)\
>> -({ \
>> - long _sys_result; \
>> - \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a2 __asm__("$6") = (long) arg3; \
>> - register long __a3 __asm__("$7") = (long) arg4; \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "+r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1), "r" (__a2) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -/* We need to use a frame pointer for the functions in which we
>> - adjust $sp around the syscall, or debug information and unwind
>> - information will be $sp relative and thus wrong during the syscall. As
>> - of GCC 3.4.3, this is sufficient. */
>> -#define FORCE_FRAME_POINTER alloca (4)
>> -
>> -#undef internal_syscall5
>> -#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5)\
>> -({ \
>> - long _sys_result; \
>> - \
>> - FORCE_FRAME_POINTER; \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a2 __asm__("$6") = (long) arg3; \
>> - register long __a3 __asm__("$7") = (long) arg4; \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - "subu\t$29, 32\n\t" \
>> - "sw\t%6, 16($29)\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - "addiu\t$29, 32\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "+r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> - "r" ((long)arg5) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall6
>> -#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6)\
>> -({ \
>> - long _sys_result; \
>> - \
>> - FORCE_FRAME_POINTER; \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a2 __asm__("$6") = (long) arg3; \
>> - register long __a3 __asm__("$7") = (long) arg4; \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - "subu\t$29, 32\n\t" \
>> - "sw\t%6, 16($29)\n\t" \
>> - "sw\t%7, 20($29)\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - "addiu\t$29, 32\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "+r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> - "r" ((long)arg5), "r" ((long)arg6) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef internal_syscall7
>> -#define internal_syscall7(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
>> -({ \
>> - long _sys_result; \
>> - \
>> - FORCE_FRAME_POINTER; \
>> - { \
>> - register long __v0 __asm__("$2") ncs_init; \
>> - register long __a0 __asm__("$4") = (long) arg1; \
>> - register long __a1 __asm__("$5") = (long) arg2; \
>> - register long __a2 __asm__("$6") = (long) arg3; \
>> - register long __a3 __asm__("$7") = (long) arg4; \
>> - __asm__ volatile ( \
>> - ".set\tnoreorder\n\t" \
>> - "subu\t$29, 32\n\t" \
>> - "sw\t%6, 16($29)\n\t" \
>> - "sw\t%7, 20($29)\n\t" \
>> - "sw\t%8, 24($29)\n\t" \
>> - cs_init \
>> - "syscall\n\t" \
>> - "addiu\t$29, 32\n\t" \
>> - ".set\treorder" \
>> - : "=r" (__v0), "+r" (__a3) \
>> - : input, "r" (__a0), "r" (__a1), "r" (__a2), \
>> - "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7) \
>> - : __SYSCALL_CLOBBERS); \
>> - err = __a3; \
>> - _sys_result = __v0; \
>> - } \
>> - _sys_result; \
>> -})
>> -
>> -#undef __SYSCALL_CLOBBERS
>> -#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
>> - "$14", "$15", "$24", "$25", "memory"
>> -
>> -#endif /* __ASSEMBLER__ */
>> -
>> -#endif /* sysdeps/unix/sysv/linux/mips/sysdep.h */
>
> _______________________________________________
> uClibc-cvs mailing list
> uClibc-cvs at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc-cvs
>
More information about the uClibc
mailing list