[prev in list] [next in list] [prev in thread] [next in thread]
List: uclibc-cvs
Subject: [git commit nptl] mips/sysdep.h: Unify mips sysdep.h
From: carmelo.amoroso () st ! com (Carmelo AMOROSO)
Date: 2010-02-12 13:47:29
Message-ID: 4B755BF1.9060308 () st ! com
[Download RAW message or body]
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.
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 */
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic