From patchwork Wed Nov 5 12:51:04 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 406981 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 75478140079 for ; Wed, 5 Nov 2014 23:51:32 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; q=dns; s=default; b=BkOYllstLveTl1MjvsgKlS/mWY6ef9kU/eJ9Bp1iuBN BMHAz8NVzsmT8OzlSqUNET9OUlnNHLFWLsTEhpMCH4e57+OByT/QhQLLL0kSXj8Q XpYmchTgumOp0gWtzQWIAi84OkxQVPMI0H0gr5ppPeHj2MW+45xJYdxJ0CBdRP4k = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; s=default; bh=hHy8FGUvZ3+TkVIKgkcxAZT3R20=; b=ZNwNP1yPzmNLydGdn l2RtQ+uDTJX/qRQe9KuPeLA8a4fvtMvrdjw6xzzMmXBqtWvAeovuvo6+0fVTRfrW FPNeMu0OEeoPXUYtZ4XacUPGvOC6y75Ba7XwhUwthfGO0CIs0MrmS4UY1mokpRK0 v0glvO9vgyAQaNHqvmqLmWConI= Received: (qmail 24576 invoked by alias); 5 Nov 2014 12:51:25 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 24562 invoked by uid 89); 5 Nov 2014 12:51:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: e24smtp03.br.ibm.com Message-ID: <545A1D38.8030700@linux.vnet.ibm.com> Date: Wed, 05 Nov 2014 10:51:04 -0200 From: Adhemerval Zanella User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: libc-alpha@sourceware.org Subject: Re: [PATCH v2] Add x86 32 bit vDSO time function support References: <5436D48C.2090509@linux.vnet.ibm.com> <5436F50C.9070002@codesourcery.com> <5457E5D5.6000103@linux.vnet.ibm.com> <54581516.9010908@codesourcery.com> In-Reply-To: <54581516.9010908@codesourcery.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14110512-0009-0000-0000-00000235B0AD On 03-11-2014 21:51, Nathan Lynch wrote: >> i386 does not define HAVE_CLOCK_GETTIME_VSYSCALL and thus: >> >> sysdeps/unix/sysv/linux/clock_gettime.c: >> >> 26: # define INTERNAL_VSYSCALL INTERNAL_SYSCALL >> >> and then if INTERNAL_GETTIME is not defined, it will as: >> >> 37 #ifndef INTERNAL_GETTIME >> 38 # define INTERNAL_GETTIME(id, tp) \ >> 39 INTERNAL_VSYSCALL (clock_gettime, err, 2, id, tp) >> 40 #endif >> >> And without proper set the PTR_DEMANGLE is not called either. > I think my point might be better expressed as: why is INTERNAL_GETTIME > defined in linux/clock_gettime.c at all? It is not used in the > clock_gettime implementation. > > The only use in glibc of a macro by that name is in > linux/timespec_get.c, and the arch can override it in its own > timespec_get.c (as x86_64 currently does). > I see your point and I removed its definition now for x86. Below it's the revised patchset. Tested on x86_64 and i386 on a 3.5.0-51 and on a 3.16-rc1 kernel. --- 2014-11-04 Adhemerval Zanella Stefani Seibold * sysdeps/unix/sysv/linux/x86_64/Makefile [$(subdir) = elf] (sysdep_routines): Add dl-vdso here, ... * sysdeps/unix/sysv/linux/x86/Makefile [$(subdir) = elf] (sysdep_routines): ... not here. * sysdeps/unix/sysv/linux/i386/gettimeofday.c: New file: set syscall fallback when vDSO is not presented. * sysdeps/unix/sysv/linux/x86_64/init-first.c (__vdso_clock_gettime): Define with libc_hidden_proto/libc_hidden_data_def definitions. (_libc_vdso_platform_setup): Rename to __vdso_platform_setup. * sysdeps/unix/sysv/linux/i386/init-first.c: New file: likewise. * sysdeps/unix/sysv/linux/i386/time.c: New file: likewise. * sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h: Moved to ... * sysdeps/unix/sysv/linux/x86/libc-vdso.h: ... here. * sysdeps/unix/sysv/linux/x86_64/clock_gettime.c: Move to ... * sysdeps/unix/sysv/linux/x86/clock_gettime.c: ... here. * sysdeps/unix/sysv/linux/x86_64/gettimeofday.c: Move to ... * sysdeps/unix/sysv/linux/x86/gettimeofday.c: ... here. Also added fallback configurable symbol when vDSO is not available. * sysdeps/unix/sysv/linux/x86_64/time.c: Move to ... * sysdeps/unix/sysv/linux/x86/time.c: ... here. Also refactored to be able to redefine fallback symbol when vDSO is not available. * sysdeps/unix/sysv/linux/x86_64/timespec_get.c: Move to ... * sysdeps/unix/sysv/linux/x86/timespec_get.c: ... here. --- diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c new file mode 100644 index 0000000..2b58fd5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c @@ -0,0 +1,39 @@ +/* gettimeofday - get the time. Linux/i386 version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#ifdef SHARED + +# include +# include + +/* If the vDSO is not available we fall back on the syscall. */ +static int +__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) +{ + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); +} +# define GETTIMEOFAY_FALLBACK (void*) (&__gettimeofday_syscall) +# undef libc_ifunc_hidden_def +# define libc_ifunc_hidden_def(name) \ + libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) + +#endif + +#include diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c new file mode 100644 index 0000000..f0a3327 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/init-first.c @@ -0,0 +1,52 @@ +/* Initialization code run first thing by the ELF startup code. Linux/i386. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifdef SHARED +# include +# include +# include +# include + +long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) + __attribute__ ((nocommon)); +libc_hidden_proto (__vdso_clock_gettime) +libc_hidden_data_def (__vdso_clock_gettime) + +static long int +clock_gettime_syscall (clockid_t id, struct timespec *tp) +{ + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (clock_gettime, err, 2, id, tp); +} + +static inline void +__vdso_platform_setup (void) +{ + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + + void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + if (p == NULL) + p = clock_gettime_syscall; + PTR_MANGLE (p); + __vdso_clock_gettime = p; +} + +# define VDSO_SETUP __vdso_platform_setup +#endif + +#include diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c new file mode 100644 index 0000000..45b8a50 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/time.c @@ -0,0 +1,37 @@ +/* time -- Get number of seconds since Epoch. Linux/i386 version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifdef SHARED + +# include +# include + +/* If the vDSO is not available we fall back on the old vsyscall. */ +static time_t +__time_syscall (time_t *t) +{ + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (time, err, 1, t); +} +# define TIME_FALLBACK (void*) &__time_syscall +# undef libc_ifunc_hidden_def +# define libc_ifunc_hidden_def(name) \ + libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) +#endif + +#include diff --git a/sysdeps/unix/sysv/linux/x86/Makefile b/sysdeps/unix/sysv/linux/x86/Makefile index 0281f87..d6be472 100644 --- a/sysdeps/unix/sysv/linux/x86/Makefile +++ b/sysdeps/unix/sysv/linux/x86/Makefile @@ -19,3 +19,7 @@ libpthread-sysdep_routines += init-arch libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ elision-trylock endif + +ifeq ($(subdir),elf) +sysdep_routines += dl-vdso +endif diff --git a/sysdeps/unix/sysv/linux/x86/clock_gettime.c b/sysdeps/unix/sysv/linux/x86/clock_gettime.c new file mode 100644 index 0000000..c3964de --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/clock_gettime.c @@ -0,0 +1,34 @@ +/* Get the current value of a clock. Linux/x86 version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#ifdef SHARED +# define SYSCALL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + long int v_ret; \ + PTR_DEMANGLE (f); \ + v_ret = (*f) (id, tp); \ + if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ + v_ret = -1; \ + } \ + v_ret; }) +#endif + +#include diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c new file mode 100644 index 0000000..b4734b0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -0,0 +1,53 @@ +/* gettimeofday - get the time. Linux/x86 version. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#ifdef SHARED + +# include + +void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); + +void * +gettimeofday_ifunc (void) +{ + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + + /* If the vDSO is not available we fall back on the old vsyscall. */ + return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) + ?: GETTIMEOFAY_FALLBACK); +} +asm (".type __gettimeofday, %gnu_indirect_function"); + +libc_ifunc_hidden_def(__gettimeofday) + +#else + +# include +# include + +int +__gettimeofday (struct timeval *tv, struct timezone *tz) +{ + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); +} +libc_hidden_def (__gettimeofday) + +#endif +weak_alias (__gettimeofday, gettimeofday) +libc_hidden_weak (gettimeofday) diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h new file mode 100644 index 0000000..f291924 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h @@ -0,0 +1,31 @@ +/* Resolve function pointers to VDSO functions. + Copyright (C) 2005-2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _LIBC_VDSO_H +#define _LIBC_VDSO_H + +#include +#include + +#ifdef SHARED + +extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); + +#endif + +#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c new file mode 100644 index 0000000..c1aee0a --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/time.c @@ -0,0 +1,49 @@ +/* time -- Get number of seconds since Epoch. Linux/x86 version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#ifdef SHARED + +#include + +void *time_ifunc (void) __asm__ ("time"); + +void * +time_ifunc (void) +{ + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + + return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; +} +asm (".type time, %gnu_indirect_function"); + +libc_ifunc_hidden_def(time) + +#else + +# include + +time_t +time (time_t *t) +{ + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (time, err, 1, t); +} + +#endif diff --git a/sysdeps/unix/sysv/linux/x86/timespec_get.c b/sysdeps/unix/sysv/linux/x86/timespec_get.c new file mode 100644 index 0000000..4b6d721 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/timespec_get.c @@ -0,0 +1,29 @@ +/* timespec_get -- returns the calendar time based on a given time base. + Linux/x86 version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#ifdef SHARED +# define INTERNAL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + PTR_DEMANGLE (f); \ + (*f) (id, tp); }) +#endif + +#include diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile index d6a9d36..9b82155 100644 --- a/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -13,7 +13,3 @@ endif ifeq ($(subdir),misc) gen-as-const-headers += sigaltstack-offsets.sym endif - -ifeq ($(subdir),elf) -sysdep_routines += dl-vdso -endif diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h b/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h deleted file mode 100644 index f291924..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Resolve function pointers to VDSO functions. - Copyright (C) 2005-2014 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include -#include - -#ifdef SHARED - -extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); - -#endif - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c b/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c deleted file mode 100644 index f712110..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "bits/libc-vdso.h" - -#ifdef SHARED -# define SYSCALL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - long int v_ret; \ - PTR_DEMANGLE (f); \ - v_ret = f (id, tp); \ - if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ - __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ - v_ret = -1; \ - } \ - v_ret; }) -# define INTERNAL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - PTR_DEMANGLE (f); \ - f (id, tp); }) -#endif - -#include "../clock_gettime.c" diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c index 440ca7f..defefbc 100644 --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c @@ -18,42 +18,9 @@ #include #ifdef SHARED - -# include - +/* If the vDSO is not available we fall back on the old vsyscall. */ # define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul - -void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); - -void * -gettimeofday_ifunc (void) -{ - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); - - /* If the vDSO is not available we fall back on the old vsyscall. */ - return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) - ?: (void *) VSYSCALL_ADDR_vgettimeofday); -} -asm (".type __gettimeofday, %gnu_indirect_function"); - -/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't - let us do it in C because it doesn't know we're defining __gettimeofday - here in this file. */ -asm (".globl __GI___gettimeofday\n" - "__GI___gettimeofday = __gettimeofday"); - -#else - -# include -# include - -int -__gettimeofday (struct timeval *tv, struct timezone *tz) -{ - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); -} -libc_hidden_def (__gettimeofday) - +# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday #endif -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) + +#include diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c index fb090df..827751a 100644 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c @@ -20,20 +20,20 @@ # include # include # include -# include +# include long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) __attribute__ ((nocommon)); -strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden) +libc_hidden_proto (__vdso_clock_gettime) +libc_hidden_data_def (__vdso_clock_gettime) long int (*__vdso_getcpu) (unsigned *, unsigned *, void *) attribute_hidden; - extern long int __syscall_clock_gettime (clockid_t, struct timespec *); static inline void -_libc_vdso_platform_setup (void) +__vdso_platform_setup (void) { PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); @@ -41,7 +41,7 @@ _libc_vdso_platform_setup (void) if (p == NULL) p = __syscall_clock_gettime; PTR_MANGLE (p); - __GI___vdso_clock_gettime = p; + __vdso_clock_gettime = p; p = _dl_vdso_vsym ("__vdso_getcpu", &linux26); /* If the vDSO is not available we fall back on the old vsyscall. */ @@ -52,7 +52,7 @@ _libc_vdso_platform_setup (void) __vdso_getcpu = p; } -# define VDSO_SETUP _libc_vdso_platform_setup +# define VDSO_SETUP __vdso_platform_setup #endif #include diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c index 79f1fab..ec1393b 100644 --- a/sysdeps/unix/sysv/linux/x86_64/time.c +++ b/sysdeps/unix/sysv/linux/x86_64/time.c @@ -16,45 +16,9 @@ . */ #ifdef SHARED -/* Redefine time so that the compiler won't complain about the type - mismatch with the IFUNC selector in strong_alias, below. */ -#undef time -#define time __redirect_time -#include - -#include - +/* If the vDSO is not available we fall back on the old vsyscall. */ #define VSYSCALL_ADDR_vtime 0xffffffffff600400 - -/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle - ifunc symbol properly. */ -extern __typeof (__redirect_time) __libc_time; -void *time_ifunc (void) __asm__ ("__libc_time"); - -void * -time_ifunc (void) -{ - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); - - /* If the vDSO is not available we fall back on the old vsyscall. */ - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime; -} -__asm (".type __libc_time, %gnu_indirect_function"); - -#undef time -strong_alias (__libc_time, time) -libc_hidden_ver (__libc_time, time) - -#else - -# include -# include - -time_t -time (time_t *t) -{ - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (time, err, 1, t); -} - +#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime #endif + +#include diff --git a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c b/sysdeps/unix/sysv/linux/x86_64/timespec_get.c deleted file mode 100644 index cb26068..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "bits/libc-vdso.h" - -#ifdef SHARED -# define INTERNAL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - PTR_DEMANGLE (f); \ - f (id, tp); }) -#endif - -#include "../timespec_get.c"