[mingw-boost] more workarounds for context

sailer sailer at fedoraproject.org
Sun Mar 3 14:28:11 UTC 2013


commit 6287835832c0b38c3105a1424173b5ed9b7cd099
Author: Thomas Sailer <t.sailer at alumni.ethz.ch>
Date:   Sun Mar 3 15:11:24 2013 +0100

    more workarounds for context

 boost-mingw.patch |  620 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 620 insertions(+), 0 deletions(-)
---
diff --git a/boost-mingw.patch b/boost-mingw.patch
index 087c3c7..b8a98dd 100644
--- a/boost-mingw.patch
+++ b/boost-mingw.patch
@@ -10,3 +10,623 @@
      return $(api) ;
  }
  
+--- libs/context/build/Jamfile.v2.orig	2013-03-03 13:39:59.684868916 +0100
++++ libs/context/build/Jamfile.v2	2013-03-03 15:09:09.893232829 +0100
+@@ -26,8 +26,9 @@
+ local rule default_binary_format ( )
+ {
+     local tmp = elf ;
+-    if [ os.name ] = "MACOSX" { tmp = mach-o ; }
+-    if [ os.name ] = "NT" { tmp = pe ; }
++#    if [ os.name ] = "MACOSX" { tmp = mach-o ; }
++#    if [ os.name ] = "NT" { tmp = pe ; }
++    tmp = pe ;
+     return $(tmp) ;
+ }
+ 
+@@ -43,9 +44,10 @@
+ local rule default_abi ( )
+ {
+     local tmp = sysv ;
+-    if [ os.name ] = "NT" { tmp = ms ; }
+-    else if [ os.platform ] = "ARM" { tmp = aapcs ; }
+-    else if [ os.platform ] = "MIPS" { tmp = o32 ; }
++#    if [ os.name ] = "NT" { tmp = ms ; }
++#    else if [ os.platform ] = "ARM" { tmp = aapcs ; }
++#    else if [ os.platform ] = "MIPS" { tmp = o32 ; }
++    tmp = ms ;
+     return $(tmp) ;
+ }
+ 
+@@ -282,6 +284,17 @@
+    ;
+ 
+ alias asm_context_sources
++   : asm/make_i386_ms_pe_gas.S
++     asm/jump_i386_ms_pe_gas.S
++     dummy.cpp
++   : <address-model>32
++     <architecture>x86
++     <binary-format>pe
++     <target-os>windows
++     <toolset>gcc
++   ;
++
++alias asm_context_sources
+    : asm/make_i386_ms_pe_masm.asm
+      asm/jump_i386_ms_pe_masm.asm
+      dummy.cpp
+@@ -379,6 +392,17 @@
+    ;
+ 
+ alias asm_context_sources
++   : asm/make_x86_64_ms_pe_gas.S
++     asm/jump_x86_64_ms_pe_gas.S
++     dummy.cpp
++   : <address-model>64
++     <architecture>x86
++     <binary-format>pe
++     <target-os>windows
++     <toolset>gcc
++   ;
++
++alias asm_context_sources
+    : asm/make_x86_64_ms_pe_masm.asm
+      asm/jump_x86_64_ms_pe_masm.asm
+      dummy.cpp
+--- libs/context/src/asm/make_i386_ms_pe_gas.S.orig	2013-03-03 13:41:28.645502113 +0100
++++ libs/context/src/asm/make_i386_ms_pe_gas.S	2013-03-03 14:39:27.590477410 +0100
+@@ -0,0 +1,115 @@
++/*
++            Copyright Oliver Kowalke 2009.
++            Copyright Thomas Sailer 2013.
++   Distributed under the Boost Software License, Version 1.0.
++      (See accompanying file LICENSE_1_0.txt or copy at
++            http://www.boost.org/LICENSE_1_0.txt)
++*/
++
++/********************************************************************
++ *                                                                  *
++ *  --------------------------------------------------------------  *
++ *  |    0    |    1    |    2    |    3    |    4     |    5    |  *
++ *  --------------------------------------------------------------  *
++ *  |    0h   |   04h   |   08h   |   0ch   |   010h   |   014h  |  *
++ *  --------------------------------------------------------------  *
++ *  |   EDI   |   ESI   |   EBX   |   EBP   |   ESP    |   EIP   |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |    6    |    7    |    8    |                              |  *
++ *  --------------------------------------------------------------  *
++ *  |   018h  |   01ch  |   020h  |                              |  *
++ *  --------------------------------------------------------------  *
++ *  |    sp   |   size  |  limit  |                              |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |    9    |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |  024h   |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |fc_execpt|                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |   10    |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |  028h   |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |fc_strage|                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |   11    |    12   |                                        |  *
++ *  --------------------------------------------------------------  *
++ *  |  02ch   |   030h  |                                        |  *
++ *  --------------------------------------------------------------  *
++ *  | fc_mxcsr|fc_x87_cw|                                        |  *
++ *  --------------------------------------------------------------  *
++ *                                                                  *
++ * *****************************************************************/
++
++.file	"make_i386_ms_pe_gas.S"
++.text
++.p2align 4,,15
++.globl	_make_fcontext
++.def	_make_fcontext;	.scl	2;	.type	32;	.endef
++_make_fcontext:
++    movl    0x04(%esp), %eax        /* load 1. arg of make_fcontext, pointer to context stack (base) */
++    leal    -0x34(%eax),%eax        /* reserve space for fcontext_t at top of context stack */
++
++    /* shift address in EAX to lower 16 byte boundary */
++    /* == pointer to fcontext_t and address of context stack */
++    andl    $-16,       %eax
++
++    movl    0x04(%esp), %ecx        /* load 1. arg of make_fcontext, pointer to context stack (base) */
++    movl    %ecx,       0x18(%eax)  /* save address of context stack (base) in fcontext_t */
++    movl    0x08(%esp), %edx        /* load 2. arg of make_fcontext, context stack size */
++    movl    %edx,       0x1c(%eax)  /* save context stack size in fcontext_t */
++    negl    %edx                    /* negate stack size for LEA instruction (== substraction) */
++    leal    (%ecx,%edx),%ecx        /* compute bottom address of context stack (limit) */
++    movl    %ecx,       0x20(%eax)  /* save address of context stack (limit) in fcontext_t */
++    movl    0x0c(%esp), %ecx        /* load 3. arg of make_fcontext, pointer to context function */
++    movl    %ecx,       0x14(%eax)  /* save address of context function in fcontext_t */
++
++    stmxcsr 0x02c(%eax)             /* save MMX control word */
++    fnstcw  0x030(%eax)             /* save x87 control word */
++
++    leal    -0x1c(%eax),%edx        /* reserve space for last frame and seh on context stack, (ESP - 0x4) % 16 == 0 */
++    movl    %edx,       0x10(%eax)  /* save address in EDX as stack pointer for context function */
++
++    movl    $finish,    %ecx        /* abs address of finish */
++    movl    %ecx,       (%edx)      /* save address of finish as return address for context function */
++                                    /* entered after context function returns */
++
++    /* traverse current seh chain to get the last exception handler installed by Windows */
++    /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
++    /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
++    /* at its end by RaiseException all seh andlers are disregarded if not present and the */
++    /* program is aborted */
++    movl    %fs:(0x18), %ecx        /* load NT_TIB into ECX */
++
++walk:
++    movl    (%ecx),     %edx        /* load 'next' member of current SEH into EDX */
++    incl    %edx                    /* test if 'next' of current SEH is last (== 0xffffffff) */
++    jz      found
++    decl    %edx
++    xchgl    %ecx,      %edx        /* exchange content; ECX contains address of next SEH */
++    jmp     walk                    /* inspect next SEH */
++
++found:
++    movl    0x04(%ecx), %ecx        /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
++    movl    0x10(%eax), %edx        /* load address of stack pointer for context function */
++    movl    %ecx,       0x18(%edx)  /* save address in ECX as SEH handler for context */
++    movl    $0xffffffff,%ecx        /* set ECX to -1 */
++    movl    %ecx,       0x14(%edx)  /* save ECX as next SEH item */
++    leal    0x14(%edx), %ecx        /* load address of next SEH item */
++    movl    %ecx,       0x24(%eax)  /* save next SEH */
++
++    ret
++
++finish:
++    /* ESP points to same address as ESP on entry of context function + 0x4 */
++    xorl    %eax,       %eax
++    movl    %eax,       (%esp)      /* exit code is zero */
++    call    __exit                  /* exit application */
++    hlt
++
++.def	__exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+--- libs/context/src/asm/jump_i386_ms_pe_gas.S.orig	2013-03-03 13:41:34.332670479 +0100
++++ libs/context/src/asm/jump_i386_ms_pe_gas.S	2013-03-03 14:35:35.634611625 +0100
+@@ -0,0 +1,108 @@
++/*
++            Copyright Oliver Kowalke 2009.
++            Copyright Thomas Sailer 2013.
++   Distributed under the Boost Software License, Version 1.0.
++      (See accompanying file LICENSE_1_0.txt or copy at
++            http://www.boost.org/LICENSE_1_0.txt)
++*/
++
++/********************************************************************
++ *                                                                  *
++ *  --------------------------------------------------------------  *
++ *  |    0    |    1    |    2    |    3    |    4     |    5    |  *
++ *  --------------------------------------------------------------  *
++ *  |    0h   |   04h   |   08h   |   0ch   |   010h   |   014h  |  *
++ *  --------------------------------------------------------------  *
++ *  |   EDI   |   ESI   |   EBX   |   EBP   |   ESP    |   EIP   |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |    6    |    7    |    8    |                              |  *
++ *  --------------------------------------------------------------  *
++ *  |   018h  |   01ch  |   020h  |                              |  *
++ *  --------------------------------------------------------------  *
++ *  |    sp   |   size  |  limit  |                              |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |    9    |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |  024h   |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |fc_execpt|                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |   10    |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |  028h   |                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  |fc_strage|                                                  |  *
++ *  --------------------------------------------------------------  *
++ *  --------------------------------------------------------------  *
++ *  |   11    |    12   |                                        |  *
++ *  --------------------------------------------------------------  *
++ *  |  02ch   |   030h  |                                        |  *
++ *  --------------------------------------------------------------  *
++ *  | fc_mxcsr|fc_x87_cw|                                        |  *
++ *  --------------------------------------------------------------  *
++ *                                                                  *
++ * *****************************************************************/
++
++.file	"jump_i386_ms_pe_gas.S"
++.text
++.p2align 4,,15
++.globl	_jump_fcontext
++.def	_jump_fcontext;	.scl	2;	.type	32;	.endef
++_jump_fcontext:
++    movl    0x04(%esp), %ecx        /* load address of the first fcontext_t arg */
++    movl    %edi,       (%ecx)      /* save EDI */
++    movl    %esi,       0x04(%ecx)  /* save ESI */
++    movl    %ebx,       0x08(%ecx)  /* save EBX */
++    movl    %ebp,       0x0c(%ecx)  /* save EBP */
++
++    movl    %fs:(0x18), %edx        /* load NT_TIB */
++    movl    (%edx),     %eax        /* load current SEH exception list */
++    movl    %eax,       0x24(%ecx)  /* save current exception list */
++    movl    0x04(%edx), %eax        /* load current stack base */
++    movl    %eax,       0x18(%ecx)  /* save current stack base */
++    movl    0x08(%edx), %eax        /* load current stack limit */
++    movl    %eax,       0x20(%ecx)  /* save current stack limit */
++    movl    0x10(%edx), %eax        /* load fiber local storage */
++    movl    %eax,       0x28(%ecx)  /* save fiber local storage */
++
++    leal    0x04(%esp), %eax        /* exclude the return address */
++    movl    %eax,       0x10(%ecx)  /* save as stack pointer */
++    movl    (%esp),     %eax        /* load return address */
++    movl    %eax,       0x14(%ecx)  /* save return address */
++
++    movl    0x08(%esp), %edx        /* load address of the second fcontext_t arg */
++    movl    (%edx),     %edi        /* restore EDI */
++    movl    0x04(%edx), %esi        /* restore ESI */
++    movl    0x08(%edx), %ebx        /* restore EBX */
++    movl    0x0c(%edx), %ebp        /* restore EBP */
++
++    movl    0x10(%esp), %eax        /* check if fpu enve preserving was requested */
++    testl   %eax,       %eax 
++    je      1f
++
++    stmxcsr 0x2c(%ecx)              /* save MMX control word */
++    fnstcw  0x30(%ecx)              /* save x87 control word */
++    ldmxcsr 0x2c(%edx)              /* restore MMX control word */
++    fldcw   0x30(%edx)              /* restore x87 control word */
++1:
++    movl    %edx,       %ecx        
++    movl    %fs:(0x18), %edx        /* load NT_TIB */
++    movl    0x24(%ecx), %eax        /* load SEH exception list */
++    movl    %eax,       (%edx)      /* restore next SEH item */
++    movl    0x18(%ecx), %eax        /* load stack base */
++    movl    %eax,       0x04(%edx)  /* restore stack base */
++    movl    0x20(%ecx), %eax        /* load stack limit */
++    movl    %eax,       0x08(%edx)  /* restore stack limit */
++    movl    0x28(%ecx), %eax        /* load fiber local storage */
++    movl    %eax,       0x10(%edx)  /* restore fiber local storage */
++			            
++    movl    0x0c(%esp), %eax        /* use third arg as return value after jump */
++			            
++    movl    0x10(%ecx), %esp        /* restore ESP */
++    movl    %eax,       0x04(%esp)  /* use third arg as first arg in context function */
++    movl    0x14(%ecx), %ecx        /* fetch the address to return to */
++
++    jmp     *%ecx                   /* indirect jump to context */
+--- libs/context/src/asm/make_x86_64_ms_pe_gas.S.orig	2013-03-03 13:43:03.137299031 +0100
++++ libs/context/src/asm/make_x86_64_ms_pe_gas.S	2013-03-03 14:54:16.036775106 +0100
+@@ -0,0 +1,132 @@
++/*
++            Copyright Oliver Kowalke 2009.
++            Copyright Thomas Sailer 2013.
++   Distributed under the Boost Software License, Version 1.0.
++      (See accompanying file LICENSE_1_0.txt or copy at
++            http://www.boost.org/LICENSE_1_0.txt)
++*/
++
++/****************************************************************************************
++ *                                                                                      *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        R12        |         R13       |         R14        |        R15        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        RDI        |        RSI        |         RBX        |        RBP        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    16   |    17   |    18   |    19   |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x40  |   0x44  |   0x48  |   0x4c  |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        RSP        |        RIP        |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    20   |    21   |    22   |    23   |    24    |    25   |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x50  |   0x54  |   0x58  |   0x5c  |   0x60   |   0x64  |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        sp         |       size        |        limit       |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    26   |   27    |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x68  |   0x6c  |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |      fbr_strg     |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    28   |   29    |    30   |    31   |    32    |    33   |   34    |   35    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x70  |   0x74  |   0x78  |   0x7c  |   0x80   |   0x84  |  0x88   |  0x8c   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  | fc_mxcsr|fc_x87_cw|      fc_xmm       |      SEE registers (XMM6-XMM15)        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   36    |    37   |    38   |    39   |    40    |    41   |   42    |   43    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0x90   |   0x94  |   0x98  |   0x9c  |   0xa0   |   0xa4  |  0xa8   |  0xac   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    44    |   45    |    46   |    47  |    48    |    49   |   50    |   51    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0xb0   |  0xb4   |  0xb8   |  0xbc  |   0xc0   |   0xc4  |  0xc8   |  0xcc   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    52    |   53    |    54   |   55   |    56    |    57   |   58    |   59    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0xd0   |  0xd4   |   0xd8  |  0xdc  |   0xe0   |  0xe4   |  0xe8   |  0xec   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    60   |    61   |    62    |    63  |    64    |    65   |   66    |   67    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0xf0   |  0xf4   |   0xf8   |  0xfc  |   0x100  |  0x104  |  0x108  |  0x10c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    68   |    69   |    70    |    71  |    72    |    73   |   74    |   75    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0x110  |  0x114  |   0x118  |  0x11c |   0x120  |  0x124  |  0x128  |  0x12c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *                                                                                      *
++ * *************************************************************************************/
++
++.file	"make_x86_64_ms_pe_gas.S"
++.text
++.p2align 4,,15
++.globl	make_fcontext
++.def	make_fcontext;	.scl	2;	.type	32;	.endef
++.seh_proc	make_fcontext
++make_fcontext:
++.seh_endprologue
++    leaq    -0x130(%rcx),%rax       /* reserve space for fcontext_t at top of context stack */
++
++    /* shift address in RAX to lower 16 byte boundary */
++    /* == pointer to fcontext_t and address of context stack */
++    andq    $-16,       %rax
++
++    movq    %r8,        0x48(%rax)  /* save address of context function in fcontext_t */
++    movq    %rdx,       0x58(%rax)  /* save context stack size in fcontext_t */
++    movq    %rcx,       0x50(%rax)  /* save address of context stack pointer (base) in fcontext_t */
++
++    negq    %rdx                    /* negate stack size for LEA instruction (== substraction) */
++    leaq    (%rcx,%rdx),%rcx        /* compute bottom address of context stack (limit) */
++    movq    %rcx,       0x60(%rax)  /* save bottom address of context stack (limit) in fcontext_t */
++
++    stmxcsr 0x70(%rax)              /* save MMX control and status word */
++    fnstcw  0x74(%rax)              /* save x87 control word */
++
++    leaq    -0x28(%rax),%rdx        /* reserve 32byte shadow space + return address on stack, (RSP - 0x8) % 16 == 0 */
++    movq    %rdx,       0x40(%rax)  /* save address in RDX as stack pointer for context function */
++
++    leaq    finish(%rip),%rcx       /* compute abs address of label finish */
++    movq    %rcx,(%rdx)             /* save address of finish as return address for context function */
++                                    /* entered after context function returns */
++
++    ret
++
++finish:
++    /* RSP points to same address as RSP on entry of context function + 0x8 */
++    xorq    %rcx,       %rcx        /* exit code is zero */
++    call    _exit                   /* exit application */
++    hlt
++.seh_endproc
++
++.def	_exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+--- libs/context/src/asm/jump_x86_64_ms_pe_gas.S.orig	2013-03-03 13:42:57.753139784 +0100
++++ libs/context/src/asm/jump_x86_64_ms_pe_gas.S	2013-03-03 15:06:08.269856857 +0100
+@@ -0,0 +1,189 @@
++/*
++            Copyright Oliver Kowalke 2009.
++            Copyright Thomas Sailer 2013.
++   Distributed under the Boost Software License, Version 1.0.
++      (See accompanying file LICENSE_1_0.txt or copy at
++            http://www.boost.org/LICENSE_1_0.txt)
++*/
++
++/****************************************************************************************
++ *                                                                                      *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        R12        |         R13       |         R14        |        R15        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        RDI        |        RSI        |         RBX        |        RBP        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    16   |    17   |    18   |    19   |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x40  |   0x44  |   0x48  |   0x4c  |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        RSP        |        RIP        |                                        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    20   |    21   |    22   |    23   |    24    |    25   |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x50  |   0x54  |   0x58  |   0x5c  |   0x60   |   0x64  |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |        sp         |       size        |        limit       |                   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    26   |   27    |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x68  |   0x6c  |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |      fbr_strg     |                                                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    28   |   29    |    30   |    31   |    32    |    33   |   34    |   35    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0x70  |   0x74  |   0x78  |   0x7c  |   0x80   |   0x84  |  0x88   |  0x8c   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  | fc_mxcsr|fc_x87_cw|      fc_xmm       |      SEE registers (XMM6-XMM15)        |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   36    |    37   |    38   |    39   |    40    |    41   |   42    |   43    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0x90   |   0x94  |   0x98  |   0x9c  |   0xa0   |   0xa4  |  0xa8   |  0xac   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    44    |   45    |    46   |    47  |    48    |    49   |   50    |   51    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0xb0   |  0xb4   |  0xb8   |  0xbc  |   0xc0   |   0xc4  |  0xc8   |  0xcc   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    52    |   53    |    54   |   55   |    56    |    57   |   58    |   59    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |   0xd0   |  0xd4   |   0xd8  |  0xdc  |   0xe0   |  0xe4   |  0xe8   |  0xec   |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    60   |    61   |    62    |    63  |    64    |    65   |   66    |   67    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0xf0   |  0xf4   |   0xf8   |  0xfc  |   0x100  |  0x104  |  0x108  |  0x10c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |    68   |    69   |    70    |    71  |    72    |    73   |   74    |   75    |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |  0x110  |  0x114  |   0x118  |  0x11c |   0x120  |  0x124  |  0x128  |  0x12c  |  *
++ *  ----------------------------------------------------------------------------------  *
++ *  |                          SEE registers (XMM6-XMM15)                            |  *
++ *  ----------------------------------------------------------------------------------  *
++ *                                                                                      *
++ * *************************************************************************************/
++
++.file	"jump_x86_64_ms_pe_gas.S"
++.text
++.p2align 4,,15
++.globl	jump_fcontext
++.def	jump_fcontext;	.scl	2;	.type	32;	.endef
++.seh_proc	jump_fcontext
++jump_fcontext:
++.seh_endprologue
++    movq    %r12,       (%rcx)      /* save R12 */
++    movq    %r13,       0x08(%rcx)  /* save R13 */
++    movq    %r14,       0x10(%rcx)  /* save R14 */
++    movq    %r15,       0x18(%rcx)  /* save R15 */
++    movq    %rdi,       0x20(%rcx)  /* save RDI */
++    movq    %rsi,       0x28(%rcx)  /* save RSI */
++    movq    %rbx,       0x30(%rcx)  /* save RBX */
++    movq    %rbp,       0x38(%rcx)  /* save RBP */
++
++    movq    %gs:(0x30), %r10        /* load NT_TIB */
++    movq    0x08(%r10), %rax        /* load current stack base */
++    movq    %rax,       0x50(%rcx)  /* save current stack base */
++    movq    0x10(%r10), %rax        /* load current stack limit */
++    movq    %rax,       0x60(%rcx)  /* save current stack limit */
++    movq    0x18(%r10), %rax        /* load fiber local storage */
++    movq    %rax,       0x68(%rcx)  /* save fiber local storage */
++
++    testq   %r9,        %r9
++    je      1f
++
++    stmxcsr 0x70(%rcx)              /* save MMX control and status word */
++    fnstcw  0x74(%rcx)              /* save x87 control word */
++    /* save XMM storage */
++    /* save start address of SSE register block in R10 */
++    leaq    0x90(%rcx), %r10
++    /* shift address in R10 to lower 16 byte boundary */
++    /* == pointer to SEE register block */
++    andq    $-16,       %r10
++
++    movaps  %xmm6,      (%r10)
++    movaps  %xmm7,      0x10(%r10)
++    movaps  %xmm8,      0x20(%r10)
++    movaps  %xmm9,      0x30(%r10)
++    movaps  %xmm10,     0x40(%r10)
++    movaps  %xmm11,     0x50(%r10)
++    movaps  %xmm12,     0x60(%r10)
++    movaps  %xmm13,     0x70(%r10)
++    movaps  %xmm14,     0x80(%r10)
++    movaps  %xmm15,     0x90(%r10)
++
++    ldmxcsr 0x70(%rdx)              /* restore MMX control and status word */
++    fldcw   0x74(%rdx)              /* restore x87 control word */
++    /* restore XMM storage */
++	/* save start address of SSE register block in R10 */
++    leaq    0x90(%rdx), %r10
++    /* shift address in R10 to lower 16 byte boundary */
++    /* == pointer to SEE register block */
++    andq    $-16,       %r10
++
++    movaps  (%r10),     %xmm6
++    movaps  0x10(%r10), %xmm7
++    movaps  0x20(%r10), %xmm8
++    movaps  0x30(%r10), %xmm9
++    movaps  0x40(%r10), %xmm10
++    movaps  0x50(%r10), %xmm11
++    movaps  0x60(%r10), %xmm12
++    movaps  0x70(%r10), %xmm13
++    movaps  0x80(%r10), %xmm14
++    movaps  0x90(%r10), %xmm15
++
++1:
++    leaq    0x08(%rsp), %rax        /* exclude the return address */
++    movq    %rax,       0x40(%rcx)  /* save as stack pointer */
++    movq    (%rsp),     %rax        /* load return address */
++    movq    %rax,       0x48(%rcx)  /* save return address */
++
++    movq    (%rdx),     %r12        /* restore R12 */
++    movq    0x08(%rdx), %r13        /* restore R13 */
++    movq    0x10(%rdx), %r14        /* restore R14 */
++    movq    0x18(%rdx), %r15        /* restore R15 */
++    movq    0x20(%rdx), %rdi        /* restore RDI */
++    movq    0x28(%rdx), %rsi        /* restore RSI */
++    movq    0x30(%rdx), %rbx        /* restore RBX */
++    movq    0x38(%rdx), %rbp        /* restore RBP */
++
++    movq    %gs:(0x30), %r10        /* load NT_TIB */
++    movq    0x50(%rdx), %rax        /* load stack base */
++    movq    %rax,       0x08(%r10)  /* restore stack base */
++    movq    0x60(%rdx), %rax        /* load stack limit */
++    movq    %rax,       0x10(%r10)  /* restore stack limit */
++    movq    0x68(%rdx), %rax        /* load fiber local storage */
++    movq    %rax,       0x18(%r10)  /* restore fiber local storage */
++
++    movq    0x40(%rdx), %rsp        /* restore RSP */
++    movq    0x48(%rdx), %r10        /* fetch the address to returned to */
++
++    movq    %r8,        %rax        /* use third arg as return value after jump */
++    movq    %r8,        %rcx        /* use third arg as first arg in context function */
++
++    jmp     *%r10                   /* indirect jump to caller */
++.seh_endproc


More information about the scm-commits mailing list