ref: 0227f08f277216ef979a859e1170aff185205abb
parent: 5728cad35151d5021badd8c7fcf6273fda4a9320
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Apr 23 11:50:52 EDT 2020
libc: Add setjmp and longjmp for ppc32
--- a/src/libc/arch/ppc32/longjmp.s
+++ b/src/libc/arch/ppc32/longjmp.s
@@ -1,0 +1,62 @@
+ .file "longjmp.s"
+ .text
+ .global longjmp
+
+longjmp:
+ /* 0) move old return address into r0 */
+ lwz 0,0(3)
+ /* 1) put it into link reg */
+ mtlr 0
+ /* 2 ) restore stack ptr */
+ lwz 1,4(3)
+ /* 3) restore control reg */
+ lwz 0,8(3)
+ mtcr 0
+ /* 4) restore r14-r31 */
+ lwz 14,12(3)
+ lwz 15,16(3)
+ lwz 16,20(3)
+ lwz 17,24(3)
+ lwz 18,28(3)
+ lwz 19,32(3)
+ lwz 20,36(3)
+ lwz 21,40(3)
+ lwz 22,44(3)
+ lwz 23,48(3)
+ lwz 24,52(3)
+ lwz 25,56(3)
+ lwz 26,60(3)
+ lwz 27,64(3)
+ lwz 28,68(3)
+ lwz 29,72(3)
+ lwz 30,76(3)
+ lwz 31,80(3)
+ lfd 14,88(3)
+ lfd 15,96(3)
+ lfd 16,104(3)
+ lfd 17,112(3)
+ lfd 18,120(3)
+ lfd 19,128(3)
+ lfd 20,136(3)
+ lfd 21,144(3)
+ lfd 22,152(3)
+ lfd 23,160(3)
+ lfd 24,168(3)
+ lfd 25,176(3)
+ lfd 26,184(3)
+ lfd 27,192(3)
+ lfd 28,200(3)
+ lfd 29,208(3)
+ lfd 30,216(3)
+ lfd 31,224(3)
+
+ /* 5) put val into return reg r3 */
+ mr 3,4
+
+ /* 6) check if return value is 0, make it 1 in that case */
+ cmpwi cr7,4,0
+ bne cr7,1f
+ li 3, 1
+1:
+ blr
+
--- a/src/libc/arch/ppc32/setjmp.s
+++ b/src/libc/arch/ppc32/setjmp.s
@@ -1,0 +1,56 @@
+ .file "setjmp.s"
+ .text
+ .global setjmp
+
+setjmp:
+ /* 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) */
+ mflr 0
+ stw 0,0(3)
+ /* 1) store reg1 (SP) */
+ stw 1, 4(3)
+ /* 2) store cr */
+ mfcr 0
+ stw 0,8(3)
+ /* 3) store r14-31 */
+ stw 14,12(3)
+ stw 15,16(3)
+ stw 16,20(3)
+ stw 17,24(3)
+ stw 18,28(3)
+ stw 19,32(3)
+ stw 20,36(3)
+ stw 21,40(3)
+ stw 22,44(3)
+ stw 23,48(3)
+ stw 24,52(3)
+ stw 25,56(3)
+ stw 26,60(3)
+ stw 27,64(3)
+ stw 28,68(3)
+ stw 29,72(3)
+ stw 30,76(3)
+ stw 31,80(3)
+ stfd 14,88(3)
+ stfd 15,96(3)
+ stfd 16,104(3)
+ stfd 17,112(3)
+ stfd 18,120(3)
+ stfd 19,128(3)
+ stfd 20,136(3)
+ stfd 21,144(3)
+ stfd 22,152(3)
+ stfd 23,160(3)
+ stfd 24,168(3)
+ stfd 25,176(3)
+ stfd 26,184(3)
+ stfd 27,192(3)
+ stfd 28,200(3)
+ stfd 29,208(3)
+ stfd 30,216(3)
+ stfd 31,224(3)
+
+ /* 4) set return value to 0 */
+ li 3,0
+
+ /* 5) return */
+ blr