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)

Reply via email to