This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
alpha syscall improvements
- From: Richard Henderson <rth at redhat dot com>
- To: Ulrich Drepper <drepper at redhat dot com>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Thu, 9 Jan 2003 18:08:49 -0800
- Subject: alpha syscall improvements
2002-01-09 Richard Henderson <rth@redhat.com>
* sysdeps/unix/alpha/sysdep.S: Use correct definition of errno
for NOT_IN_libc.
* sysdeps/unix/sysv/linux/alpha/sysdep.h: Move inline syscall bits...
* sysdeps/unix/alpha/sysdep.h: ... here.
(PSEUDO_LOADGP): Remove.
(PSEUDO_PROLOGUE): Load GP in non-pic case.
(SYSCALL_ERROR_LABEL): New.
(PSEUDO): Use it in error branch.
(PSEUDO_END): Add $syscall_error label.
linuxthreads/
* sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Assume only
ret follows pseudo, and thus avoid branch-to-branch in cancel
case. Use SYSCALL_ERROR_LABEL.
Index: linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
===================================================================
RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h,v
retrieving revision 1.2
diff -c -p -d -r1.2 sysdep-cancel.h
*** linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 7 Jan 2003 00:45:42 -0000 1.2
--- linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 10 Jan 2003 01:49:37 -0000
***************
*** 33,38 ****
--- 33,41 ----
# define PSEUDO_PROF
# endif
+ /* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
+ besides "ret". */
+
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.globl name; \
*************** __LABEL(name) \
*** 47,53 ****
bne t0, $pseudo_cancel; \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
! bne a3, $syscall_error; \
__LABEL($pseudo_ret) \
.subsection 2; \
__LABEL($pseudo_cancel) \
--- 50,56 ----
bne t0, $pseudo_cancel; \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
! bne a3, SYSCALL_ERROR_LABEL; \
__LABEL($pseudo_ret) \
.subsection 2; \
__LABEL($pseudo_cancel) \
*************** __LABEL($pseudo_cancel) \
*** 59,71 ****
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
stq v0, 8(sp); \
! stq a3, 16(sp); \
CDISABLE; \
ldq ra, 0(sp); \
ldq v0, 8(sp); \
- ldq a3, 16(sp); \
addq sp, 64, sp; \
- beq a3, $pseudo_ret; \
__LABEL($syscall_error) \
SYSCALL_ERROR_HANDLER; \
END(name); \
--- 62,78 ----
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
stq v0, 8(sp); \
! bne a3, $multi_error; \
! CDISABLE; \
! ldq ra, 0(sp); \
! ldq v0, 8(sp); \
! addq sp, 64, sp; \
! ret; \
! __LABEL($multi_error) \
CDISABLE; \
ldq ra, 0(sp); \
ldq v0, 8(sp); \
addq sp, 64, sp; \
__LABEL($syscall_error) \
SYSCALL_ERROR_HANDLER; \
END(name); \
Index: sysdeps/unix/alpha/sysdep.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/alpha/sysdep.S,v
retrieving revision 1.14
diff -c -p -d -r1.14 sysdep.S
*** sysdeps/unix/alpha/sysdep.S 28 Nov 2002 22:47:04 -0000 1.14
--- sysdeps/unix/alpha/sysdep.S 10 Jan 2003 01:49:37 -0000
*************** __syscall_error:
*** 47,57 ****
#if defined(_LIBC_REENTRANT) && USE___THREAD
LOADGP
PROLOGUE
mov v0, t0
call_pal PAL_rduniq
! ldq t1, __libc_errno(gp) !gottprel
addq v0, t1, v0
stl t0, 0(v0)
lda v0, -1
--- 47,63 ----
#if defined(_LIBC_REENTRANT) && USE___THREAD
+ #ifndef NOT_IN_libc
+ # define SYSCALL_ERROR_ERRNO __libc_errno
+ #else
+ # define SYSCALL_ERROR_ERRNO errno
+ #endif
+
LOADGP
PROLOGUE
mov v0, t0
call_pal PAL_rduniq
! ldq t1, SYSCALL_ERROR_ERRNO(gp) !gottprel
addq v0, t1, v0
stl t0, 0(v0)
lda v0, -1
Index: sysdeps/unix/alpha/sysdep.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/alpha/sysdep.h,v
retrieving revision 1.13
diff -c -p -d -r1.13 sysdep.h
*** sysdeps/unix/alpha/sysdep.h 7 Jan 2003 00:47:52 -0000 1.13
--- sysdeps/unix/alpha/sysdep.h 10 Jan 2003 01:49:37 -0000
***************
*** 58,66 ****
#undef END
#define END(sym) .end sym
- /* Note that PSEUDO/PSEUDO_END use label number 1996---do not use a
- label of that number between those two macros! */
-
#ifdef PROF
# define PSEUDO_PROLOGUE \
.frame sp, 0, ra; \
--- 58,63 ----
***************
*** 70,97 ****
jsr AT,(AT),_mcount; \
.set at; \
.prologue 1
! # define PSEUDO_LOADGP
! #else
# define PSEUDO_PROLOGUE \
.frame sp, 0, ra; \
.prologue 0
! # define PSEUDO_LOADGP \
! br gp, 2f; \
! 2: ldgp gp, 0(gp)
#endif /* PROF */
#if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
stl v0, errno(gp) !gprel; \
lda v0, -1; \
ret
#else
# define SYSCALL_ERROR_HANDLER \
jmp $31, __syscall_error
#endif /* RTLD_PRIVATE_ERRNO */
! #if defined(PIC) && !RTLD_PRIVATE_ERRNO
! # define PSEUDO(name, syscall_name, args) \
.globl name; \
.align 4; \
.ent name,0; \
--- 67,104 ----
jsr AT,(AT),_mcount; \
.set at; \
.prologue 1
! #elif defined PIC
# define PSEUDO_PROLOGUE \
.frame sp, 0, ra; \
.prologue 0
! #else
! # define PSEUDO_PROLOGUE \
! .frame sp, 0, ra; \
! ldgp gp,0(pv); \
! .prologue 1
#endif /* PROF */
#if RTLD_PRIVATE_ERRNO
+ # define SYSCALL_ERROR_LABEL $syscall_error
# define SYSCALL_ERROR_HANDLER \
stl v0, errno(gp) !gprel; \
lda v0, -1; \
ret
+ #elif defined(PIC)
+ # define SYSCALL_ERROR_LABEL __syscall_error
+ # define SYSCALL_ERROR_HANDLER \
+ br $31, __syscall_error !samegp
#else
+ # define SYSCALL_ERROR_LABEL $syscall_error
# define SYSCALL_ERROR_HANDLER \
jmp $31, __syscall_error
#endif /* RTLD_PRIVATE_ERRNO */
! /* Overridden by specific syscalls. */
! #undef PSEUDO_PREPARE_ARGS
! #define PSEUDO_PREPARE_ARGS /* Nothing. */
!
! #define PSEUDO(name, syscall_name, args) \
.globl name; \
.align 4; \
.ent name,0; \
*************** __LABEL(name) \
*** 100,135 ****
PSEUDO_PREPARE_ARGS \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
! bne a3, __syscall_error !samegp; \
! 3:
! # undef PSEUDO_END
# define PSEUDO_END(sym) END(sym)
#else
- # define PSEUDO(name, syscall_name, args) \
- .globl name; \
- .align 4; \
- .ent name,0; \
- __LABEL(name) \
- PSEUDO_PREPARE_ARGS \
- lda v0, SYS_ify(syscall_name); \
- call_pal PAL_callsys; \
- bne a3, 1996f; \
- 3:
-
- # undef PSEUDO_END
# define PSEUDO_END(sym) \
! 1996: \
! PSEUDO_LOADGP; \
SYSCALL_ERROR_HANDLER; \
END(sym)
! #endif /* PIC && !RTLD_PRIVATE_ERRNO */
!
! #undef PSEUDO_PREPARE_ARGS
! #define PSEUDO_PREPARE_ARGS /* Nothing. */
#define r0 v0
#define r1 a4
#define MOVE(x,y) mov x,y
#endif /* ASSEMBLER */
--- 107,338 ----
PSEUDO_PREPARE_ARGS \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
! bne a3, SYSCALL_ERROR_LABEL
!
! #undef PSEUDO_END
! #if defined(PIC) && !RTLD_PRIVATE_ERRNO
# define PSEUDO_END(sym) END(sym)
#else
# define PSEUDO_END(sym) \
! $syscall_error: \
SYSCALL_ERROR_HANDLER; \
END(sym)
! #endif
#define r0 v0
#define r1 a4
#define MOVE(x,y) mov x,y
+
+ #else /* !ASSEMBLER */
+
+ /* ??? Linux needs to be able to override INLINE_SYSCALL for one
+ particular special case. Make this easy. */
+
+ #define INLINE_SYSCALL(name, nr, args...) \
+ INLINE_SYSCALL1(name, nr, args)
+
+ #define INLINE_SYSCALL1(name, nr, args...) \
+ ({ \
+ long _sc_ret, _sc_err; \
+ inline_syscall##nr(name, args); \
+ if (_sc_err) \
+ { \
+ __set_errno (_sc_ret); \
+ _sc_ret = -1L; \
+ } \
+ _sc_ret; \
+ })
+
+ #define INTERNAL_SYSCALL(name, err_out, nr, args...) \
+ INTERNAL_SYSCALL1(name, err_out, nr, args)
+
+ #define INTERNAL_SYSCALL1(name, err_out, nr, args...) \
+ ({ \
+ long _sc_ret, _sc_err; \
+ inline_syscall##nr(name, args); \
+ err_out = _sc_err; \
+ _sc_ret; \
+ })
+
+ #define INTERNAL_SYSCALL_DECL(err) long int err
+ #define INTERNAL_SYSCALL_ERROR_P(val, err) err
+ #define INTERNAL_SYSCALL_ERRNO(val, err) val
+
+ #define inline_syscall_clobbers \
+ "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", \
+ "$22", "$23", "$24", "$25", "$27", "$28", "memory"
+
+ /* If TLS is in use, we have a conflict between the PAL_rduniq primitive,
+ as modeled within GCC, and explicit use of the R0 register. If we use
+ the register via the asm, the scheduler may place the PAL_rduniq insn
+ before we've copied the data from R0 into _sc_ret. If this happens
+ we'll get a reload abort, since R0 is live at the same time it is
+ needed for the PAL_rduniq.
+
+ Solve this by using the "v" constraint instead of an asm for the syscall
+ output. We don't do this unconditionally to allow compilation with
+ older compilers. */
+
+ #ifdef USE_TLS
+ #define inline_syscall_r0_asm
+ #define inline_syscall_r0_out_constraint "=v"
+ #else
+ #define inline_syscall_r0_asm __asm__("$0")
+ #define inline_syscall_r0_out_constraint "=r"
+ #endif
+
+ /* It is moderately important optimization-wise to limit the lifetime
+ of the hard-register variables as much as possible. Thus we copy
+ in/out as close to the asm as possible. */
+
+ #define inline_syscall0(name, args...) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_19 __asm__("$19"); \
+ \
+ _sc_0 = __NR_##name; \
+ __asm__("callsys # %0 %1 <= %2" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19) \
+ : "0"(_sc_0) \
+ : inline_syscall_clobbers, \
+ "$16", "$17", "$18", "$20", "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall1(name,arg1) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_19 __asm__("$19"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ __asm__("callsys # %0 %1 <= %2 %3" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19), "=r"(_sc_16) \
+ : "0"(_sc_0), "2"(_sc_16) \
+ : inline_syscall_clobbers, \
+ "$17", "$18", "$20", "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall2(name,arg1,arg2) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_17 __asm__("$17"); \
+ register long _sc_19 __asm__("$19"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ _sc_17 = (long) (arg2); \
+ __asm__("callsys # %0 %1 <= %2 %3 %4" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17) \
+ : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17) \
+ : inline_syscall_clobbers, \
+ "$18", "$20", "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall3(name,arg1,arg2,arg3) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_17 __asm__("$17"); \
+ register long _sc_18 __asm__("$18"); \
+ register long _sc_19 __asm__("$19"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ _sc_17 = (long) (arg2); \
+ _sc_18 = (long) (arg3); \
+ __asm__("callsys # %0 %1 <= %2 %3 %4 %5" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
+ "=r"(_sc_18) \
+ : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
+ "4"(_sc_18) \
+ : inline_syscall_clobbers, "$20", "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall4(name,arg1,arg2,arg3,arg4) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_17 __asm__("$17"); \
+ register long _sc_18 __asm__("$18"); \
+ register long _sc_19 __asm__("$19"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ _sc_17 = (long) (arg2); \
+ _sc_18 = (long) (arg3); \
+ _sc_19 = (long) (arg4); \
+ __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
+ "=r"(_sc_18) \
+ : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
+ "4"(_sc_18), "1"(_sc_19) \
+ : inline_syscall_clobbers, "$20", "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_17 __asm__("$17"); \
+ register long _sc_18 __asm__("$18"); \
+ register long _sc_19 __asm__("$19"); \
+ register long _sc_20 __asm__("$20"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ _sc_17 = (long) (arg2); \
+ _sc_18 = (long) (arg3); \
+ _sc_19 = (long) (arg4); \
+ _sc_20 = (long) (arg5); \
+ __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
+ "=r"(_sc_18), "=r"(_sc_20) \
+ : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
+ "4"(_sc_18), "1"(_sc_19), "5"(_sc_20) \
+ : inline_syscall_clobbers, "$21"); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
+
+ #define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
+ { \
+ register long _sc_0 inline_syscall_r0_asm; \
+ register long _sc_16 __asm__("$16"); \
+ register long _sc_17 __asm__("$17"); \
+ register long _sc_18 __asm__("$18"); \
+ register long _sc_19 __asm__("$19"); \
+ register long _sc_20 __asm__("$20"); \
+ register long _sc_21 __asm__("$21"); \
+ \
+ _sc_0 = __NR_##name; \
+ _sc_16 = (long) (arg1); \
+ _sc_17 = (long) (arg2); \
+ _sc_18 = (long) (arg3); \
+ _sc_19 = (long) (arg4); \
+ _sc_20 = (long) (arg5); \
+ _sc_21 = (long) (arg6); \
+ __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7 %8" \
+ : inline_syscall_r0_out_constraint (_sc_0), \
+ "=r"(_sc_19) "=r"(_sc_16), "=r"(_sc_17), \
+ "=r"(_sc_18), "=r"(_sc_20), "=r"(_sc_21) \
+ : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
+ "4"(_sc_18), "1"(_sc_19), "5"(_sc_20), \
+ "6"(_sc_21) \
+ : inline_syscall_clobbers); \
+ _sc_ret = _sc_0, _sc_err = _sc_19; \
+ }
#endif /* ASSEMBLER */
Index: sysdeps/unix/sysv/linux/alpha/sysdep.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h,v
retrieving revision 1.12
diff -c -p -d -r1.12 sysdep.h
*** sysdeps/unix/sysv/linux/alpha/sysdep.h 6 Jan 2003 23:52:06 -0000 1.12
--- sysdeps/unix/sysv/linux/alpha/sysdep.h 10 Jan 2003 01:49:37 -0000
***************
*** 72,263 ****
? __syscall_##name(args) \
: INLINE_SYSCALL1(name, nr, args))
! #define INLINE_SYSCALL1(name, nr, args...) \
! ({ \
! long _sc_ret, _sc_err; \
! inline_syscall##nr(name, args); \
! if (_sc_err) \
! { \
! __set_errno (_sc_ret); \
! _sc_ret = -1L; \
! } \
! _sc_ret; \
})
-
- #define inline_syscall_clobbers \
- "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", \
- "$22", "$23", "$24", "$25", "$27", "$28", "memory"
-
- /* If TLS is in use, we have a conflict between the PAL_rduniq primitive,
- as modeled within GCC, and explicit use of the R0 register. If we use
- the register via the asm, the scheduler may place the PAL_rduniq insn
- before we've copied the data from R0 into _sc_ret. If this happens
- we'll get a reload abort, since R0 is live at the same time it is
- needed for the PAL_rduniq.
-
- Solve this by using the "v" constraint instead of an asm for the syscall
- output. We don't do this unconditionally to allow compilation with
- older compilers. */
-
- #ifdef USE_TLS
- #define inline_syscall_r0_asm
- #define inline_syscall_r0_out_constraint "=v"
- #else
- #define inline_syscall_r0_asm __asm__("$0")
- #define inline_syscall_r0_out_constraint "=r"
- #endif
-
- /* It is moderately important optimization-wise to limit the lifetime
- of the hard-register variables as much as possible. Thus we copy
- in/out as close to the asm as possible. */
-
- #define inline_syscall0(name, args...) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_19 __asm__("$19"); \
- \
- _sc_0 = __NR_##name; \
- __asm__("callsys # %0 %1 <= %2" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19) \
- : "0"(_sc_0) \
- : inline_syscall_clobbers, \
- "$16", "$17", "$18", "$20", "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall1(name,arg1) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_19 __asm__("$19"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- __asm__("callsys # %0 %1 <= %2 %3" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19), "=r"(_sc_16) \
- : "0"(_sc_0), "2"(_sc_16) \
- : inline_syscall_clobbers, \
- "$17", "$18", "$20", "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall2(name,arg1,arg2) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_17 __asm__("$17"); \
- register long _sc_19 __asm__("$19"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- _sc_17 = (long) (arg2); \
- __asm__("callsys # %0 %1 <= %2 %3 %4" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17) \
- : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17) \
- : inline_syscall_clobbers, \
- "$18", "$20", "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall3(name,arg1,arg2,arg3) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_17 __asm__("$17"); \
- register long _sc_18 __asm__("$18"); \
- register long _sc_19 __asm__("$19"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- _sc_17 = (long) (arg2); \
- _sc_18 = (long) (arg3); \
- __asm__("callsys # %0 %1 <= %2 %3 %4 %5" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
- "=r"(_sc_18) \
- : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
- "4"(_sc_18) \
- : inline_syscall_clobbers, "$20", "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall4(name,arg1,arg2,arg3,arg4) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_17 __asm__("$17"); \
- register long _sc_18 __asm__("$18"); \
- register long _sc_19 __asm__("$19"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- _sc_17 = (long) (arg2); \
- _sc_18 = (long) (arg3); \
- _sc_19 = (long) (arg4); \
- __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
- "=r"(_sc_18) \
- : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
- "4"(_sc_18), "1"(_sc_19) \
- : inline_syscall_clobbers, "$20", "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_17 __asm__("$17"); \
- register long _sc_18 __asm__("$18"); \
- register long _sc_19 __asm__("$19"); \
- register long _sc_20 __asm__("$20"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- _sc_17 = (long) (arg2); \
- _sc_18 = (long) (arg3); \
- _sc_19 = (long) (arg4); \
- _sc_20 = (long) (arg5); \
- __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19), "=r"(_sc_16), "=r"(_sc_17), \
- "=r"(_sc_18), "=r"(_sc_20) \
- : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
- "4"(_sc_18), "1"(_sc_19), "5"(_sc_20) \
- : inline_syscall_clobbers, "$21"); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
-
- #define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
- { \
- register long _sc_0 inline_syscall_r0_asm; \
- register long _sc_16 __asm__("$16"); \
- register long _sc_17 __asm__("$17"); \
- register long _sc_18 __asm__("$18"); \
- register long _sc_19 __asm__("$19"); \
- register long _sc_20 __asm__("$20"); \
- register long _sc_21 __asm__("$21"); \
- \
- _sc_0 = __NR_##name; \
- _sc_16 = (long) (arg1); \
- _sc_17 = (long) (arg2); \
- _sc_18 = (long) (arg3); \
- _sc_19 = (long) (arg4); \
- _sc_20 = (long) (arg5); \
- _sc_21 = (long) (arg6); \
- __asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7 %8" \
- : inline_syscall_r0_out_constraint (_sc_0), \
- "=r"(_sc_19) "=r"(_sc_16), "=r"(_sc_17), \
- "=r"(_sc_18), "=r"(_sc_20), "=r"(_sc_21) \
- : "0"(_sc_0), "2"(_sc_16), "3"(_sc_17), \
- "4"(_sc_18), "1"(_sc_19), "5"(_sc_20), \
- "6"(_sc_21) \
- : inline_syscall_clobbers); \
- _sc_ret = _sc_0, _sc_err = _sc_19; \
- }
#endif /* _LINUX_ALPHA_SYSDEP_H */
--- 72,82 ----
? __syscall_##name(args) \
: INLINE_SYSCALL1(name, nr, args))
! #undef INTERNAL_SYSCALL
! #define INTERNAL_SYSCALL(name, err_out, nr, args...) \
! ({ \
! extern char ChEcK[__NR_##name == __NR_rt_sigaction ? -1 : 1]; \
! INTERNAL_SYSCALL1(name, err_out, nr, args); \
})
#endif /* _LINUX_ALPHA_SYSDEP_H */