]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use getcpu definition from vDSO on x86-64
authorUlrich Drepper <drepper@gmail.com>
Fri, 27 May 2011 20:09:52 +0000 (16:09 -0400)
committerUlrich Drepper <drepper@gmail.com>
Fri, 27 May 2011 20:09:52 +0000 (16:09 -0400)
ChangeLog
NEWS
sysdeps/unix/sysv/linux/x86_64/init-first.c
sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S

index 34df6baeae3212abb9102c852e42ba668e3ff896..5e5261728f7076c206c3dfa54499c955d55cb6e6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2011-05-27  Ulrich Drepper  <drepper@gmail.com>
 
+       [BZ #12813]
+       * sysdeps/unix/sysv/linux/x86_64/init-first.c (__vdso_getcpu):
+       Retrieve getcpu symbol from vDSO.  Substitute with vsyscall if not
+       available.
+       * sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S [SHARED]: Use
+       __vdso_getcpu.
+
        [BZ #12814]
        * iconvdata/Makefile (tests): Add bug-iconv9.
        * iconvdata/bug-iconv9.c: New file.
diff --git a/NEWS b/NEWS
index 2cdb0cc42528e65e490b602512cb80c036bc68e1..d899685be1258320f44cb0eab9215fded9ab567a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,7 +17,7 @@ Version 2.14
   12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626,
   12631, 12650, 12653, 12655, 12660, 12671, 12681, 12685, 12711, 12713,
   12714, 12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12777,
-  12782, 12788, 12792, 12795, 12814
+  12782, 12788, 12792, 12795, 12813, 12814
 
 * The RPC implementation in libc is obsoleted.  Old programs keep working
   but new programs cannot be linked with the routines in libc anymore.
index ead7dbcc38b5306531c2ae361689aa4171b057bd..23934fc857fef6bc7db9d6d62575be4c001d6daf 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2007, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -26,6 +26,8 @@ long int (*__vdso_clock_gettime) (clockid_t, struct timespec *)
   __attribute__ ((nocommon));
 strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden)
 
+long int (*__vdso_getcpu) (unsigned *, unsigned *, void *);
+
 
 static inline void
 _libc_vdso_platform_setup (void)
@@ -43,6 +45,14 @@ _libc_vdso_platform_setup (void)
   p = _dl_vdso_vsym ("clock_gettime", &linux26);
   PTR_MANGLE (p);
   __GI___vdso_clock_gettime = p;
+
+  p = _dl_vdso_vsym ("getcpu", &linux26);
+  /* If the vDSO is not available we fall back on the old vsyscall.  */
+#define VSYSCALL_ADDR_vgetcpu  0xffffffffff600800
+  if (p == NULL)
+    p = (void *) VSYSCALL_ADDR_vgetcpu;
+  PTR_MANGLE (p);
+  __vdso_getcpu = p;
 }
 
 # define VDSO_SETUP _libc_vdso_platform_setup
index a95099062795561d994a7371aca6c3d5b0c280a3..8ec7d3fcd258a9e861ebfaa1096a54b4af0b4583 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2007, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -35,7 +35,12 @@ ENTRY (sched_getcpu)
        movl    $VGETCPU_CACHE_OFFSET, %edx
        addq    %fs:0, %rdx
 
+#ifdef SHARED
+       movq    __vdso_getcpu(%rip), %rax
+       PTR_DEMANGLE (%rax)
+#else
        movq    $VSYSCALL_ADDR_vgetcpu, %rax
+#endif
        callq   *%rax
 
        cmpq    $-4095, %rax