Add VDSO support to sparc.

* sysdeps/unix/sysv/linux/sparc/init-first.c: New file.
	* sysdeps/unix/sysv/linux/sparc/libc-vdso.h: New file.
	* sysdeps/unix/sysv/linux/sparc/Makefile: Add dl-vdso to
	sysdep_routines in subdir elf.
	* sysdeps/unix/sysv/linux/sparc/Versions: Add GLIBC_PRIVATE
	version for __vdso_clock_gettime.
	* sysdeps/unix/sysv/linux/sparc/sysdep.h (INTERNAL_VSYSCALL_CALL):
	Define.
	(HAVE_CLOCK_GETTIME_VSYSCALL): Define.
	(HAVE_GETTIMEOFDAY_VSYSCALL): Define.
This commit is contained in:
David S. Miller 2018-10-18 11:42:19 -07:00
parent 0a271c8f25
commit 94a3a27f5d
6 changed files with 109 additions and 0 deletions

View File

@ -1,5 +1,16 @@
2018-10-18 David S. Miller <davem@davemloft.net> 2018-10-18 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/init-first.c: New file.
* sysdeps/unix/sysv/linux/sparc/libc-vdso.h: New file.
* sysdeps/unix/sysv/linux/sparc/Makefile: Add dl-vdso to
sysdep_routines in subdir elf.
* sysdeps/unix/sysv/linux/sparc/Versions: Add GLIBC_PRIVATE
version for __vdso_clock_gettime.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (INTERNAL_VSYSCALL_CALL):
Define.
(HAVE_CLOCK_GETTIME_VSYSCALL): Define.
(HAVE_GETTIMEOFDAY_VSYSCALL): Define.
* sysdeps/sparc/fpu/libm-test-ulps: Regenerated. * sysdeps/sparc/fpu/libm-test-ulps: Regenerated.
2018-10-17 H.J. Lu <hongjiu.lu@intel.com> 2018-10-17 H.J. Lu <hongjiu.lu@intel.com>

View File

@ -7,6 +7,10 @@ librt-routines += rt-sysdep
librt-shared-only-routines += rt-sysdep librt-shared-only-routines += rt-sysdep
endif endif
ifeq ($(subdir),elf)
sysdep_routines += dl-vdso
endif
ifeq ($(subdir),sysvipc) ifeq ($(subdir),sysvipc)
sysdep_routines += getshmlba sysdep_routines += getshmlba
endif endif

View File

@ -29,6 +29,10 @@ libc {
__getshmlba; __getshmlba;
} }
GLIBC_PRIVATE {
# nptl/pthread_cond_timedwait.c uses INTERNAL_VSYSCALL(clock_gettime).
__vdso_clock_gettime;
}
} }
libpthread { libpthread {

View File

@ -0,0 +1,46 @@
/* SPARC VDSO initialization
Copyright (C) 2018 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 <libc-vdso.h>
long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
attribute_hidden;
long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *)
attribute_hidden;
static inline void
_libc_vdso_platform_setup (void)
{
PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6);
void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version);
PTR_MANGLE (p);
VDSO_SYMBOL (gettimeofday) = p;
p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux_version);
PTR_MANGLE (p);
VDSO_SYMBOL (clock_gettime) = p;
}
# define VDSO_SETUP _libc_vdso_platform_setup
#endif
#include <csu/init-first.c>

View File

@ -0,0 +1,33 @@
/* VDSO function pointer declarations.
Copyright (C) 2018 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
#ifdef SHARED
# include <sysdep-vdso.h>
extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *)
attribute_hidden;
extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *);
#endif
#endif /* _LIBC_VDSO_H */

View File

@ -34,6 +34,17 @@
#else /* __ASSEMBLER__ */ #else /* __ASSEMBLER__ */
#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \
({ \
long _ret = funcptr (args); \
err = ((unsigned long) (_ret) >= (unsigned long) -4095L); \
_ret; \
})
/* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
#undef INLINE_SYSCALL #undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \ #define INLINE_SYSCALL(name, nr, args...) \
({ INTERNAL_SYSCALL_DECL(err); \ ({ INTERNAL_SYSCALL_DECL(err); \