about summary refs log tree commit diff
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.gz
glibc-ef60624956e93df1da329a48570776ed963b1916.tar.xz
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