aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2014-05-17 11:25:19 -0700
committerRichard Henderson <rth@twiddle.net>2014-05-17 11:25:19 -0700
commite184a918bb5866a6488257d37ecc4e4ff747b7b7 (patch)
tree136e6a73de4ccd1ed733602a11af223545840902 /sysdeps/unix/sysv
parentab21431318d99c94e644606dee1e6a4545d98007 (diff)
downloadglibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.zip
glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.tar.gz
glibc-e184a918bb5866a6488257d37ecc4e4ff747b7b7.tar.bz2
alpha: Create __syscall_nocancel entry points
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h24
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigsuspend.S13
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 610b583..69809bc 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 aa5e6c6..8a6816e 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