mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-27 04:41:02 +08:00
update from main archive 960911
This commit is contained in:
parent
862eb33e44
commit
bf4b310762
@ -1,2 +1 @@
|
||||
init-first.h
|
||||
clone.S
|
||||
|
@ -33,8 +33,9 @@ errno: .space 4
|
||||
_errno = errno /* This name is expected by hj libc.so.5 startup code. */
|
||||
.text
|
||||
|
||||
/* The following code is not used at all in the shared library.
|
||||
The PIC system call stubs set errno themselves. */
|
||||
/* The following code is only used in the shared library when we
|
||||
compile the reentrant version. Otherwise each system call defines
|
||||
each own version. */
|
||||
|
||||
#ifndef PIC
|
||||
|
||||
@ -42,30 +43,34 @@ _errno = errno /* This name is expected by hj libc.so.5 startup code. */
|
||||
#define _ERRNO_H
|
||||
#include <errnos.h>
|
||||
|
||||
.globl errno
|
||||
.globl __syscall_error
|
||||
|
||||
/* The syscall stubs jump here when they detect an error. */
|
||||
|
||||
.globl __syscall_error
|
||||
__syscall_error:
|
||||
neg.l %d0
|
||||
|
||||
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
|
||||
/* We translate the system's EWOULDBLOCK error into EAGAIN.
|
||||
The GNU C library always defines EWOULDBLOCK==EAGAIN.
|
||||
EWOULDBLOCK_sys is the original number. */
|
||||
move.l #EWOULDBLOCK_sys, %d1
|
||||
cmp.l %d0, %d1
|
||||
jne 1f
|
||||
move.l #EAGAIN, %d0
|
||||
1:
|
||||
#endif
|
||||
|
||||
move.l %d0, errno
|
||||
#ifdef _LIBC_REENTRANT
|
||||
move.l %d0, -(%sp)
|
||||
jbsr __errno_location
|
||||
move.l (%sp)+, (%a0)
|
||||
#endif
|
||||
move.l #-1, %d0
|
||||
/* Copy return value to %a0 for syscalls that are declared to
|
||||
return a pointer. */
|
||||
move.l %d0, %a0
|
||||
rts
|
||||
.size __syscall_error, . - __syscall_error
|
||||
#endif /* PIC */
|
||||
|
||||
#ifdef _LIBC_REENTRANT
|
||||
.globl __errno_location
|
||||
.type __errno_location, @function
|
||||
__errno_location:
|
||||
#ifdef PIC
|
||||
move.l (%pc, errno@GOTPC), %a0
|
||||
#else
|
||||
lea errno, %a0
|
||||
#endif
|
||||
rts
|
||||
.size __errno_location, . - __errno_location
|
||||
#endif
|
||||
|
@ -78,7 +78,24 @@ Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef PIC
|
||||
/* Store (- %d0) into errno through the GOT. */
|
||||
#ifdef _LIBC_REENTRANT
|
||||
#define SYSCALL_ERROR_HANDLER \
|
||||
.type syscall_error, @function; \
|
||||
syscall_error: \
|
||||
move.l (errno@GOTPC, %pc), %a0; \
|
||||
neg.l %d0; \
|
||||
move.l %d0, (%a0); \
|
||||
move.l %d0, -(%sp); \
|
||||
jbsr __errno_location@PLTPC \
|
||||
move.l (%sp)+, (%a0); \
|
||||
move.l POUND -1, %d0; \
|
||||
/* Copy return value to %a0 for syscalls that are declared to return \
|
||||
a pointer (e.g., mmap). */ \
|
||||
move.l %d0, %a0; \
|
||||
rts;
|
||||
#else
|
||||
#define SYSCALL_ERROR_HANDLER \
|
||||
.type syscall_error, @function; \
|
||||
syscall_error: \
|
||||
move.l (errno@GOTPC, %pc), %a0; \
|
||||
neg.l %d0; \
|
||||
@ -88,9 +105,10 @@ syscall_error: \
|
||||
a pointer (e.g., mmap). */ \
|
||||
move.l %d0, %a0; \
|
||||
rts;
|
||||
#endif /* _LIBC_REENTRANT */
|
||||
#else
|
||||
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
|
||||
#endif
|
||||
#endif /* PIC */
|
||||
|
||||
/* Linux takes system call arguments in registers:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user