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:
Roland McGrath 2002-11-08 02:18:48 +00:00
parent e8b06fdf73
commit d5a256add3
16 changed files with 123 additions and 71 deletions

View File

@ -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

View File

@ -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) \
# define PSEUDO_PROLOGUE \
.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; \
.prologue 1
# define PSEUDO_LOADGP
#else
# define PSEUDO_PROLOGUE \
.frame sp, 0, ra; \
.prologue 0
# define PSEUDO_LOADGP \
br gp, 2f; \
2: ldgp gp, 0(gp)
#endif /* PROF */
#if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
stl v0, errno(gp) !gprel; \
lda v0, -1; \
ret
#else
# 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; \
.set at; \
bne a3, 1996f; \
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 3; \
.align 4; \
.ent name,0; \
__LABEL(name) \
.frame sp, 0, ra \
.prologue 0; \
ldiq v0, SYS_ify(syscall_name); \
.set noat; \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
.set at; \
bne a3, 1996f; \
3:
#endif
# undef PSEUDO_END
#ifdef PROF
# define PSEUDO_END(sym) \
1996: \
jmp zero, __syscall_error; \
PSEUDO_LOADGP; \
SYSCALL_ERROR_HANDLER; \
END(sym)
#else
#define PSEUDO_END(sym) \
1996: \
br gp, 2f; \
2: ldgp gp, 0(gp); \
jmp zero, __syscall_error; \
END(sym)
#endif
#endif /* PIC && !RTLD_PRIVATE_ERRNO */
#define r0 v0
#define r1 a4

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -112,7 +112,7 @@ $do32:
.align 3
$error:
addq sp, 64, sp
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(SELECT)

View File

@ -113,7 +113,7 @@ $do32:
.align 3
$error:
addq sp, 48, sp
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(SETITIMER)

View File

@ -94,7 +94,7 @@ $do32:
.align 3
$error:
addq sp, 16, sp
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(SETTIMEOFDAY)

View File

@ -47,7 +47,7 @@ error:
br gp, 1f
1: ldgp gp, 0(gp)
#endif
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(__sigsuspend)

View File

@ -70,7 +70,7 @@ $error:
br gp, 2f
2: ldgp gp, 0(gp)
#endif
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(__syscall)

View File

@ -99,7 +99,7 @@ $do32:
.align 3
$error:
addq sp, 16, sp
jmp zero, __syscall_error
SYSCALL_ERROR_HANDLER
END(UTIMES)

View File

@ -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)