about summary refs log tree commit diff
path: root/sysdeps/unix/mips/sysdep.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/mips/sysdep.S')
-rw-r--r--sysdeps/unix/mips/sysdep.S69
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  */