diff options
-rw-r--r-- | src/vppinfra/longjmp.S | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/src/vppinfra/longjmp.S b/src/vppinfra/longjmp.S index 0b7449f8669..c151343cdc3 100644 --- a/src/vppinfra/longjmp.S +++ b/src/vppinfra/longjmp.S @@ -59,21 +59,21 @@ cdecl(clib_setjmp): /* Save SP after return. */ leaq 8(%rsp), %rdx movq %rdx, 8*6(%rdi) - + /* Save PC we are returning to from stack frame. */ movq 0(%rsp), %rax movq %rax, 8*7(%rdi) - + /* Give back user's return value. */ movq %rsi, %rax ret - + .global cdecl(clib_longjmp) .align 4 #ifndef __APPLE__ .type cdecl(clib_longjmp), @function #endif -cdecl(clib_longjmp): +cdecl(clib_longjmp): /* Restore regs. */ movq 8*0(%rdi), %rbx movq 8*1(%rdi), %rbp @@ -83,13 +83,13 @@ cdecl(clib_longjmp): movq 8*5(%rdi), %r15 movq 8*6(%rdi), %rsp movq 8*7(%rdi), %rdx - + /* Give back user's return value. */ movq %rsi, %rax - + /* Away we go. */ - jmpq *%rdx - + jmpq *%rdx + .global cdecl(clib_calljmp) .align 4 #ifndef __APPLE__ @@ -100,33 +100,33 @@ cdecl(clib_calljmp): movq %rdx, %rax andq $0xf, %rax subq %rax, %rdx - + /* Get return address. */ pop %rax - + /* Switch to new stack. */ xchgq %rsp, %rdx - + /* Save return address on new stack. */ push %rax - + /* Save old stack pointer on new stack. */ push %rdx - + /* Get function. */ movq %rdi, %rdx - + /* Move argument into place. */ movq %rsi, %rdi - + /* Away we go. */ callq *%rdx - + /* Switch back to old stack. */ movq 8(%rsp), %rdx movq 0(%rsp), %rcx xchgq %rcx, %rsp - + /* Return to caller. */ jmpq *%rdx @@ -136,7 +136,7 @@ cdecl(clib_calljmp): .type cdecl(clib_setjmp), @function cdecl(clib_setjmp): movl 4(%esp), %ecx - + movl %ebp, 4*0(%ecx) movl %ebx, 4*1(%ecx) movl %edi, 4*2(%ecx) @@ -145,24 +145,24 @@ cdecl(clib_setjmp): /* Save SP after return. */ leal 4(%esp), %edx movl %edx, 4*4(%ecx) - + /* Save PC we are returning to from stack frame. */ movl 0(%esp), %eax movl %eax, 4*5(%ecx) - + /* Give back user's return value. */ movl 8(%esp), %eax ret - + .global cdecl(clib_longjmp) .align 4 .type cdecl(clib_longjmp), @function -cdecl(clib_longjmp): +cdecl(clib_longjmp): movl 4(%esp), %ecx - + /* Give back user's return value. */ movl 8(%esp), %eax - + /* Restore regs. */ movl 4*0(%ecx), %ebp movl 4*1(%ecx), %ebx @@ -170,45 +170,45 @@ cdecl(clib_longjmp): movl 4*3(%ecx), %esi movl 4*4(%ecx), %esp movl 4*5(%ecx), %edx - + /* Away we go. */ - jmp *%edx - + jmp *%edx + .global cdecl(clib_calljmp) .align 4 .type cdecl(clib_calljmp), @function -cdecl(clib_calljmp): +cdecl(clib_calljmp): /* Get new stack pointer. */ movl 12(%esp), %edx - + /* Switch stacks. */ xchgl %esp, %edx - + /* Save old stack pointer on new stack. */ sub $8, %esp movl %edx, 4(%esp) - + /* Put function argument in stack frame. */ movl 8(%edx), %eax movl %eax, 0(%esp) - + /* Get function. */ movl 4(%edx), %eax - + /* Away we go. */ call *%eax - + /* Switch back to old stack. */ movl 4(%esp), %edx xchgl %edx, %esp - + /* Return to caller. */ ret - + #elif defined(__SPU__) - + #elif defined(__powerpc64__) - + .text #define _prologue(n) \ @@ -230,7 +230,7 @@ _ (26, 12) _ (27, 13) _ (28, 14) _ (29, 15) _ (30, 16) _ (31, 17) #define _foreach_20_31 \ _ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \ _ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11) - + #ifdef __ALTIVEC__ #define CLIB_POWERPC_ALTIVEC_N_REGS 12 #else @@ -246,14 +246,14 @@ _prologue (cdecl(clib_setjmp)) std 0, 8*3(3) mfspr 0, 256 stw 0, 8*4(3) - + /* gprs 14 - 31 */ -#define _(a,b) std a, 8*((b) + 4 + 18*0)(3) ; +#define _(a,b) std a, 8*((b) + 4 + 18*0)(3) ; _foreach_14_31 #undef _ - + /* fprs 14 - 31 */ -#define _(a,b) stfd a, 8*((b) + 4 + 18*1)(3) ; +#define _(a,b) stfd a, 8*((b) + 4 + 18*1)(3) ; _foreach_14_31 #undef _ @@ -264,12 +264,12 @@ _prologue (cdecl(clib_setjmp)) _foreach_20_31 #undef _ #endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */ - + /* Return value. */ mr 3, 4 - + blr - + _prologue (cdecl(clib_longjmp)) ld 0, 8*0(3) mtlr 0 @@ -279,17 +279,17 @@ _prologue (cdecl(clib_longjmp)) mtcrf 0xff, 0 lwz 0, 8*3(3) mtspr 256, 0 - + /* gprs 14 - 31 */ -#define _(a,b) ld a, 8*((b) + 4 + 18*0)(3) ; +#define _(a,b) ld a, 8*((b) + 4 + 18*0)(3) ; _foreach_14_31 #undef _ - + /* fprs 14 - 31 */ -#define _(a,b) lfd a, 8*((b) + 4 + 18*1)(3) ; +#define _(a,b) lfd a, 8*((b) + 4 + 18*1)(3) ; _foreach_14_31 #undef _ - + #if CLIB_POWERPC_ALTIVEC_N_REGS > 0 /* vrs 20 - 31 */ li 5, 8*(4 + 18*2) @@ -297,10 +297,10 @@ _prologue (cdecl(clib_longjmp)) _foreach_20_31 #undef _ #endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */ - + /* Return value. */ mr 3, 4 - + blr .globl cdecl(clib_calljmp) @@ -339,9 +339,9 @@ cdecl(clib_calljmp): .long 0 .byte 0,0,0,1,128,0,0,0 .size cdecl(clib_calljmp),.-.L.cdecl(clib_calljmp) - + #elif defined(__powerpc__) - + #define _foreach_14_31 \ _ (14, 0) _ (15, 1) _ (16, 2) _ (17, 3) _ (18, 4) _ (19, 5) \ _ (20, 6) _ (21, 7) _ (22, 8) _ (23, 9) _ (24, 10) _ (25, 11) \ @@ -350,7 +350,7 @@ _ (26, 12) _ (27, 13) _ (28, 14) _ (29, 15) _ (30, 16) _ (31, 17) #define _foreach_20_31 \ _ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \ _ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11) - + #ifdef __ALTIVEC__ #define CLIB_POWERPC_ALTIVEC_N_REGS 12 #else @@ -370,19 +370,19 @@ cdecl(clib_setjmp): mfspr 0, 256 #endif stw 0, 4*3(3) - + #if CLIB_POWERPC_ALTIVEC_N_REGS > 0 li 5, 4*4 #define _(a,b) stvx a, 3, 5 ; addi 5, 5, 16 ; _foreach_20_31 #undef _ #endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */ - + /* gp 14 - 31 */ -#define _(a,b) stw a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ; +#define _(a,b) stw a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ; _foreach_14_31 #undef _ - + /* fp 14 - 31 */ #define _(a,b) stfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ; _foreach_14_31 @@ -390,14 +390,14 @@ cdecl(clib_setjmp): /* Return value. */ mr 3, 4 - + blr - + .global cdecl(clib_longjmp) .align 4 .type cdecl(clib_longjmp), @function -cdecl(clib_longjmp): - +cdecl(clib_longjmp): + lwz 0, 4*0(3) mtlr 0 lwz 1, 4*1(3) @@ -407,19 +407,19 @@ cdecl(clib_longjmp): #if CLIB_POWERPC_ALTIVEC_N_REGS > 0 mtspr 256, 0 #endif - + #if CLIB_POWERPC_ALTIVEC_N_REGS > 0 li 5, 4*4 #define _(a,b) lvx a, 3, 5 ; addi 5, 5, 16 ; _foreach_20_31 #undef _ #endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */ - + /* gp 14 - 31 */ #define _(a,b) lwz a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ; _foreach_14_31 #undef _ - + /* fp 14 - 31 */ #define _(a,b) lfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ; _foreach_14_31 @@ -427,50 +427,50 @@ cdecl(clib_longjmp): /* Return value. */ mr 3, 4 - + blr .global cdecl(clib_calljmp) .align 4 .type cdecl(clib_calljmp), @function -cdecl(clib_calljmp): +cdecl(clib_calljmp): /* Make sure stack is 16 byte aligned. */ andi. 0, 5, 0xf sub 5, 5, 0 addi 5, 5, -16 - + /* Save old stack/link pointer on new stack. */ stw 1, 0(5) mflr 0 stw 0, 4(5) - + /* account for (sp, lr) tuple, and keep aligned */ addi 5, 5, -16 - + /* Switch stacks. */ mr 1, 5 - + /* Move argument into place. */ mtctr 3 mr 3, 4 - + /* Away we go. */ bctrl - + /* back to our synthetic frame */ addi 1,1,16 - + /* Switch back to old stack. */ lwz 0, 4(1) mtlr 0 lwz 0, 0(1) mr 1, 0 - + /* Return to caller. */ blr - + #elif defined(__arm__) - + .global cdecl(clib_setjmp) .align 4 .type cdecl(clib_setjmp), %function @@ -479,7 +479,7 @@ cdecl(clib_setjmp): /* Save integer registers */ stmia ip!, {v1-v6, sl, fp, sp, lr} - + #ifdef __IWMMXT__ /* Save the call-preserved iWMMXt registers. */ wstrd wr10, [ip], #8 @@ -493,16 +493,16 @@ cdecl(clib_setjmp): /* Give back user's return value. */ mov r0, r1 bx lr - + .global cdecl(clib_longjmp) .align 4 .type cdecl(clib_longjmp), %function -cdecl(clib_longjmp): +cdecl(clib_longjmp): mov ip, r0 /* jmp buffer */ /* Restore integer registers. */ ldmia ip!, {v1-v6, sl, fp, sp, lr} - + #ifdef __IWMMXT__ /* Save the call-preserved iWMMXt registers. */ wldrd wr10, [ip], #8 @@ -512,7 +512,7 @@ cdecl(clib_longjmp): wldrd wr14, [ip], #8 wldrd wr15, [ip], #8 #endif - + /* Give back user's return value. */ mov r0, r1 bx lr @@ -520,39 +520,39 @@ cdecl(clib_longjmp): .global cdecl(clib_calljmp) .align 4 .type cdecl(clib_calljmp), %function -cdecl(clib_calljmp): +cdecl(clib_calljmp): /* Make sure stack is 8 byte aligned. */ bic r2, r2, #7 - + /* Allocate space for stack/link pointer on new stack. */ - sub r2, r2, #8 - + sub r2, r2, #8 + /* Save old stack/link pointer on new stack. */ str sp, [r2, #0] str lr, [r2, #4] - + /* Switch stacks. */ mov sp, r2 - + /* Save function to call. */ mov ip, r0 - + /* Move argument into place. */ mov r0, r1 - + /* Away we go. */ bx ip - + /* Switch back to old stack. */ ldr lr, [sp, #4] ldr ip, [sp, #0] mov sp, ip - + /* Return to caller. */ bx lr - + #elif defined(__xtensa__) - + /* FIXME implement if needed. */ .global cdecl(clib_setjmp) .align 4 @@ -563,17 +563,17 @@ cdecl(clib_setjmp): .global cdecl(clib_longjmp) .align 4 .type cdecl(clib_longjmp), @function -cdecl(clib_longjmp): +cdecl(clib_longjmp): 1: j 1b - + .global cdecl(clib_calljmp) .align 4 .type cdecl(clib_calljmp), %function -cdecl(clib_calljmp): +cdecl(clib_calljmp): 1: j 1b - + #elif defined(__TMS320C6X__) - + /* FIXME implement if needed. */ .global cdecl(clib_setjmp) .align 4 @@ -584,15 +584,15 @@ cdecl(clib_setjmp): .global cdecl(clib_longjmp) .align 4 .type cdecl(clib_longjmp), @function -cdecl(clib_longjmp): +cdecl(clib_longjmp): 1: B .S1 1b - + .global cdecl(clib_calljmp) .align 4 .type cdecl(clib_calljmp), %function -cdecl(clib_calljmp): +cdecl(clib_calljmp): 1: B .S1 1b - + #elif defined(_mips) && __mips == 64 .global cdecl(clib_setjmp) @@ -749,11 +749,11 @@ cdecl(clib_calljmp): mov x0, x1 // switch stacks mov x4, sp - + // space for saved sp, lr on new stack sub x2, x2, #16 mov sp, x2 - + // save old sp and link register on new stack str x4, [sp] str x30,[sp,#8] @@ -761,10 +761,10 @@ cdecl(clib_calljmp): // go there blr x3 - + // restore old sp and link register mov x4, sp - + ldr x3, [x4] ldr x30,[x4, #8] mov sp, x3 @@ -772,7 +772,7 @@ cdecl(clib_calljmp): .size cdecl(clib_calljmp), .-cdecl(clib_calljmp) #else #error "unknown machine" -#endif +#endif #ifndef __APPLE__ .section .note.GNU-stack,"",%progbits |