Module Name: src
Committed By: simonb
Date: Sat Feb 6 06:58:59 UTC 2021
Modified Files:
src/lib/libc/arch/mips/sys: cerror.S
Log Message:
For mips n32/n64 explicitly save the GP reg on the stack, and
restore it _after_ the call to __errno(). Fixes sending the
__errno() call off to nowhereland when this code is included
in another library (eg __posix_cerror() in libposix). Failure
picked up by the ATF lib/libposix/posix1/t_rename test.
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/lib/libc/arch/mips/sys/cerror.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/arch/mips/sys/cerror.S
diff -u src/lib/libc/arch/mips/sys/cerror.S:1.19 src/lib/libc/arch/mips/sys/cerror.S:1.20
--- src/lib/libc/arch/mips/sys/cerror.S:1.19 Thu Sep 12 15:36:15 2013
+++ src/lib/libc/arch/mips/sys/cerror.S Sat Feb 6 06:58:59 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: cerror.S,v 1.19 2013/09/12 15:36:15 joerg Exp $ */
+/* $NetBSD: cerror.S,v 1.20 2021/02/06 06:58:59 simonb Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -38,7 +38,7 @@
#if 0
RCSID("from: @(#)cerror.s 8.1 (Berkeley) 6/16/93")
#else
- RCSID("$NetBSD: cerror.S,v 1.19 2013/09/12 15:36:15 joerg Exp $")
+ RCSID("$NetBSD: cerror.S,v 1.20 2021/02/06 06:58:59 simonb Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
@@ -50,24 +50,33 @@
.globl _C_LABEL(__errno)
NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
- PIC_PROLOGUE(__cerror)
+ PIC_PROLOGUE(__cerror) # saves caller gp in t3 (n32/n64)
PTR_SUBU sp, CALLFRAME_SIZ
PTR_S ra, CALLFRAME_RA(sp)
INT_S v0, CALLFRAME_S0(sp) # save errno value
+#if defined(__mips_n32) || defined(__mips_n64)
+ PTR_S t3, CALLFRAME_GP(sp) # save caller gp (in t3)
+#endif
SAVE_GP(CALLFRAME_GP)
PTR_LA t9, _C_LABEL(__errno) # locate address of errno
- RESTORE_GP64 # restore GP (from t3)
+
jalr t9 # __errno()
+#if defined(__mips_n32) || defined(__mips_n64)
+ PTR_L gp, CALLFRAME_GP(sp) # restore caller gp
+#endif
INT_L t0, CALLFRAME_S0(sp)
PTR_L ra, CALLFRAME_RA(sp)
INT_S t0, 0(v0) # update errno value
PTR_ADDU sp, CALLFRAME_SIZ
li v0, -1
li v1, -1
- j ra # GP has been restored.
+
+ # Note we don't use PIC_RETURN() here as the GP is stored
+ # on the stack and not in the t3 reg (for the n32/n64 case).
+ j ra
END(__cerror)
#else
.globl _C_LABEL(errno)