forked from rpms/glibc
		
	Revert x86 vdso support patch to get i686 building again
This commit is contained in:
		
							parent
							
								
									c041cd3d0c
								
							
						
					
					
						commit
						a086cd2399
					
				
							
								
								
									
										655
									
								
								glibc-revert-x86-vdso.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										655
									
								
								glibc-revert-x86-vdso.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,655 @@ | ||||
| commit ca677d3c3cd0eba7d1f03092517aea553a0e8569 | ||||
| Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com> | ||||
| Date:   Fri Jun 27 14:00:18 2014 -0700 | ||||
| 
 | ||||
|     Add x86 32 bit vDSO time function support | ||||
|      | ||||
|     Linux 3.15 adds support for clock_gettime, gettimeofday, and time vDSO | ||||
|     (commit id 37c975545ec63320789962bf307f000f08fabd48).  This patch adds | ||||
|     GLIBC supports to use such symbol when they are avaiable. | ||||
|      | ||||
|     Along with x86 vDSO support, this patch cleanup x86_64 code by moving | ||||
|     all common code to x86 common folder.  Only init-first.c is different | ||||
|     between implementations. | ||||
| 
 | ||||
| diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..3e00eb4
 | ||||
| --- /dev/null
 | ||||
| +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c
 | ||||
| @@ -0,0 +1,39 @@
 | ||||
| +/* gettimeofday - get the time.  Linux/i386 version.
 | ||||
| +   Copyright (C) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#include <sys/time.h>
 | ||||
| +
 | ||||
| +#ifdef SHARED
 | ||||
| +
 | ||||
| +# include <dl-vdso.h>
 | ||||
| +# include <errno.h>
 | ||||
| +
 | ||||
| +/* 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 <sysdeps/unix/sysv/linux/x86/gettimeofday.c>
 | ||||
| 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..4be65d7
 | ||||
| --- /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) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#ifdef SHARED
 | ||||
| +# include <time.h>
 | ||||
| +# include <sysdep.h>
 | ||||
| +# include <dl-vdso.h>
 | ||||
| +# include <libc-vdso.h>
 | ||||
| +
 | ||||
| +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 <csu/init-first.c>
 | ||||
| diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..e8a4e59
 | ||||
| --- /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) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#ifdef SHARED
 | ||||
| +
 | ||||
| +# include <dl-vdso.h>
 | ||||
| +# include <errno.h>
 | ||||
| +
 | ||||
| +/* 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 <sysdeps/unix/sysv/linux/x86/time.c>
 | ||||
| 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..98ffb01
 | ||||
| --- /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) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#include <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; })
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +#include <sysdeps/unix/sysv/linux/clock_gettime.c>
 | ||||
| diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..c820fd7
 | ||||
| --- /dev/null
 | ||||
| +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c
 | ||||
| @@ -0,0 +1,54 @@
 | ||||
| +/* gettimeofday - get the time.  Linux/x86 version.
 | ||||
| +   Copyright (C) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#include <sys/time.h>
 | ||||
| +
 | ||||
| +#ifdef SHARED
 | ||||
| +
 | ||||
| +# include <dl-vdso.h>
 | ||||
| +
 | ||||
| +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 <sysdep.h>
 | ||||
| +# include <errno.h>
 | ||||
| +
 | ||||
| +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..03ff875
 | ||||
| --- /dev/null
 | ||||
| +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h
 | ||||
| @@ -0,0 +1,31 @@
 | ||||
| +/* Resolve function pointers to VDSO functions.
 | ||||
| +   Copyright (C) 2005-2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#ifndef _LIBC_VDSO_H
 | ||||
| +#define _LIBC_VDSO_H
 | ||||
| +
 | ||||
| +#include <time.h>
 | ||||
| +#include <sys/time.h>
 | ||||
| +
 | ||||
| +#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..1ab9248
 | ||||
| --- /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) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#include <time.h>
 | ||||
| +
 | ||||
| +#ifdef SHARED
 | ||||
| +
 | ||||
| +#include <dl-vdso.h>
 | ||||
| +
 | ||||
| +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 <sysdep.h>
 | ||||
| +
 | ||||
| +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..b21efce
 | ||||
| --- /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) 2015 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
 | ||||
| +   <http://www.gnu.org/licenses/>.  */
 | ||||
| +
 | ||||
| +#include <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 <sysdeps/unix/sysv/linux/timespec_get.c>
 | ||||
| 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 03ff875..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-2015 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
 | ||||
| -   <http://www.gnu.org/licenses/>.  */
 | ||||
| -
 | ||||
| -#ifndef _LIBC_VDSO_H
 | ||||
| -#define _LIBC_VDSO_H
 | ||||
| -
 | ||||
| -#include <time.h>
 | ||||
| -#include <sys/time.h>
 | ||||
| -
 | ||||
| -#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 866d9c1..daa14de 100644
 | ||||
| --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c
 | ||||
| +++ b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c
 | ||||
| @@ -18,42 +18,9 @@
 | ||||
|  #include <sys/time.h> | ||||
|   | ||||
|  #ifdef SHARED | ||||
| -
 | ||||
| -# include <dl-vdso.h>
 | ||||
| -
 | ||||
| +/* 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 <sysdep.h>
 | ||||
| -# include <errno.h>
 | ||||
| -
 | ||||
| -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 <sysdeps/unix/sysv/linux/x86/gettimeofday.c>
 | ||||
| diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c
 | ||||
| index e3bc712..36f9afc 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 <time.h> | ||||
|  # include <sysdep.h> | ||||
|  # include <dl-vdso.h> | ||||
| -# include <bits/libc-vdso.h>
 | ||||
| +# include <libc-vdso.h>
 | ||||
|   | ||||
|  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 <csu/init-first.c> | ||||
| diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c
 | ||||
| index c00b5be..6ceb819 100644
 | ||||
| --- a/sysdeps/unix/sysv/linux/x86_64/time.c
 | ||||
| +++ b/sysdeps/unix/sysv/linux/x86_64/time.c
 | ||||
| @@ -16,45 +16,9 @@
 | ||||
|     <http://www.gnu.org/licenses/>.  */ | ||||
|   | ||||
|  #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 <time.h>
 | ||||
| -
 | ||||
| -#include <dl-vdso.h>
 | ||||
| -
 | ||||
| +/* 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 <time.h>
 | ||||
| -# include <sysdep.h>
 | ||||
| -
 | ||||
| -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 <sysdeps/unix/sysv/linux/x86/time.c>
 | ||||
| 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"
 | ||||
| diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c b/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c
 | ||||
| index 88369e5..93e0508 100644
 | ||||
| --- a/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c
 | ||||
| +++ b/sysdeps/unix/sysv/linux/x86_64/x32/init-first.c
 | ||||
| @@ -18,7 +18,7 @@
 | ||||
|   | ||||
|  #ifdef SHARED | ||||
|  # include <dl-vdso.h> | ||||
| -# include <bits/libc-vdso.h>
 | ||||
| +# include <libc-vdso.h>
 | ||||
|   | ||||
|  long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) | ||||
|    __attribute__ ((nocommon)); | ||||
| @ -206,6 +206,9 @@ Patch0052: %{name}-disable-rwlock-elision.patch | ||||
| # symlink to it. | ||||
| Patch0053: %{name}-cs-path.patch | ||||
| 
 | ||||
| # Temporary revert till I fix rtkaio build on i686. | ||||
| Patch0054: %{name}-revert-x86-vdso.patch | ||||
| 
 | ||||
| ############################################################################## | ||||
| # | ||||
| # Patches from upstream | ||||
| @ -575,6 +578,7 @@ package or when debugging this package. | ||||
| %patch0050 -p1 | ||||
| %patch0052 -p1 | ||||
| %patch0053 -p1 | ||||
| %patch0054 -p1 -R | ||||
| 
 | ||||
| ############################################################################## | ||||
| # %%prep - Additional prep required... | ||||
| @ -1750,6 +1754,7 @@ rm -f *.filelist* | ||||
| * Wed Jan 21 2015 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.20.90-20 | ||||
| - Sync with upstream master. | ||||
| - Disable werror on s390x. | ||||
| - Revert x86 vDSO support since it breaks i686 rtkaio build. | ||||
| 
 | ||||
| * Tue Jan 20 2015 Peter Robinson <pbrobinson@fedoraproject.org> 2.20.90-19 | ||||
| - Drop large ancient ChangeLogs (rhbz #1169546) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user