2002-11-07 Richard Henderson <rth@redhat.com>
* elf/tls-macros.h: Add alpha versions. * sysdeps/alpha/dl-machine.h (elf_machine_rela): Handle TLS relocs. * sysdeps/unix/alpha/sysdep.S: Support USE___THREAD. * sysdeps/unix/alpha/sysdep.h: Likewise. Add SYSCALL_ERROR_HANDLER. * sysdeps/unix/sysv/linux/alpha/brk.S: Use it. * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise. * sysdeps/unix/sysv/linux/alpha/getitimer.S: Likewise. * sysdeps/unix/sysv/linux/alpha/getrusage.S: Likewise. * sysdeps/unix/sysv/linux/alpha/gettimeofday.S: Likewise. * sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Likewise. * sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S: Likewise. * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Likewise. * sysdeps/unix/sysv/linux/alpha/select.S: Likewise. * sysdeps/unix/sysv/linux/alpha/setitimer.S: Likewise. * sysdeps/unix/sysv/linux/alpha/settimeofday.S: Likewise. * sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Likewise. * sysdeps/unix/sysv/linux/alpha/syscall.S: Likewise. * sysdeps/unix/sysv/linux/alpha/utimes.S: Likewise. * sysdeps/unix/sysv/linux/alpha/wait4.S: Likewise.
This commit is contained in:
parent
e8b06fdf73
commit
d5a256add3
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1993, 1996, 1998 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993, 1996, 1998, 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Brendan Kehoe (brendan@zen.org).
|
||||
|
||||
@ -20,24 +20,59 @@
|
||||
#include <sysdep.h>
|
||||
#include <features.h>
|
||||
|
||||
#if defined(__ELF__) && defined(PIC)
|
||||
/* Put this at the end of libc's text segment so that all of
|
||||
the direct branches from the syscalls are forward, and
|
||||
thus predicted not taken. */
|
||||
.section .text.last, "ax", @progbits
|
||||
#else
|
||||
.text
|
||||
.align 2
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC_REENTRANT
|
||||
#ifdef PIC
|
||||
/* When building a shared library, we branch here without
|
||||
having loaded the GP. Nor, since it was a direct branch,
|
||||
have we loaded PV with our address. Do both. */
|
||||
# define LOADGP br pv, 1f; 1: ldgp gp, 0(pv)
|
||||
# define PROLOGUE .prologue 0
|
||||
#else
|
||||
# define LOADGP ldgp gp, 0(pv)
|
||||
# define PROLOGUE .prologue 1
|
||||
#endif
|
||||
|
||||
.align 4
|
||||
.globl __syscall_error
|
||||
.ent __syscall_error
|
||||
__syscall_error:
|
||||
ldgp gp, 0(pv)
|
||||
|
||||
#if defined(_LIBC_REENTRANT) && defined(USE___THREAD)
|
||||
|
||||
LOADGP
|
||||
PROLOGUE
|
||||
mov v0, t0
|
||||
call_pal PAL_rduniq
|
||||
ldq t1, __libc_errno(gp) !gottprel
|
||||
addq v0, t1, v0
|
||||
stl t0, 0(v0)
|
||||
lda v0, -1
|
||||
ret
|
||||
|
||||
#elif defined(_LIBC_REENTRANT)
|
||||
|
||||
LOADGP
|
||||
lda sp, -16(sp)
|
||||
.frame sp, 16, ra, 0
|
||||
stq ra, 0(sp)
|
||||
stq v0, 8(sp)
|
||||
.mask 0x4000001, -16
|
||||
.prologue 1
|
||||
PROLOGUE
|
||||
|
||||
/* Find our per-thread errno address */
|
||||
#ifdef PIC
|
||||
bsr ra, __errno_location !samegp
|
||||
#else
|
||||
jsr ra, __errno_location
|
||||
#endif
|
||||
|
||||
/* Store the error value. */
|
||||
ldq t0, 8(sp)
|
||||
@ -49,16 +84,15 @@ __syscall_error:
|
||||
ldq ra, 0(sp)
|
||||
lda sp, 16(sp)
|
||||
ret
|
||||
.end __syscall_error
|
||||
|
||||
#else
|
||||
|
||||
ENTRY(__syscall_error)
|
||||
ldgp gp, 0(t12)
|
||||
.prologue 1
|
||||
|
||||
LOADGP
|
||||
PROLOGUE
|
||||
stl v0, errno
|
||||
lda v0, -1
|
||||
ret
|
||||
END(__syscall_error)
|
||||
|
||||
#endif /* _LIBC_REENTRANT */
|
||||
#endif
|
||||
|
||||
.end __syscall_error
|
||||
|
@ -27,6 +27,13 @@
|
||||
# include <regdef.h>
|
||||
#endif
|
||||
|
||||
#include <tls.h> /* Defines USE___THREAD. */
|
||||
|
||||
#ifdef IS_IN_rtld
|
||||
# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __STDC__
|
||||
#define __LABEL(x) x##:
|
||||
#else
|
||||
@ -55,54 +62,65 @@
|
||||
label of that number between those two macros! */
|
||||
|
||||
#ifdef PROF
|
||||
#define PSEUDO(name, syscall_name, args) \
|
||||
.globl name; \
|
||||
.align 3; \
|
||||
.ent name,0; \
|
||||
__LABEL(name) \
|
||||
.frame sp, 0, ra; \
|
||||
ldgp gp,0(pv); \
|
||||
.set noat; \
|
||||
lda AT,_mcount; \
|
||||
jsr AT,(AT),_mcount; \
|
||||
.set at; \
|
||||
.prologue 1; \
|
||||
ldiq v0, SYS_ify(syscall_name); \
|
||||
.set noat; \
|
||||
call_pal PAL_callsys; \
|
||||
.set at; \
|
||||
bne a3, 1996f; \
|
||||
3:
|
||||
# define PSEUDO_PROLOGUE \
|
||||
.frame sp, 0, ra; \
|
||||
ldgp gp,0(pv); \
|
||||
.set noat; \
|
||||
lda AT,_mcount; \
|
||||
jsr AT,(AT),_mcount; \
|
||||
.set at; \
|
||||
.prologue 1
|
||||
# define PSEUDO_LOADGP
|
||||
#else
|
||||
#define PSEUDO(name, syscall_name, args) \
|
||||
.globl name; \
|
||||
.align 3; \
|
||||
.ent name,0; \
|
||||
__LABEL(name) \
|
||||
.frame sp, 0, ra \
|
||||
.prologue 0; \
|
||||
ldiq v0, SYS_ify(syscall_name); \
|
||||
.set noat; \
|
||||
call_pal PAL_callsys; \
|
||||
.set at; \
|
||||
bne a3, 1996f; \
|
||||
3:
|
||||
#endif
|
||||
# define PSEUDO_PROLOGUE \
|
||||
.frame sp, 0, ra; \
|
||||
.prologue 0
|
||||
# define PSEUDO_LOADGP \
|
||||
br gp, 2f; \
|
||||
2: ldgp gp, 0(gp)
|
||||
#endif /* PROF */
|
||||
|
||||
#undef PSEUDO_END
|
||||
#ifdef PROF
|
||||
#define PSEUDO_END(sym) \
|
||||
1996: \
|
||||
jmp zero, __syscall_error; \
|
||||
END(sym)
|
||||
#if RTLD_PRIVATE_ERRNO
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
stl v0, errno(gp) !gprel; \
|
||||
lda v0, -1; \
|
||||
ret
|
||||
#else
|
||||
#define PSEUDO_END(sym) \
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
jmp $31, __syscall_error
|
||||
#endif /* RTLD_PRIVATE_ERRNO */
|
||||
|
||||
#if defined(PIC) && !RTLD_PRIVATE_ERRNO
|
||||
# define PSEUDO(name, syscall_name, args) \
|
||||
.globl name; \
|
||||
.align 4; \
|
||||
.ent name,0; \
|
||||
__LABEL(name) \
|
||||
PSEUDO_PROLOGUE; \
|
||||
lda v0, SYS_ify(syscall_name); \
|
||||
call_pal PAL_callsys; \
|
||||
bne a3, __syscall_error !samegp; \
|
||||
3:
|
||||
# undef PSEUDO_END
|
||||
# define PSEUDO_END(sym) END(sym)
|
||||
#else
|
||||
# define PSEUDO(name, syscall_name, args) \
|
||||
.globl name; \
|
||||
.align 4; \
|
||||
.ent name,0; \
|
||||
__LABEL(name) \
|
||||
lda v0, SYS_ify(syscall_name); \
|
||||
call_pal PAL_callsys; \
|
||||
bne a3, 1996f; \
|
||||
3:
|
||||
|
||||
# undef PSEUDO_END
|
||||
# define PSEUDO_END(sym) \
|
||||
1996: \
|
||||
br gp, 2f; \
|
||||
2: ldgp gp, 0(gp); \
|
||||
jmp zero, __syscall_error; \
|
||||
END(sym)
|
||||
#endif
|
||||
PSEUDO_LOADGP; \
|
||||
SYSCALL_ERROR_HANDLER; \
|
||||
END(sym)
|
||||
#endif /* PIC && !RTLD_PRIVATE_ERRNO */
|
||||
|
||||
#define r0 v0
|
||||
#define r1 a4
|
||||
|
@ -74,7 +74,7 @@ $ok: stq a0, __curbrk
|
||||
/* What a horrible way to die. */
|
||||
$err0: ldi v0, ENOMEM
|
||||
$err1: addq sp, 8, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__brk)
|
||||
|
||||
|
@ -97,7 +97,7 @@ $do32: ldi v0, SYS_ify(osf_getitimer)
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 16, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(GETITIMER)
|
||||
|
||||
|
@ -129,7 +129,7 @@ $do32: ldi v0, SYS_ify(osf_getrusage)
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 16, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(GETRUSAGE)
|
||||
|
||||
|
@ -94,7 +94,7 @@ $do32: ldi v0, SYS_ify(osf_gettimeofday)
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 16, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(GETTIMEOFDAY)
|
||||
|
||||
|
@ -53,7 +53,7 @@ $error:
|
||||
1: ldgp gp, 0(gp)
|
||||
#endif
|
||||
lda sp, 16(sp)
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__ieee_get_fp_control)
|
||||
|
||||
|
@ -52,7 +52,7 @@ $error:
|
||||
1: ldgp gp, 0(gp)
|
||||
#endif
|
||||
lda sp, 16(sp)
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__ieee_set_fp_control)
|
||||
|
||||
|
@ -56,7 +56,7 @@ ENTRY(__syscall_rt_sigaction)
|
||||
br gp,2f
|
||||
2: ldgp gp,0(gp)
|
||||
#endif
|
||||
jmp __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__syscall_rt_sigaction)
|
||||
|
||||
@ -82,6 +82,6 @@ ENTRY(__syscall_rt_sigaction)
|
||||
ldgp $29,0($27)
|
||||
.prologue 1
|
||||
ldi $0,ENOSYS
|
||||
jmp __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
END(__syscall_rt_sigaction)
|
||||
#endif
|
||||
|
@ -112,7 +112,7 @@ $do32:
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 64, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(SELECT)
|
||||
|
||||
|
@ -113,7 +113,7 @@ $do32:
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 48, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(SETITIMER)
|
||||
|
||||
|
@ -94,7 +94,7 @@ $do32:
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 16, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(SETTIMEOFDAY)
|
||||
|
||||
|
@ -47,7 +47,7 @@ error:
|
||||
br gp, 1f
|
||||
1: ldgp gp, 0(gp)
|
||||
#endif
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__sigsuspend)
|
||||
|
||||
|
@ -70,7 +70,7 @@ $error:
|
||||
br gp, 2f
|
||||
2: ldgp gp, 0(gp)
|
||||
#endif
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(__syscall)
|
||||
|
||||
|
@ -99,7 +99,7 @@ $do32:
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 16, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(UTIMES)
|
||||
|
||||
|
@ -132,7 +132,7 @@ $do32: ldi v0, SYS_ify(osf_wait4)
|
||||
.align 3
|
||||
$error:
|
||||
addq sp, 32, sp
|
||||
jmp zero, __syscall_error
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
||||
END(WAIT4)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user