Use getcpu definition from vDSO on x86-64

This commit is contained in:
Ulrich Drepper 2011-05-27 16:09:52 -04:00
parent fdc2fefe46
commit a8509ca540
4 changed files with 25 additions and 3 deletions

View File

@ -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.

2
NEWS
View File

@ -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.

View 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

View 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