Now that the TIB conversion is complete, it's safe to convert powerpc to
setting errno directly in the syscall stub without having to go through a
separate function __cerror (which was itself using __errno!).
This has made it through a build and is working on building sets right
now.
ok?
Philip Guenther
Index: arch/powerpc/Makefile.inc
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/Makefile.inc,v
retrieving revision 1.5
diff -u -p -r1.5 Makefile.inc
--- arch/powerpc/Makefile.inc 7 May 2016 19:05:22 -0000 1.5
+++ arch/powerpc/Makefile.inc 14 May 2016 23:57:15 -0000
@@ -1,2 +1 @@
# $OpenBSD: Makefile.inc,v 1.5 2016/05/07 19:05:22 guenther Exp $
-CERROR= cerror.S
Index: arch/powerpc/SYS.h
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/SYS.h,v
retrieving revision 1.21
diff -u -p -r1.21 SYS.h
--- arch/powerpc/SYS.h 7 May 2016 19:05:22 -0000 1.21
+++ arch/powerpc/SYS.h 14 May 2016 20:29:35 -0000
@@ -44,6 +44,15 @@
#include "machine/asm.h"
+
+/* offsetof(struct tib, tib_errno) - offsetof(struct tib, __tib_tcb) */
+#define TCB_OFFSET_ERRNO (-8)
+/* from <powerpc/tcb.h>: TCB address == %r2 - TCB_OFFSET */
+#define TCB_OFFSET 0x7000
+
+/* offset of errno from %r2 */
+#define R2_OFFSET_ERRNO (-TCB_OFFSET + TCB_OFFSET_ERRNO)
+
/*
* We define a hidden alias with the prefix "_libc_" for each global symbol
* that may be used internally. By referencing _libc_x instead of x, other
@@ -68,13 +77,16 @@
#define _CONCAT(x,y) x##y
-#define PSEUDO_PREFIX(p,x,y) .extern _ASM_LABEL(__cerror) ; \
+#define PSEUDO_PREFIX(p,x,y) \
ENTRY(p##x) \
li 0, SYS_##y ; \
/* sc */
#define PSEUDO_SUFFIX cmpwi 0, 0 ; \
beqlr+ ; \
- b _ASM_LABEL(__cerror)
+ stw 0, R2_OFFSET_ERRNO(2); \
+ li 3, -1; \
+ li 4, -1; /* for __syscall(lseek) */ \
+ blr
#define PSEUDO_NOERROR_SUFFIX blr
Index: arch/powerpc/sys/brk.S
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/sys/brk.S,v
retrieving revision 1.12
diff -u -p -r1.12 brk.S
--- arch/powerpc/sys/brk.S 7 May 2016 19:05:22 -0000 1.12
+++ arch/powerpc/sys/brk.S 14 May 2016 23:04:41 -0000
@@ -66,7 +66,9 @@ PSEUDO_PREFIX(,brk,break)
/* check for error */
cmpwi 0, 0
beq+ .L_brk_ok /* OK so this is stupid but I haven't read b */
- b _ASM_LABEL(__cerror)
+ stw 0, R2_OFFSET_ERRNO(2)
+ li 3, -1
+ blr
/* update, __curbrk and return */
.L_brk_ok:
Index: arch/powerpc/sys/sbrk.S
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/sys/sbrk.S,v
retrieving revision 1.11
diff -u -p -r1.11 sbrk.S
--- arch/powerpc/sys/sbrk.S 7 May 2016 19:05:22 -0000 1.11
+++ arch/powerpc/sys/sbrk.S 14 May 2016 20:11:32 -0000
@@ -63,7 +63,9 @@ PSEUDO_PREFIX(,sbrk,break)
/* check for error */
cmpwi 0, 0
beq+ .L_sbrk_ok
- b _ASM_LABEL(__cerror)
+ stw 0, R2_OFFSET_ERRNO(2)
+ li 3, -1
+ blr
/* update, __curbrk and return */
.L_sbrk_ok:
Index: arch/powerpc/sys/sigprocmask.S
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/sys/sigprocmask.S,v
retrieving revision 1.11
diff -u -p -r1.11 sigprocmask.S
--- arch/powerpc/sys/sigprocmask.S 7 May 2016 19:05:22 -0000 1.11
+++ arch/powerpc/sys/sigprocmask.S 14 May 2016 20:12:18 -0000
@@ -49,7 +49,9 @@ PREFIX_HIDDEN(sigprocmask)
/* didnt work? */
cmpwi 0, 0
beq+ .L_sigprocmask_ok
- b _ASM_LABEL(__cerror)
+ stw 0, R2_OFFSET_ERRNO(2)
+ li 3, -1
+ blr
.L_sigprocmask_ok:
lwz 5, 12(1)
Index: arch/powerpc/sys/tfork_thread.S
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/arch/powerpc/sys/tfork_thread.S,v
retrieving revision 1.6
diff -u -p -r1.6 tfork_thread.S
--- arch/powerpc/sys/tfork_thread.S 7 May 2016 19:05:22 -0000 1.6
+++ arch/powerpc/sys/tfork_thread.S 14 May 2016 20:19:21 -0000
@@ -16,19 +16,14 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <sys/syscall.h>
-#include <machine/asm.h>
+#include "SYS.h"
ENTRY(__tfork_thread)
- /* sanity check */
- cmpwi %r5, 0
- beq 1f
-
/* call __tfork */
li %r0, SYS___tfork
sc
cmpwi %r0, 0
- bne 2f
+ bne 1f
/* check if we are parent or child */
cmpwi %r3, 0
@@ -44,7 +39,7 @@ ENTRY(__tfork_thread)
li %r0, SYS___threxit
sc
1:
+ stw 0, R2_OFFSET_ERRNO(%r2)
li %r3, -1
-2:
- b _C_LABEL(__cerror)
+ blr
END(__tfork_thread)