vppinfra: fix coverity issue CID 323952
[vpp.git] / src / vppinfra / longjmp.S
index c151343..c509087 100644 (file)
@@ -209,19 +209,6 @@ cdecl(clib_calljmp):
 
 #elif defined(__powerpc64__)
 
-       .text
-
-#define _prologue(n)                           \
-    .align 2 ;                                 \
-    .globl n, .##n ;                           \
-    .section ".opd", "aw" ;                    \
-    .align 3 ;                                 \
-n:  .quad .##n, .TOC.@tocbase, 0 ;             \
-    .previous ;                                        \
-    .size n, 24 ;                              \
-    .type .##n, @function ;                    \
-.##n:
-
 #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)      \
@@ -237,7 +224,53 @@ _ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11)
 #define CLIB_POWERPC_ALTIVEC_N_REGS 0
 #endif
 
-_prologue (cdecl(clib_setjmp))
+#if _CALL_ELF == 2
+
+#define _prologue(n)                           \
+       .globl n ;                              \
+       .p2align 4 ;                            \
+       .type n, @function ;                    \
+n: ;                                           \
+.L##n##_begin: ;
+
+#define _gep_lep(n)                            \
+.L##n##_gep: ;                                 \
+       addis 2, 12, .TOC.-.L##n##_gep@ha ;     \
+       addi 2, 2, .TOC.-.L##n##_gep@l ;        \
+.L##n##_lep: ;                                 \
+       .localentry n, .L##n##_lep-.L##n##_gep
+
+#else /* _CALL_ELF == 1 */
+
+#define _prologue(n)                           \
+    .globl n ;                                 \
+    .p2align 4 ;                               \
+    .type .##n, @function ;                    \
+    .section ".opd", "aw" ,@progbits ;         \
+n: ;                                           \
+    .p2align 3 ;                               \
+    .quad .L##n##_begin ;                      \
+    .quad .TOC.@tocbase ;                      \
+    .quad 0 ;                                  \
+    .text ;                                    \
+.L##n##_begin: ;
+
+#endif
+
+#define _epilogue(n)                           \
+       .long   0 ;                             \
+       .quad   0 ;                             \
+.L##n##_end: ;                                 \
+       .size   n, .L##n##_end-.L##n##_begin
+
+#if _CALL_ELF == 2
+       .abiversion 2
+       .section        ".text"
+#else
+       .text
+#endif
+
+_prologue(clib_setjmp)
        mflr 0
        std 0, 8*0(3)
        std 1, 8*1(3)
@@ -267,10 +300,10 @@ _prologue (cdecl(clib_setjmp))
 
        /* Return value. */
        mr 3, 4
-
        blr
+_epilogue(clib_setjmp)
 
-_prologue (cdecl(clib_longjmp))
+_prologue(clib_longjmp)
        ld 0, 8*0(3)
        mtlr 0
        ld 1, 8*1(3)
@@ -300,46 +333,59 @@ _prologue (cdecl(clib_longjmp))
 
        /* Return value. */
        mr 3, 4
-
        blr
-
-       .globl cdecl(clib_calljmp)
-       .section        ".opd","aw"
-       .align 3
-cdecl(clib_calljmp):
-       .quad   .L.cdecl(clib_calljmp),.TOC.@tocbase,0
-       .previous
-       .type   cdecl(clib_calljmp), @function
-.L.cdecl(clib_calljmp):
-       mflr 0
-       mr 9,3
-       std 0,16(1)
-       stdu 1,-112(1)
-#APP
-       std 1,-8(5)
-       addi 5,5,-256
-       mr 1,5
-#NO_APP
+_epilogue(clib_longjmp)
+
+#if _CALL_ELF == 2
+_prologue(clib_calljmp)
+_gep_lep(clib_calljmp)
+       mflr 0                  /* get link register into r0 */
+       std 0,16(1)             /* store r0 into the stack frame */
+       stdu 1,-32(1)           /* move sp down for one frame */
+       mr 12,3                 /* move func pointer to r12 */
+       mr 3,4                  /* pass func_arg as first arg */
+       std 1,-8(5)             /* store old sp into the top of the new stack */
+       addi 5,5,-256           /* stack_addr =- 256 */
+       mr 1,5                  /* set new sp */
+       mtctr 12                /* put function pointer into CTR register */
+       std 2,24(1)             /* store TOC pointer into stack frame */
+       bctrl                   /* unconditional branch to counter register */
+       ld 2,24(1)              /* load TOC pointer from stack frame */
+       addi 1,1,256            /* go back to the start of the new stack */
+       ld 1,-8(1)              /* load old sp */
+       addi 1,1,32             /* move sp back to previous frame */
+       ld 0,16(1)              /* get old link reg value from the stack */
+       mtlr 0                  /* restore link reg value */
+       blr
+_epilogue(clib_calljmp)
+
+#else /* v1 ABI */
+
+_prologue(clib_calljmp)
+       mflr 0                  /* get link register into r0 */
+       mr 9,3                  /* store function pointer into the r9 */
+       std 0,16(1)             /* store r0 into the stack frame */
+       stdu 1,-112(1)          /* move sp down for one frame */
+       std 1,-8(5)             /* store old sp into the top of the new stack */
+       addi 5,5,-256           /* stack_addr =- 256 */
+       mr 1,5                  /* set new sp */
        ld 10,0(9)
-       std 2,40(1)
+       std 2,40(1)             /* store TOC pointer into the stack */
        mr 3,4
        mtctr 10
        ld 11,16(9)
        ld 2,8(9)
-       bctrl
-       ld 2,40(1)
-#APP
-       addi 1,1,256
-       ld 1,-8(1)
-#NO_APP
-       addi 1,1,112
-       ld 0,16(1)
+       bctrl                   /* unconditional branch to counter register */
+       ld 2,40(1)              /* load TOC pointer from the stack */
+       addi 1,1,256            /* go back to the start of the new stack */
+       ld 1,-8(1)              /* load the old sp */
+       addi 1,1,112            /* move sp back to previous frame */
+       ld 0,16(1)              /* restore link register from the stack frame */
        mtlr 0
        blr
-       .long 0
-       .byte 0,0,0,1,128,0,0,0
-       .size   cdecl(clib_calljmp),.-.L.cdecl(clib_calljmp)
+_epilogue(clib_calljmp)
 
+#endif
 #elif defined(__powerpc__)
 
 #define _foreach_14_31                                                 \
@@ -770,6 +816,56 @@ cdecl(clib_calljmp):
         mov     sp, x3
        ret
        .size   cdecl(clib_calljmp), .-cdecl(clib_calljmp)
+#elif defined(__riscv)
+#define foreach_0_to_11 _(0) _(1) _(2) _(3) _(4) _(5) _(6) _(7) _(8) _(9) _(10) _(11)
+       .global cdecl(clib_setjmp)
+       .align 1
+       .type cdecl(clib_setjmp), @function
+cdecl(clib_setjmp):
+       sd      ra, 0*8(a0)
+       sd      sp, 1*8(a0)
+#define _(x)  sd       s##x, (x + 2)*8(a0);
+       foreach_0_to_11
+#undef _
+#define _(x)  fsd      fs##x, (x + 14)*8(a0);
+       foreach_0_to_11
+#undef _
+       mv      a0,a1
+       ret
+       .size   cdecl(clib_setjmp), .-cdecl(clib_setjmp)
+
+       .global cdecl(clib_longjmp)
+       .align 1
+       .type cdecl(clib_longjmp), @function
+cdecl(clib_longjmp):
+       ld      ra, 0*8(a0)
+       ld      sp, 1*8(a0)
+#define _(x)  ld       s##x, (x + 2)*8(a0);
+       foreach_0_to_11
+#undef _
+#define _(x)  fld      fs##x, (x + 14)*8(a0);
+       foreach_0_to_11
+#undef _
+       mv      a0,a1
+       ret
+       .size   cdecl(clib_longjmp), .-cdecl(clib_longjmp)
+
+       .global cdecl(clib_calljmp)
+       .align 1
+       .type cdecl(clib_calljmp), @function
+cdecl(clib_calljmp):
+       andi    a2,a2, -16      /* Make sure stack is 16-byte aligned. */
+       addi    a2, a2, -16     /* allocate space on the new stack */
+       sd      ra, 8(a2)       /* store return address */
+       sd      sp, 0(a2)       /* store existing stack pointer */
+       mv      sp, a2          /* change stack */
+       mv      a2, a0          /* functon pointer to a2 */
+       mv      a0, a1          /* 2nd argument becomes 1st one  */
+       jalr    a2              /* function call */
+       ld      ra, 8(sp)       /* restore old return address */
+       ld      sp, 0(sp)       /* restore old stack pointer */
+       ret
+       .size   cdecl(clib_calljmp), .-cdecl(clib_calljmp)
 #else
 #error "unknown machine"
 #endif