diff options
Diffstat (limited to 'sysdeps/unix/mips')
-rw-r--r-- | sysdeps/unix/mips/sysdep.S | 69 | ||||
-rw-r--r-- | sysdeps/unix/mips/sysdep.h | 10 |
2 files changed, 57 insertions, 22 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 */ diff --git a/sysdeps/unix/mips/sysdep.h b/sysdeps/unix/mips/sysdep.h index 4514d07c66..256b0a78cd 100644 --- a/sysdeps/unix/mips/sysdep.h +++ b/sysdeps/unix/mips/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1995, 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Brendan Kehoe (brendan@zen.org). @@ -29,13 +29,13 @@ .ent name,0; \ name##: -/* Note that while it's better structurally, going back to call syscall_error +/* Note that while it's better structurally, going back to call __syscall_error can make things confusing if you're debugging---it looks like it's jumping backwards into the previous fn. */ -#ifdef __PIC__ +#ifdef PIC #define PSEUDO(name, syscall_name, args) \ .align 2; \ - 99: la t9,syscall_error; \ + 99: la t9,__syscall_error; \ jr t9; \ ENTRY(name) \ .set noreorder; \ @@ -49,7 +49,7 @@ syse1: #define PSEUDO(name, syscall_name, args) \ .set noreorder; \ .align 2; \ - 99: j syscall_error; \ + 99: j __syscall_error; \ ENTRY(name) \ .set noreorder; \ li v0, SYS_##syscall_name; \ |