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
|
clone.S
|
||||||
|
@ -33,8 +33,9 @@ errno: .space 4
|
|||||||
_errno = errno /* This name is expected by hj libc.so.5 startup code. */
|
_errno = errno /* This name is expected by hj libc.so.5 startup code. */
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/* The following code is not used at all in the shared library.
|
/* The following code is only used in the shared library when we
|
||||||
The PIC system call stubs set errno themselves. */
|
compile the reentrant version. Otherwise each system call defines
|
||||||
|
each own version. */
|
||||||
|
|
||||||
#ifndef PIC
|
#ifndef PIC
|
||||||
|
|
||||||
@ -42,30 +43,34 @@ _errno = errno /* This name is expected by hj libc.so.5 startup code. */
|
|||||||
#define _ERRNO_H
|
#define _ERRNO_H
|
||||||
#include <errnos.h>
|
#include <errnos.h>
|
||||||
|
|
||||||
.globl errno
|
|
||||||
.globl __syscall_error
|
|
||||||
|
|
||||||
/* The syscall stubs jump here when they detect an error. */
|
/* The syscall stubs jump here when they detect an error. */
|
||||||
|
|
||||||
.globl __syscall_error
|
.globl __syscall_error
|
||||||
__syscall_error:
|
__syscall_error:
|
||||||
neg.l %d0
|
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
|
move.l %d0, errno
|
||||||
|
#ifdef _LIBC_REENTRANT
|
||||||
|
move.l %d0, -(%sp)
|
||||||
|
jbsr __errno_location
|
||||||
|
move.l (%sp)+, (%a0)
|
||||||
|
#endif
|
||||||
move.l #-1, %d0
|
move.l #-1, %d0
|
||||||
/* Copy return value to %a0 for syscalls that are declared to
|
/* Copy return value to %a0 for syscalls that are declared to
|
||||||
return a pointer. */
|
return a pointer. */
|
||||||
move.l %d0, %a0
|
move.l %d0, %a0
|
||||||
rts
|
rts
|
||||||
|
.size __syscall_error, . - __syscall_error
|
||||||
#endif /* PIC */
|
#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
|
#ifdef PIC
|
||||||
/* Store (- %d0) into errno through the GOT. */
|
/* Store (- %d0) into errno through the GOT. */
|
||||||
|
#ifdef _LIBC_REENTRANT
|
||||||
#define SYSCALL_ERROR_HANDLER \
|
#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: \
|
syscall_error: \
|
||||||
move.l (errno@GOTPC, %pc), %a0; \
|
move.l (errno@GOTPC, %pc), %a0; \
|
||||||
neg.l %d0; \
|
neg.l %d0; \
|
||||||
@ -88,9 +105,10 @@ syscall_error: \
|
|||||||
a pointer (e.g., mmap). */ \
|
a pointer (e.g., mmap). */ \
|
||||||
move.l %d0, %a0; \
|
move.l %d0, %a0; \
|
||||||
rts;
|
rts;
|
||||||
|
#endif /* _LIBC_REENTRANT */
|
||||||
#else
|
#else
|
||||||
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
|
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
|
||||||
#endif
|
#endif /* PIC */
|
||||||
|
|
||||||
/* Linux takes system call arguments in registers:
|
/* Linux takes system call arguments in registers:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user