| /* $FreeBSD$ */ |
| /* from: NetBSD: setjmp.S,v 1.1 1998/01/27 15:13:12 sakamoto Exp $ */ |
| /* from: OpenBSD: setjmp.S,v 1.2 1996/12/28 06:22:18 rahnds Exp */ |
| /* kernel version of this file, does not have signal goop */ |
| /* int setjmp(jmp_buf env) */ |
| |
| #define _ASM |
| #include <asm/types.h> |
| |
| #ifdef __powerpc64__ |
| #if !defined(PPC64_ELF_ABI_v2) && !defined(PPC64_ELF_ABI_v1) |
| #if defined(_CALL_ELF) && _CALL_ELF == 2 |
| #define PPC64_ELF_ABI_v2 |
| #endif /* _CALL_ELF */ |
| #endif /* PPC64_ELF_ABI_ */ |
| #endif /* __powerpc64__ */ |
| |
| #ifdef __powerpc64__ |
| #define LD_REG ld |
| #define ST_REG std |
| #define REGWIDTH 8 |
| #else |
| #define LD_REG lwz |
| #define ST_REG stw |
| #define REGWIDTH 4 |
| #endif /* __powerpc64__ */ |
| |
| #define JMP_r1 1*REGWIDTH |
| #define JMP_r2 2*REGWIDTH |
| #define JMP_r14 3*REGWIDTH |
| #define JMP_r15 4*REGWIDTH |
| #define JMP_r16 5*REGWIDTH |
| #define JMP_r17 6*REGWIDTH |
| #define JMP_r18 7*REGWIDTH |
| #define JMP_r19 8*REGWIDTH |
| #define JMP_r20 9*REGWIDTH |
| #define JMP_r21 10*REGWIDTH |
| #define JMP_r22 11*REGWIDTH |
| #define JMP_r23 12*REGWIDTH |
| #define JMP_r24 13*REGWIDTH |
| #define JMP_r25 14*REGWIDTH |
| #define JMP_r26 15*REGWIDTH |
| #define JMP_r27 16*REGWIDTH |
| #define JMP_r28 17*REGWIDTH |
| #define JMP_r29 18*REGWIDTH |
| #define JMP_r30 19*REGWIDTH |
| #define JMP_r31 20*REGWIDTH |
| #define JMP_lr 21*REGWIDTH |
| #define JMP_cr 22*REGWIDTH |
| #define JMP_ctr 23*REGWIDTH |
| #define JMP_xer 24*REGWIDTH |
| |
| #ifdef __powerpc64__ |
| #ifdef PPC64_ELF_ABI_v2 |
| |
| #define ENTRY(name) \ |
| .align 2 ; \ |
| .type name,@function; \ |
| .weak name; \ |
| name: |
| |
| #else /* PPC64_ELF_ABI_v1 */ |
| |
| #define XGLUE(a,b) a##b |
| #define GLUE(a,b) XGLUE(a,b) |
| #define ENTRY(name) \ |
| .align 2 ; \ |
| .weak name; \ |
| .weak GLUE(.,name); \ |
| .pushsection ".opd","aw"; \ |
| name: \ |
| .quad GLUE(.,name); \ |
| .quad .TOC.@tocbase; \ |
| .quad 0; \ |
| .popsection; \ |
| .type GLUE(.,name),@function; \ |
| GLUE(.,name): |
| |
| #endif /* PPC64_ELF_ABI_v2 */ |
| |
| #else /* 32-bit */ |
| |
| #define ENTRY(name) \ |
| .text; \ |
| .p2align 4; \ |
| .weak name; \ |
| .type name,@function; \ |
| name: |
| |
| #endif /* __powerpc64__ */ |
| |
| |
| ENTRY(setjmp) |
| ST_REG 31, JMP_r31(3) |
| /* r1, r2, r14-r30 */ |
| ST_REG 1, JMP_r1 (3) |
| ST_REG 2, JMP_r2 (3) |
| ST_REG 14, JMP_r14(3) |
| ST_REG 15, JMP_r15(3) |
| ST_REG 16, JMP_r16(3) |
| ST_REG 17, JMP_r17(3) |
| ST_REG 18, JMP_r18(3) |
| ST_REG 19, JMP_r19(3) |
| ST_REG 20, JMP_r20(3) |
| ST_REG 21, JMP_r21(3) |
| ST_REG 22, JMP_r22(3) |
| ST_REG 23, JMP_r23(3) |
| ST_REG 24, JMP_r24(3) |
| ST_REG 25, JMP_r25(3) |
| ST_REG 26, JMP_r26(3) |
| ST_REG 27, JMP_r27(3) |
| ST_REG 28, JMP_r28(3) |
| ST_REG 29, JMP_r29(3) |
| ST_REG 30, JMP_r30(3) |
| /* cr, lr, ctr, xer */ |
| mfcr 0 |
| ST_REG 0, JMP_cr(3) |
| mflr 0 |
| ST_REG 0, JMP_lr(3) |
| mfctr 0 |
| ST_REG 0, JMP_ctr(3) |
| mfxer 0 |
| ST_REG 0, JMP_xer(3) |
| /* f14-f31, fpscr */ |
| li 3, 0 |
| blr |
| |
| ENTRY(longjmp) |
| LD_REG 31, JMP_r31(3) |
| /* r1, r2, r14-r30 */ |
| LD_REG 1, JMP_r1 (3) |
| LD_REG 2, JMP_r2 (3) |
| LD_REG 14, JMP_r14(3) |
| LD_REG 15, JMP_r15(3) |
| LD_REG 16, JMP_r16(3) |
| LD_REG 17, JMP_r17(3) |
| LD_REG 18, JMP_r18(3) |
| LD_REG 19, JMP_r19(3) |
| LD_REG 20, JMP_r20(3) |
| LD_REG 21, JMP_r21(3) |
| LD_REG 22, JMP_r22(3) |
| LD_REG 23, JMP_r23(3) |
| LD_REG 24, JMP_r24(3) |
| LD_REG 25, JMP_r25(3) |
| LD_REG 26, JMP_r26(3) |
| LD_REG 27, JMP_r27(3) |
| LD_REG 28, JMP_r28(3) |
| LD_REG 29, JMP_r29(3) |
| LD_REG 30, JMP_r30(3) |
| /* cr, lr, ctr, xer */ |
| LD_REG 0, JMP_cr(3) |
| mtcr 0 |
| LD_REG 0, JMP_lr(3) |
| mtlr 0 |
| LD_REG 0, JMP_ctr(3) |
| mtctr 0 |
| LD_REG 0, JMP_xer(3) |
| mtxer 0 |
| /* f14-f31, fpscr */ |
| mr 3, 4 |
| blr |
| |
| #ifdef __ELF__ |
| .section .note.GNU-stack,"",%progbits |
| #endif |