Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/arch/powerpc64 Replace the branch to __cerror() in ...
details: https://anonhg.NetBSD.org/src/rev/4b7e4f056d18
branches: trunk
changeset: 335536:4b7e4f056d18
user: dennis <dennis%NetBSD.org@localhost>
date: Mon Jan 12 02:48:20 2015 +0000
description:
Replace the branch to __cerror() in powerpc64 syscall stubs
with inline code which does what __cerror() was doing. #ifdef
that code (i.e. all code) out of cerror.S; __cerror() is no more.
This seems to be necessary to fix the link of rescue/rescue, and
should have the pleasant side effect of making all other workarounds
done to keep the 'b __cerror' working unnecessary.
diffstat:
lib/libc/arch/powerpc64/SYS.h | 42 +++++++++++++++++++++++++++++------
lib/libc/arch/powerpc64/sys/cerror.S | 23 ++++++++++---------
2 files changed, 46 insertions(+), 19 deletions(-)
diffs (115 lines):
diff -r 8c1f6e112b18 -r 4b7e4f056d18 lib/libc/arch/powerpc64/SYS.h
--- a/lib/libc/arch/powerpc64/SYS.h Mon Jan 12 02:32:33 2015 +0000
+++ b/lib/libc/arch/powerpc64/SYS.h Mon Jan 12 02:48:20 2015 +0000
@@ -1,13 +1,39 @@
-/* $NetBSD: SYS.h,v 1.3 2014/08/23 02:24:22 matt Exp $ */
+/* $NetBSD: SYS.h,v 1.4 2015/01/12 02:48:20 dennis Exp $ */
#include <machine/asm.h>
#include <sys/syscall.h>
-#ifdef _CALL_AIX
-#define BRANCH_TO_CERROR() b ._C_LABEL(__cerror); nop
-#else
-#define BRANCH_TO_CERROR() b _C_LABEL(__cerror)
-#endif
+/*
+ * Inline what __cerror() is generally used to do since branching
+ * to __cerror() can't be done reliably with the powerpc64 ABI.
+ */
+#ifdef _REENTRANT
+#define _DO_CERROR_SF_SZ (SF_SZ + SF_ALIGN(8))
+#define _DO_CERROR() mflr %r0 ;\
+ streg %r31,-8(%r1) ;\
+ streg %r0,SF_LR(%r1) ;\
+ stptru %r1,-_DO_CERROR_SF_SZ(%r1) ;\
+ mr %r31,%r3 ;\
+ bl PIC_PLT(_C_LABEL(__errno)) ;\
+ nop ;\
+ stint %r31,0(%r3) ;\
+ addi %r1,%r1,_DO_CERROR_SF_SZ ;\
+ ldreg %r0,SF_LR(%r1) ;\
+ ldreg %r31,-8(%r1) ;\
+ mtlr %r0 ;\
+ li %r3,-1 ;\
+ li %r4,-1 ;\
+ blr
+#else /* !_REENTRANT */
+#define _DO_CERROR() lwz %r4,_C_LABEL(errno)@got(%r2) ;\
+ stw %r3,0(%r4) ;\
+ li %r3,-1 ;\
+ li %r4,-1 ;\
+ blr
+#endif /* _REENTRANT */
+
+/* Clearly BRANCH_TO_CERROR() no longer does that... */
+#define BRANCH_TO_CERROR() _DO_CERROR()
#define _DOSYSCALL(x) li %r0,(SYS_ ## x) ;\
sc
@@ -19,7 +45,7 @@
#define _SYSCALL(x,y) .text ;\
.p2align 2 ;\
- 2: BRANCH_TO_CERROR() ;\
+ 2: _DO_CERROR() ;\
_SYSCALL_NOERROR(x,y) ;\
bso 2b
@@ -33,7 +59,7 @@
#define PSEUDO(x,y) _SYSCALL_NOERROR(x,y) ;\
bnslr ;\
- BRANCH_TO_CERROR() ;\
+ _DO_CERROR() ;\
END(x)
#define RSYSCALL_NOERROR(x) PSEUDO_NOERROR(x,x)
diff -r 8c1f6e112b18 -r 4b7e4f056d18 lib/libc/arch/powerpc64/sys/cerror.S
--- a/lib/libc/arch/powerpc64/sys/cerror.S Mon Jan 12 02:32:33 2015 +0000
+++ b/lib/libc/arch/powerpc64/sys/cerror.S Mon Jan 12 02:48:20 2015 +0000
@@ -1,5 +1,8 @@
-/* $NetBSD: cerror.S,v 1.6 2014/08/23 02:24:22 matt Exp $ */
+/* $NetBSD: cerror.S,v 1.7 2015/01/12 02:48:20 dennis Exp $ */
+/* Now inlined in the syscall stubs. Keep code for a while for mind changes. */
+
+#if 0
#include <machine/asm.h>
#include "SYS.h"
@@ -13,26 +16,24 @@
ENTRY(__cerror)
#ifdef _REENTRANT
mflr %r0
- streg %r0,__SIZEOF_POINTER__(%r1)
- stptru %r1,-(4*__SIZEOF_POINTER__)(%r1) # allocate new stack frame
- streg %r31,(3*__SIZEOF_POINTER__)(%r1)
+ streg %r0,SF_LR(%r1)
+ streg %r31,-8(%r1)
+ stptru %r1,-(SF_SZ+16)(%r1) # allocate new stack frame
mr %r31,%r3 # stash away in callee-saved register
bl PIC_PLT(_C_LABEL(__errno))
nop
stint %r31,0(%r3)
- ldreg %r31,(3*__SIZEOF_POINTER__)(%r1)
- addi %r1,%r1,4*__SIZEOF_POINTER__
- ldreg %r0,__SIZEOF_POINTER__(%r1)
+ addi %r1,%r1,(SF_SZ+16)
+ ldreg %r31,-8(%r1)
+ ldreg %r0,SF_LR(%r1)
mtlr %r0
#else
- .pushsection ".toc", "aw"
-.Lerrno:.tc errno[TC], errno
- .popsection
- lwz %r4,_C_LABEL(.Lerrno)@toc(%r2)
+ lwz %r4,_C_LABEL(errno)@got(%r2)
stw %r3,0(%r4)
#endif /* _REENTRANT */
li %r3,-1
li %r4,-1
blr
END(__cerror)
+#endif /* 0 */
Home |
Main Index |
Thread Index |
Old Index