Merge branch 'master' of ssh://sourceware.org/git/glibc
[platform/upstream/glibc.git] / sysdeps / unix / sysv / linux / x86_64 / time.c
1 /* Copyright (C) 2001,02,2003,2011 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #ifdef SHARED
20 #include <dl-vdso.h>
21
22 #define VSYSCALL_ADDR_vtime     0xffffffffff600400
23
24 void *time_ifunc (void) __asm__ ("time");
25
26 void *
27 time_ifunc (void)
28 {
29   PREPARE_VERSION (linux26, "LINUX_2.6", 61765110);
30
31   /* If the vDSO is not available we fall back on the old vsyscall.  */
32   return _dl_vdso_vsym ("time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime;
33 }
34 __asm (".type time, %gnu_indirect_function");
35
36 #else
37
38 # include <time.h>
39 # include <sysdep.h>
40
41 time_t
42 time (time_t *t)
43 {
44   INTERNAL_SYSCALL_DECL (err);
45   return INTERNAL_SYSCALL (time, err, 1, t);
46 }
47
48 #endif
49
50 strong_alias (time, __GI_time)