diff options
Diffstat (limited to 'usr/klibc/arch/ppc64/setjmp.S')
-rw-r--r-- | usr/klibc/arch/ppc64/setjmp.S | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/usr/klibc/arch/ppc64/setjmp.S b/usr/klibc/arch/ppc64/setjmp.S new file mode 100644 index 0000000..ecf9717 --- /dev/null +++ b/usr/klibc/arch/ppc64/setjmp.S @@ -0,0 +1,103 @@ +# +# arch/ppc64/setjmp.S +# +# Basic setjmp/longjmp implementation +# + + .text + .balign 4 + .globl setjmp +#if _CALL_ELF == 2 + .type setjmp,@function +setjmp: +#else + .section ".opd","aw" + .balign 8 +setjmp: + .quad .setjmp, .TOC.@tocbase, 0 + .previous + .type .setjmp,@function + .globl .setjmp +.setjmp: +#endif + mflr %r11 /* save return address */ + mfcr %r12 /* save condition register */ + std %r2,0(%r3) /* save TOC pointer (not needed) */ + stdu %r1,8(%r3) /* save stack pointer */ + stdu %r11,8(%r3) + stdu %r12,8(%r3) + stdu %r13,8(%r3) /* save caller saved regs */ + stdu %r14,8(%r3) + stdu %r15,8(%r3) + stdu %r16,8(%r3) + stdu %r17,8(%r3) + stdu %r18,8(%r3) + stdu %r19,8(%r3) + stdu %r20,8(%r3) + stdu %r21,8(%r3) + stdu %r22,8(%r3) + stdu %r23,8(%r3) + stdu %r24,8(%r3) + stdu %r25,8(%r3) + stdu %r26,8(%r3) + stdu %r27,8(%r3) + stdu %r28,8(%r3) + stdu %r29,8(%r3) + stdu %r30,8(%r3) + std %r31,8(%r3) + li %r3,0 /* indicate success */ + blr /* return */ +#if _CALL_ELF == 2 + .size setjmp,.-setjmp +#else + .size setjmp,.-.setjmp +#endif + + .text + .balign 4 + .globl longjmp +#if _CALL_ELF == 2 + .type longjmp,@function +longjmp: +#else + .section ".opd","aw" + .balign 8 +longjmp: + .quad .longjmp, .TOC.@tocbase, 0 + .previous + .type .longjmp,@function + .globl .longjmp +.longjmp: +#endif + ld %r2,0(%r3) /* restore TOC pointer (not needed) */ + ldu %r1,8(%r3) /* restore stack */ + ldu %r11,8(%r3) + ldu %r12,8(%r3) + ldu %r13,8(%r3) /* restore caller saved regs */ + ldu %r14,8(%r3) + ldu %r15,8(%r3) + ldu %r16,8(%r3) + ldu %r17,8(%r3) + ldu %r18,8(%r3) + ldu %r19,8(%r3) + ldu %r20,8(%r3) + ldu %r21,8(%r3) + ldu %r22,8(%r3) + ldu %r23,8(%r3) + ldu %r24,8(%r3) + ldu %r25,8(%r3) + ldu %r26,8(%r3) + ldu %r27,8(%r3) + ldu %r28,8(%r3) + ldu %r29,8(%r3) + ldu %r30,8(%r3) + ld %r31,8(%r3) + mtlr %r11 /* restore LR */ + mtcr %r12 /* restore CR */ + mr %r3,%r4 /* get return value */ + blr /* return */ +#if _CALL_ELF == 2 + .size longjmp,.-longjmp +#else + .size longjmp,.-.longjmp +#endif |