Add extra field to gtm_jmpbuf on x86 only
authorIgor Tsimbalist <igor.v.tsimbalist@intel.com>
Fri, 17 Nov 2017 22:57:07 +0000 (23:57 +0100)
committerIgor Tsimbalist <itsimbal@gcc.gnu.org>
Fri, 17 Nov 2017 22:57:07 +0000 (23:57 +0100)
Expand the gtm_jmpbuf structure by one word field to add
Intel CET support further. The code in sjlj.S already
allocates more space on the stack then gtm_jmpbuf needs.
Use this extra space to absorb the new field.

The structure is allocated on the stack in such a way
that eip/rsp field is overlapped with return address on
the stack. Locate the new field right before eip/rsp so
code that accesses buffer fields relative to address of
gtm_jmpbuf has its offsets unchanged.

* libitm/config/x86/target.h: Add new field (ssp).
* libitm/config/x86/sjlj.S: Change offsets.

From-SVN: r254907

libitm/ChangeLog
libitm/config/x86/sjlj.S
libitm/config/x86/target.h

index 3d1477b1f7572e6b68dbb16b18d16cd50d81f54e..196ac9a1ab2ea46bc6804f226be2264cab4b9c75 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-17  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
+
+       * libitm/config/x86/target.h: Add new field (ssp).
+       * libitm/config/x86/sjlj.S: Change offsets.
+
 2017-05-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * testsuite/lib/libitm.exp: Load scanlang.exp.
index 21ca9d76772ae9716e550a292d8b7ab4190b9c8b..7de417ca101c83e5557a6be7498b9ddb1f2815e7 100644 (file)
@@ -126,20 +126,22 @@ SYM(_ITM_beginTransaction):
        /* Store edi for future HTM fast path retries.  We use a stack slot
           lower than the jmpbuf so that the jmpbuf's rip field will overlap
           with the proper return address on the stack.  */
-       movl    %edi, 8(%rsp)
+       movl    %edi, (%rsp)
        /* Save the jmpbuf for any non-HTM-fastpath execution method.
           Because rsp-based addressing is 1 byte larger and we've got rax
           handy, use it.  */
-       movq    %rax, -64(%rax)
-       movq    %rbx, -56(%rax)
-       movq    %rbp, -48(%rax)
-       movq    %r12, -40(%rax)
-       movq    %r13, -32(%rax)
-       movq    %r14, -24(%rax)
-       movq    %r15, -16(%rax)
-       leaq    -64(%rax), %rsi
+       movq    %rax, -72(%rax)
+       movq    %rbx, -64(%rax)
+       movq    %rbp, -56(%rax)
+       movq    %r12, -48(%rax)
+       movq    %r13, -40(%rax)
+       movq    %r14, -32(%rax)
+       movq    %r15, -24(%rax)
+       xorq    %rdx, %rdx
+       movq    %rdx, -16(%rax)
+       leaq    -72(%rax), %rsi
        call    SYM(GTM_begin_transaction)
-       movl    8(%rsp), %edi
+       movl    (%rsp), %edi
        addq    $72, %rsp
        cfi_adjust_cfa_offset(-72)
 #ifdef HAVE_AS_RTM
@@ -162,12 +164,14 @@ SYM(_ITM_beginTransaction):
        movl    4(%esp), %eax
        subl    $28, %esp
        cfi_def_cfa_offset(32)
-       movl    %ecx, 8(%esp)
-       movl    %ebx, 12(%esp)
-       movl    %esi, 16(%esp)
-       movl    %edi, 20(%esp)
-       movl    %ebp, 24(%esp)
-       leal    8(%esp), %edx
+       movl    %ecx, 4(%esp)
+       movl    %ebx, 8(%esp)
+       movl    %esi, 12(%esp)
+       movl    %edi, 16(%esp)
+       movl    %ebp, 20(%esp)
+       xorl    %edx, %edx
+       movl    %edx, 24(%esp)
+       leal    4(%esp), %edx
 #if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
        call    SYM(GTM_begin_transaction)
 #elif defined __ELF__
@@ -175,7 +179,7 @@ SYM(_ITM_beginTransaction):
 1:     popl    %ebx
        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
        call    SYM(GTM_begin_transaction)@PLT
-       movl    12(%esp), %ebx
+       movl    8(%esp), %ebx
 #else
 # error "Unsupported PIC sequence"
 #endif
@@ -203,10 +207,10 @@ SYM(GTM_longjmp):
        movq    48(%rsi), %r15
        movl    %edi, %eax
        cfi_def_cfa(%rsi, 0)
-       cfi_offset(%rip, 56)
+       cfi_offset(%rip, 64)
        cfi_register(%rsp, %rcx)
        movq    %rcx, %rsp
-       jmp     *56(%rsi)
+       jmp     *64(%rsi)
 #else
        movl    (%edx), %ecx
        movl    4(%edx), %ebx
@@ -214,10 +218,10 @@ SYM(GTM_longjmp):
        movl    12(%edx), %edi
        movl    16(%edx), %ebp
        cfi_def_cfa(%edx, 0)
-       cfi_offset(%eip, 20)
+       cfi_offset(%eip, 24)
        cfi_register(%esp, %ecx)
        movl    %ecx, %esp
-       jmp     *20(%edx)
+       jmp     *24(%edx)
 #endif
        cfi_endproc
 
index 1b79dc03a67e92faaae6785b309dc00a675616c4..5a4b820c2054e2d6b991994660879cf6a86aabc5 100644 (file)
@@ -39,12 +39,14 @@ typedef struct gtm_jmpbuf
   unsigned long long r13;
   unsigned long long r14;
   unsigned long long r15;
+  unsigned long long ssp;
   unsigned long long rip;
 #else
   unsigned long ebx;
   unsigned long esi;
   unsigned long edi;
   unsigned long ebp;
+  unsigned long ssp;
   unsigned long eip;
 #endif
 } gtm_jmpbuf;