shithub: scc

Download patch

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