diff options
author | Richard Henderson <rth@twiddle.net> | 2014-05-17 11:25:19 -0700 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2014-05-17 11:25:19 -0700 |
commit | e184a918bb5866a6488257d37ecc4e4ff747b7b7 (patch) | |
tree | 136e6a73de4ccd1ed733602a11af223545840902 /sysdeps | |
parent | ab21431318d99c94e644606dee1e6a4545d98007 (diff) | |
download | glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.tar glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.tar.gz glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.tar.bz2 glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.zip |
alpha: Create __syscall_nocancel entry points
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h | 24 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/sigsuspend.S | 13 |
2 files changed, 16 insertions, 21 deletions
diff --git a/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h index 610b583b4a..69809bc9e1 100644 --- a/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h +++ b/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h @@ -28,24 +28,32 @@ # undef PSEUDO # define PSEUDO(name, syscall_name, args) \ - .globl name; \ + .globl __##syscall_name##_nocancel; \ + .type __##syscall_name##_nocancel, @function; \ + .usepv __##syscall_name##_nocancel, std; \ .align 4; \ - .type name, @function; \ - .usepv name, std; \ cfi_startproc; \ -__LABEL(name) \ +__LABEL(__##syscall_name##_nocancel) \ ldgp gp, 0(pv); \ PSEUDO_PROF; \ - PSEUDO_PREPARE_ARGS \ - SINGLE_THREAD_P(t0); \ - bne t0, $pseudo_cancel; \ +__LABEL($pseudo_nocancel) \ + PSEUDO_PREPARE_ARGS; \ lda v0, SYS_ify(syscall_name); \ call_pal PAL_callsys; \ bne a3, SYSCALL_ERROR_LABEL; \ __LABEL($pseudo_ret) \ .subsection 2; \ + .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \ + .globl name; \ + .type name, @function; \ + .usepv name, std; \ + .align 4; \ cfi_startproc; \ -__LABEL($pseudo_cancel) \ +__LABEL(name) \ + ldgp gp, 0(pv); \ + PSEUDO_PROF; \ + SINGLE_THREAD_P(t0); \ + beq t0, $pseudo_nocancel; \ subq sp, 64, sp; \ cfi_def_cfa_offset(64); \ stq ra, 0(sp); \ diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S index aa5e6c67d5..8a6816ec82 100644 --- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S +++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S @@ -19,19 +19,6 @@ /* sigsuspend is a special syscall since it needs to dereference the sigset. This will have to change when we have more than 64 signals. */ -#ifndef NO_CANCELLATION -#include <sysdep.h> - -#undef PSEUDO_PREPARE_ARGS -#define PSEUDO_PREPARE_ARGS ldq a0, 0(a0); - -PSEUDO(__sigsuspend_nocancel, sigsuspend, 1) - ret -/* Use END, not PSEUDO_END, so that we don't issue two $syscall_error - symbols; we'll jump into __sigsuspend for the error case. */ -END(__sigsuspend_nocancel) -#endif /* NO_CANCELLATION */ - #include <sysdep-cancel.h> #undef PSEUDO_PREPARE_ARGS |