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