diff options
Diffstat (limited to 'sysdeps/unix/mips/sysdep.S')
-rw-r--r-- | sysdeps/unix/mips/sysdep.S | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/sysdeps/unix/mips/sysdep.S b/sysdeps/unix/mips/sysdep.S index fa8888663e..f3974bf589 100644 --- a/sysdeps/unix/mips/sysdep.S +++ b/sysdeps/unix/mips/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1992,93,94,97,98,99 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Brendan Kehoe (brendan@zen.org). @@ -21,21 +21,59 @@ #define _ERRNO_H #include <bits/errno.h> - .bss - .globl errno -#ifdef __ELF__ - .type errno, @object +#ifdef _LIBC_REENTRANT + +ENTRY(__syscall_error) +#ifdef PIC + .set noreorder + .set noat + move $1, $31 + bltzal $0, 0f + nop +0: .cpload $31 + move $31, $1 + .set at + .set reorder +#endif + subu sp, 32 +#ifdef __PIC__ + .cprestore 16 +#endif + sw v0, 20(sp) + sw ra, 24(sp) + +#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. */ + bne v0, EWOULDBLOCK_sys, skip + nop + li v0, EAGAIN +skip: #endif - .size errno, 4 -errno: - .space 4 + /* Store it in the "real" variable ... */ + sw v0, errno -weak_alias (errno, _errno) + /* Find our per-thread errno address */ + jal __errno_location + + /* Store the error value. */ + lw t0, 20(sp) + sw t0, 0(v0) + + /* And just kick back a -1. */ + lw ra, 24(sp) + addiu sp, 32 + li v0, -1 + j ra + END(__syscall_error) + +#else /* _LIBC_REENTRANT */ - .set noreorder ENTRY(__syscall_error) -#ifdef PIC +#ifdef __PIC__ + .set noreorder .set noat move $1, $31 bltzal $0, 0f @@ -43,13 +81,13 @@ ENTRY(__syscall_error) 0: .cpload $31 move $31, $1 .set at + .set reorder #endif #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. */ bne v0, EWOULDBLOCK_sys, skip - nop li v0, EAGAIN skip: #endif @@ -57,10 +95,7 @@ skip: sw v0, errno /* And just kick back a -1. */ - j ra li v0, -1 + j ra END(__syscall_error) - -/* We provide this alias for compatilility with other Unices - like IRIX 5 */ -weak_alias (__syscall_error, syscall_error) +#endif /* _LIBC_REENTRANT */ |