alpha: Remove __ASSUME_32BITUIDS.
[glibc-ports.git] / sysdeps / unix / sysv / linux / alpha / gettimeofday.S
blob53c43c5545c1f699e5c22e9ac8270302cd42f9c7
1 /* Copyright (C) 1998, 2002, 2003, 2006, 2012 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
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.
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.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library.  If not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #define _ERRNO_H        1
20 #include <bits/errno.h>
21 #include <kernel-features.h>
23 .text
25 #if defined PIC && defined DO_VERSIONING
26 #define GETTIMEOFDAY    __gettimeofday_tv64
27 #else
28 #define GETTIMEOFDAY    __gettimeofday
29 #endif
31 #if defined __ASSUME_TIMEVAL64
32 PSEUDO(GETTIMEOFDAY, gettimeofday, 2)
33         ret
34 PSEUDO_END(GETTIMEOFDAY)
35 #else
37 /* The problem here is that initially we made struct timeval compatible with
38    OSF/1, using int32.  But we defined time_t with uint64, and later found
39    that POSIX requires tv_sec to be time_t.
41    So now we have to do compatibility stuff.  */
43 /* The variable is shared between all wrappers around signal handling
44    functions which have RT equivalents.  */
45 .comm __libc_missing_axp_tv64, 4
47 LEAF(GETTIMEOFDAY, 16)
48         ldgp    gp, 0(pv)
49         subq    sp, 16, sp
50 #ifdef PROF
51         .set noat
52         lda     AT, _mcount
53         jsr     AT, (AT), _mcount
54         .set at
55 #endif
56         .prologue 1
58         ldl     t0, __libc_missing_axp_tv64
60         /* Save arguments in case we do need to fall back.  */
61         stq     a0, 0(sp)
62         stq     a1, 8(sp)
64         bne     t0, $do32
66         ldi     v0, SYS_ify(gettimeofday)
67         callsys
68         bne     a3, $err64
70         /* Everything ok.  */
71         addq    sp, 16, sp
72         ret
74         /* If we didn't get ENOSYS, it is a real error.  */
75         .align 3
76 $err64: cmpeq   v0, ENOSYS, t0
77         beq     t0, $error
78         stl     t0, __libc_missing_axp_tv64
80         /* Recover the saved arguments.  */
81         ldq     a1, 8(sp)
82         ldq     a0, 0(sp)
84         .align 3
85 $do32:  ldi     v0, SYS_ify(osf_gettimeofday)
86         callsys
87         bne     a3, $error
89         /* Copy back to proper format.  */
90         ldq     a0, 0(sp)
91         beq     a0, 2f
92         ldl     t0, 0(a0)
93         ldl     t1, 4(a0)
94         stq     t0, 0(a0)
95         stq     t1, 8(a0)
97 2:      addq    sp, 16, sp
98         ret
100         .align 3
101 $error:
102         addq    sp, 16, sp
103         SYSCALL_ERROR_HANDLER
105 END(GETTIMEOFDAY)
106 #endif /* __ASSUME_TIMEVAL64 */
108 #if defined PIC && defined DO_VERSIONING
109 default_symbol_version (__gettimeofday_tv64, __gettimeofday, GLIBC_2.1)
111 /* It seems to me to be a misfeature of the assembler that we can only
112    have one version-alias per symbol.  So create an alias ourselves.
113    The 'p' is for 'public'.  *Shrug*  */
114 strong_alias (__gettimeofday_tv64, __gettimeofday_tv64p)
115 default_symbol_version (__gettimeofday_tv64p, gettimeofday, GLIBC_2.1)
116 #else
117 weak_alias (__gettimeofday, gettimeofday)
118 #endif
119 strong_alias(GETTIMEOFDAY, __gettimeofday_internal)