# arch/ppc64/setjmp.S
#
# Basic setjmp/longjmp implementation
-# This file was derived from the equivalent file in NetBSD
#
.text
.globl setjmp
.globl .setjmp
.setjmp:
- mflr %r11 /* save return address */
- mfcr %r12 /* save condition register */
- mr %r10,%r1 /* save stack pointer */
- mr %r9,%r2 /* save GPR2 (not needed) */
- stmw %r9,0(%r3) /* save r9..r31 */
- li %r3,0 /* indicate success */
- blr /* return */
+ 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 */
.size .setjmp,.-.setjmp
.section ".opd","aw"
.globl longjmp
.globl .longjmp
.longjmp:
- lmw %r9,0(%r3) /* save r9..r31 */
- mtlr %r11 /* restore LR */
- mtcr %r12 /* restore CR */
- mr %r2,%r9 /* restore GPR2 (not needed) */
- mr %r1,%r10 /* restore stack */
- mr %r3,%r4 /* get return value */
- blr /* return */
+ 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 */
.size .longjmp,.-.longjmp