aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-09-06 00:12:18 -0400
committerUlrich Drepper <drepper@gmail.com>2011-09-06 00:12:18 -0400
commitef60624956e93df1da329a48570776ed963b1916 (patch)
tree21743f4149f142ca1e4614e1f59c929573745024 /sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S
parent6585cb60ee7aafc3301c402dda12d6771dfb7fa3 (diff)
downloadglibc-ef60624956e93df1da329a48570776ed963b1916.tar
glibc-ef60624956e93df1da329a48570776ed963b1916.tar.gz
glibc-ef60624956e93df1da329a48570776ed963b1916.tar.bz2
glibc-ef60624956e93df1da329a48570776ed963b1916.zip
Prefer real syscalls instead of vsyscalls on x86-64 outside libc.so
Diffstat (limited to 'sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S')
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S19
1 files changed, 18 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S b/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S
index 8ec7d3fcd2..246c955042 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S
+++ b/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S
@@ -20,6 +20,7 @@
#include <tls.h>
#define _ERRNO_H 1
#include <bits/errno.h>
+#include <kernel-features.h>
/* For the calculation see asm/vsyscall.h. */
#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800
@@ -38,10 +39,26 @@ ENTRY (sched_getcpu)
#ifdef SHARED
movq __vdso_getcpu(%rip), %rax
PTR_DEMANGLE (%rax)
+ callq *%rax
#else
+# ifdef __NR_getcpu
+ movl $__NR_getcpu, %eax
+ syscall
+# ifndef __ASSUME_GETCPU_SYSCALL
+ cmpq $-ENOSYS, %rax
+ jne 1f
+# endif
+# endif
+# ifndef __ASSUME_GETCPU_SYSCALL
movq $VSYSCALL_ADDR_vgetcpu, %rax
-#endif
callq *%rax
+1:
+# else
+# ifndef __NR_getcpu
+# error "cannot happen"
+# endif
+# endif
+#endif
cmpq $-4095, %rax
jae SYSCALL_ERROR_LABEL