mpi: make stack unwinding work at i386 mpi functions master
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Thu, 18 Apr 2019 16:23:26 +0000 (19:23 +0300)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Thu, 18 Apr 2019 16:28:46 +0000 (19:28 +0300)
* mpi/i386/syntax.h: Include 'config.h'.
(CFI_STARTPROC, CFI_ENDPROC, CFI_ADJUST_CFA_OFFSET, CFI_REL_OFFSET)
(CFI_RESTORE, CFI_PUSH, CFI_POP): New.
* mpi/i386/mpih-add1.S: Add CFI directives.
* mpi/i386/mpih-lshift.S: Add CFI directives.
* mpi/i386/mpih-mul1.S: Add CFI directives.
* mpi/i386/mpih-mul2.S: Add CFI directives.
* mpi/i386/mpih-mul3.S: Add CFI directives.
* mpi/i386/mpih-rshift.S: Add CFI directives.
* mpi/i386/mpih-sub1.S: Add CFI directives.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
mpi/i386/mpih-add1.S
mpi/i386/mpih-lshift.S
mpi/i386/mpih-mul1.S
mpi/i386/mpih-mul2.S
mpi/i386/mpih-mul3.S
mpi/i386/mpih-rshift.S
mpi/i386/mpih-sub1.S
mpi/i386/syntax.h

index 652b232..32091f3 100644 (file)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_add_n)
 C_SYMBOL_NAME(_gcry_mpih_add_n:)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_add_n)
 C_SYMBOL_NAME(_gcry_mpih_add_n:)
+       CFI_STARTPROC()
        pushl %edi
        pushl %edi
+       CFI_PUSH(%edi)
        pushl %esi
        pushl %esi
+       CFI_PUSH(%esi)
 
        movl 12(%esp),%edi              /* res_ptr */
        movl 16(%esp),%esi              /* s1_ptr */
 
        movl 12(%esp),%edi              /* res_ptr */
        movl 16(%esp),%esi              /* s1_ptr */
@@ -111,6 +114,9 @@ Loop:       movl    (%esi),%eax
        negl    %eax
 
        popl %esi
        negl    %eax
 
        popl %esi
+       CFI_POP(%esi)
        popl %edi
        popl %edi
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index bf8ed9d..55da067 100644 (file)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_lshift)
 C_SYMBOL_NAME(_gcry_mpih_lshift:)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_lshift)
 C_SYMBOL_NAME(_gcry_mpih_lshift:)
+       CFI_STARTPROC()
        pushl   %edi
        pushl   %edi
+       CFI_PUSH(%edi)
        pushl   %esi
        pushl   %esi
+       CFI_PUSH(%esi)
        pushl   %ebx
        pushl   %ebx
+       CFI_PUSH(%ebx)
 
        movl    16(%esp),%edi           /* res_ptr */
        movl    20(%esp),%esi           /* s_ptr */
 
        movl    16(%esp),%edi           /* res_ptr */
        movl    20(%esp),%esi           /* s_ptr */
@@ -88,7 +92,11 @@ Lend:        shll    %cl,%ebx                /* compute least significant limb */
        movl    %ebx,(%edi)             /* store it */
 
        popl    %ebx
        movl    %ebx,(%edi)             /* store it */
 
        popl    %ebx
+       CFI_POP(%ebx)
        popl    %esi
        popl    %esi
+       CFI_POP(%esi)
        popl    %edi
        popl    %edi
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index c9760ef..9679ea6 100644 (file)
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_mul_1)
 C_SYMBOL_NAME(_gcry_mpih_mul_1:)
 
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_mul_1)
 C_SYMBOL_NAME(_gcry_mpih_mul_1:)
 
+       CFI_STARTPROC()
        INSN1(push,l    ,R(edi))
        INSN1(push,l    ,R(edi))
+       CFI_PUSH(%edi)
        INSN1(push,l    ,R(esi))
        INSN1(push,l    ,R(esi))
+       CFI_PUSH(%esi)
        INSN1(push,l    ,R(ebx))
        INSN1(push,l    ,R(ebx))
+       CFI_PUSH(%ebx)
        INSN1(push,l    ,R(ebp))
        INSN1(push,l    ,R(ebp))
+       CFI_PUSH(%ebp)
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
@@ -77,8 +82,13 @@ Loop:
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
+       CFI_POP(%ebp)
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(ebx))
+       CFI_POP(%ebx)
        INSN1(pop,l     ,R(esi))
        INSN1(pop,l     ,R(esi))
+       CFI_POP(%esi)
        INSN1(pop,l     ,R(edi))
        INSN1(pop,l     ,R(edi))
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index 9794e11..fe4129c 100644 (file)
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_addmul_1)
 C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
 
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_addmul_1)
 C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
 
+       CFI_STARTPROC()
        INSN1(push,l    ,R(edi))
        INSN1(push,l    ,R(edi))
+       CFI_PUSH(%edi)
        INSN1(push,l    ,R(esi))
        INSN1(push,l    ,R(esi))
+       CFI_PUSH(%esi)
        INSN1(push,l    ,R(ebx))
        INSN1(push,l    ,R(ebx))
+       CFI_PUSH(%ebx)
        INSN1(push,l    ,R(ebp))
        INSN1(push,l    ,R(ebp))
+       CFI_PUSH(%ebp)
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
@@ -79,8 +84,13 @@ Loop:
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
+       CFI_POP(%ebp)
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(ebx))
+       CFI_POP(%ebx)
        INSN1(pop,l     ,R(esi))
        INSN1(pop,l     ,R(esi))
+       CFI_POP(%esi)
        INSN1(pop,l     ,R(edi))
        INSN1(pop,l     ,R(edi))
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index 6df2017..87577d5 100644 (file)
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_submul_1)
 C_SYMBOL_NAME(_gcry_mpih_submul_1:)
 
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_submul_1)
 C_SYMBOL_NAME(_gcry_mpih_submul_1:)
 
+       CFI_STARTPROC()
        INSN1(push,l    ,R(edi))
        INSN1(push,l    ,R(edi))
+       CFI_PUSH(%edi)
        INSN1(push,l    ,R(esi))
        INSN1(push,l    ,R(esi))
+       CFI_PUSH(%esi)
        INSN1(push,l    ,R(ebx))
        INSN1(push,l    ,R(ebx))
+       CFI_PUSH(%ebx)
        INSN1(push,l    ,R(ebp))
        INSN1(push,l    ,R(ebp))
+       CFI_PUSH(%ebp)
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
@@ -79,8 +84,13 @@ Loop:
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
        INSN2(mov,l     ,R(eax),R(ebx))
 
        INSN1(pop,l     ,R(ebp))
+       CFI_POP(%ebp)
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(ebx))
+       CFI_POP(%ebx)
        INSN1(pop,l     ,R(esi))
        INSN1(pop,l     ,R(esi))
+       CFI_POP(%esi)
        INSN1(pop,l     ,R(edi))
        INSN1(pop,l     ,R(edi))
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index 2920e55..35a8201 100644 (file)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_rshift)
 C_SYMBOL_NAME(_gcry_mpih_rshift:)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_rshift)
 C_SYMBOL_NAME(_gcry_mpih_rshift:)
+       CFI_STARTPROC()
        pushl   %edi
        pushl   %edi
+       CFI_PUSH(%edi)
        pushl   %esi
        pushl   %esi
+       CFI_PUSH(%esi)
        pushl   %ebx
        pushl   %ebx
+       CFI_PUSH(%ebx)
 
        movl    16(%esp),%edi           /* wp */
        movl    20(%esp),%esi           /* up */
 
        movl    16(%esp),%edi           /* wp */
        movl    20(%esp),%esi           /* up */
@@ -67,7 +71,7 @@ C_SYMBOL_NAME(_gcry_mpih_rshift:)
        movl    %ebx,%eax
 
        ALIGN (3)
        movl    %ebx,%eax
 
        ALIGN (3)
-Loop2:  movl    (%esi,%edx,4),%ebx      /* load next higher limb */
+Loop2: movl     (%esi,%edx,4),%ebx     /* load next higher limb */
        shrdl   %cl,%ebx,%eax           /* compute result limb */
        movl    %eax,(%edi,%edx,4)      /* store it */
        incl    %edx
        shrdl   %cl,%ebx,%eax           /* compute result limb */
        movl    %eax,(%edi,%edx,4)      /* store it */
        incl    %edx
@@ -91,7 +95,11 @@ Lend2:       shrl    %cl,%ebx                /* compute most significant limb */
        movl    %ebx,(%edi)             /* store it */
 
        popl    %ebx
        movl    %ebx,(%edi)             /* store it */
 
        popl    %ebx
+       CFI_POP(%ebx)
        popl    %esi
        popl    %esi
+       CFI_POP(%esi)
        popl    %edi
        popl    %edi
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index f447f7a..501c4a9 100644 (file)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
 C_SYMBOL_NAME(_gcry_mpih_sub_n:)
        ALIGN (3)
        .globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
 C_SYMBOL_NAME(_gcry_mpih_sub_n:)
+       CFI_STARTPROC()
        pushl %edi
        pushl %edi
+       CFI_PUSH(%edi)
        pushl %esi
        pushl %esi
+       CFI_PUSH(%esi)
 
        movl 12(%esp),%edi              /* res_ptr */
        movl 16(%esp),%esi              /* s1_ptr */
 
        movl 12(%esp),%edi              /* res_ptr */
        movl 16(%esp),%esi              /* s1_ptr */
@@ -112,6 +115,9 @@ Loop:       movl    (%esi),%eax
        negl    %eax
 
        popl %esi
        negl    %eax
 
        popl %esi
+       CFI_POP(%esi)
        popl %edi
        popl %edi
+       CFI_POP(%edi)
        ret
        ret
+       CFI_ENDPROC()
 
 
index 39ede98..9101585 100644 (file)
  *      to avoid revealing of sensitive data due to paging etc.
  */
 
  *      to avoid revealing of sensitive data due to paging etc.
  */
 
+#include <config.h>
+
+#ifdef HAVE_GCC_ASM_CFI_DIRECTIVES
+# define CFI_STARTPROC()            .cfi_startproc
+# define CFI_ENDPROC()              .cfi_endproc
+# define CFI_ADJUST_CFA_OFFSET(off) .cfi_adjust_cfa_offset off
+# define CFI_REL_OFFSET(reg,off)    .cfi_rel_offset reg, off
+# define CFI_RESTORE(reg)           .cfi_restore reg
+
+# define CFI_PUSH(reg) \
+       CFI_ADJUST_CFA_OFFSET(4); CFI_REL_OFFSET(reg, 0)
+# define CFI_POP(reg) \
+       CFI_ADJUST_CFA_OFFSET(-4); CFI_RESTORE(reg)
+#else
+# define CFI_STARTPROC()
+# define CFI_ENDPROC()
+# define CFI_ADJUST_CFA_OFFSET(off)
+# define CFI_REL_OFFSET(reg,off)
+# define CFI_RESTORE(reg)
+
+# define CFI_PUSH(reg)
+# define CFI_POP(reg)
+#endif
+
 #undef ALIGN
 
 #if defined (BSD_SYNTAX) || defined (ELF_SYNTAX)
 #undef ALIGN
 
 #if defined (BSD_SYNTAX) || defined (ELF_SYNTAX)