summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vppinfra/longjmp.S220
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