From: Ulrich Drepper Date: Fri, 27 May 2011 20:09:52 +0000 (-0400) Subject: Use getcpu definition from vDSO on x86-64 X-Git-Tag: upstream/2.30~12353 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8509ca540427502bd955f35296ff7b727c7a8a1;p=external%2Fglibc.git Use getcpu definition from vDSO on x86-64 --- diff --git a/ChangeLog b/ChangeLog index 34df6ba..5e52617 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-05-27 Ulrich Drepper + [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 2cdb0cc..d899685 100644 --- 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. diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c index ead7dbc..23934fc 100644 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c @@ -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 diff --git a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S b/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S index a950990..8ec7d3f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S +++ b/sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S @@ -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