From d11260f86a64a634f5a3ad9939f6e8ce30442460 Mon Sep 17 00:00:00 2001 From: Chris Metcalf Date: Fri, 26 Oct 2012 09:21:08 -0400 Subject: tile: add vDSO support for gettimeofday() --- ports/ChangeLog.tile | 8 +++++ ports/sysdeps/unix/sysv/linux/tile/Makefile | 4 +++ .../sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h | 30 +++++++++++++++++ ports/sysdeps/unix/sysv/linux/tile/gettimeofday.c | 38 ++++++++++++++++++++++ ports/sysdeps/unix/sysv/linux/tile/init-first.c | 34 +++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 ports/sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h create mode 100644 ports/sysdeps/unix/sysv/linux/tile/gettimeofday.c create mode 100644 ports/sysdeps/unix/sysv/linux/tile/init-first.c diff --git a/ports/ChangeLog.tile b/ports/ChangeLog.tile index 93c99ac695..6445a3a2a5 100644 --- a/ports/ChangeLog.tile +++ b/ports/ChangeLog.tile @@ -1,3 +1,11 @@ +2012-10-26 Chris Metcalf + + * sysdeps/unix/sysv/linux/tile/Makefile (sysdep_routines): + Include dl-vdso. + * sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h: New file. + * sysdeps/unix/sysv/linux/tile/gettimeofday.c: New file. + * sysdeps/unix/sysv/linux/tile/init-first.c: New file. + 2012-10-19 Roland McGrath * sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist: diff --git a/ports/sysdeps/unix/sysv/linux/tile/Makefile b/ports/sysdeps/unix/sysv/linux/tile/Makefile index 0cbfdd0e39..1c0c968dc1 100644 --- a/ports/sysdeps/unix/sysv/linux/tile/Makefile +++ b/ports/sysdeps/unix/sysv/linux/tile/Makefile @@ -13,3 +13,7 @@ sysdep_headers += sys/dataplane.h sysdep_routines += set_dataplane endif + +ifeq ($(subdir),elf) +sysdep_routines += dl-vdso +endif diff --git a/ports/sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h b/ports/sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h new file mode 100644 index 0000000000..b972720b3a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/tile/bits/libc-vdso.h @@ -0,0 +1,30 @@ +/* Resolve function pointers to VDSO functions. + Copyright (C) 2012 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 + +#ifdef SHARED + +extern long int (*__vdso_gettimeofday) (struct timeval *, void *) + attribute_hidden; + +#endif + +#endif /* _LIBC_VDSO_H */ diff --git a/ports/sysdeps/unix/sysv/linux/tile/gettimeofday.c b/ports/sysdeps/unix/sysv/linux/tile/gettimeofday.c new file mode 100644 index 0000000000..e2bcc45018 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/tile/gettimeofday.c @@ -0,0 +1,38 @@ +/* Copyright (C) 2012 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 +#include +#include +#include + +#undef __gettimeofday +#include + +int +__gettimeofday (struct timeval *tv, struct timezone *tz) +{ +#ifdef SHARED + /* If the vDSO is available we use it. */ + if (__vdso_gettimeofday != NULL) + return __vdso_gettimeofday (tv, tz); +#endif + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); +} + +strong_alias (__gettimeofday, __gettimeofday_internal) +weak_alias (__gettimeofday, gettimeofday) diff --git a/ports/sysdeps/unix/sysv/linux/tile/init-first.c b/ports/sysdeps/unix/sysv/linux/tile/init-first.c new file mode 100644 index 0000000000..58b6533c0f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/tile/init-first.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2012 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 + +long int (*__vdso_gettimeofday) (struct timeval *, void *) attribute_hidden; + +static inline void +_libc_vdso_platform_setup (void) +{ + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); + __vdso_gettimeofday = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); +} + +#define VDSO_SETUP _libc_vdso_platform_setup +#endif + +#include "../init-first.c" -- cgit v1.2.1