$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r84199 - in branches/release/libs/context: . src/asm
From: oliver.kowalke_at_[hidden]
Date: 2013-05-09 01:40:44
Author: olli
Date: 2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
New Revision: 84199
URL: http://svn.boost.org/trac/boost/changeset/84199
Log:
context: merge from trunk
Properties modified: 
   branches/release/libs/context/   (props changed)
Text files modified: 
   branches/release/libs/context/src/asm/jump_i386_ms_pe_masm.asm   |   103 ++++++++++++++++++++++----------------- 
   branches/release/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm |    57 +++++++++++++--------                   
   branches/release/libs/context/src/asm/make_i386_ms_pe_masm.asm   |    10 +++                                     
   branches/release/libs/context/src/asm/make_ppc32_sysv_elf_gas.S  |     2                                         
   branches/release/libs/context/src/asm/make_ppc64_sysv_elf_gas.S  |     7 +-                                      
   branches/release/libs/context/src/asm/make_x86_64_ms_pe_masm.asm |    14 ++++-                                   
   6 files changed, 116 insertions(+), 77 deletions(-)
Modified: branches/release/libs/context/src/asm/jump_i386_ms_pe_masm.asm
==============================================================================
--- branches/release/libs/context/src/asm/jump_i386_ms_pe_masm.asm	(original)
+++ branches/release/libs/context/src/asm/jump_i386_ms_pe_masm.asm	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -39,6 +39,13 @@
 ;  --------------------------------------------------------------
 ;  | fc_mxcsr|fc_x87_cw|                                        |
 ;  --------------------------------------------------------------
+;  --------------------------------------------------------------
+;  |   13    |                                                  |
+;  --------------------------------------------------------------
+;  |  034h   |                                                  |
+;  --------------------------------------------------------------
+;  |fc_deallo|                                                  |
+;  --------------------------------------------------------------
 
 .386
 .XMM
@@ -46,62 +53,66 @@
 .code
 
 jump_fcontext PROC EXPORT
-    mov     ecx,         [esp+04h]  ; load address of the first fcontext_t arg
-    mov     [ecx],       edi        ; save EDI
-    mov     [ecx+04h],   esi        ; save ESI
-    mov     [ecx+08h],   ebx        ; save EBX
-    mov     [ecx+0ch],   ebp        ; save EBP
+    mov     ecx,         [esp+04h]   ; load address of the first fcontext_t arg
+    mov     [ecx],       edi         ; save EDI
+    mov     [ecx+04h],   esi         ; save ESI
+    mov     [ecx+08h],   ebx         ; save EBX
+    mov     [ecx+0ch],   ebp         ; save EBP
 
     assume  fs:nothing
-    mov     edx,         fs:[018h]  ; load NT_TIB
+    mov     edx,         fs:[018h]   ; load NT_TIB
     assume  fs:error
-    mov     eax,         [edx]      ; load current SEH exception list
-    mov     [ecx+024h],  eax        ; save current exception list
-    mov     eax,         [edx+04h]  ; load current stack base
-    mov     [ecx+018h],  eax        ; save current stack base
-    mov     eax,         [edx+08h]  ; load current stack limit
-    mov     [ecx+020h],  eax        ; save current stack limit
-    mov     eax,         [edx+010h] ; load fiber local storage
-    mov     [ecx+028h],  eax        ; save fiber local storage
-
-    lea     eax,         [esp+04h]  ; exclude the return address
-    mov     [ecx+010h],  eax        ; save as stack pointer
-    mov     eax,         [esp]      ; load return address
-    mov     [ecx+014h],  eax        ; save return address
-
-    mov     edx,        [esp+08h]   ; load address of the second fcontext_t arg
-    mov     edi,        [edx]       ; restore EDI
-    mov     esi,        [edx+04h]   ; restore ESI
-    mov     ebx,        [edx+08h]   ; restore EBX
-    mov     ebp,        [edx+0ch]   ; restore EBP
+    mov     eax,         [edx]       ; load current SEH exception list
+    mov     [ecx+024h],  eax         ; save current exception list
+    mov     eax,         [edx+04h]   ; load current stack base
+    mov     [ecx+018h],  eax         ; save current stack base
+    mov     eax,         [edx+08h]   ; load current stack limit
+    mov     [ecx+020h],  eax         ; save current stack limit
+    mov     eax,         [edx+0e0ch] ; load current deallocation stack
+    mov     [ecx+034h],  eax         ; save current deallocation stack
+    mov     eax,         [edx+010h]  ; load fiber local storage
+    mov     [ecx+028h],  eax         ; save fiber local storage
+
+    lea     eax,         [esp+04h]   ; exclude the return address
+    mov     [ecx+010h],  eax         ; save as stack pointer
+    mov     eax,         [esp]       ; load return address
+    mov     [ecx+014h],  eax         ; save return address
+
+    mov     edx,        [esp+08h]    ; load address of the second fcontext_t arg
+    mov     edi,        [edx]        ; restore EDI
+    mov     esi,        [edx+04h]    ; restore ESI
+    mov     ebx,        [edx+08h]    ; restore EBX
+    mov     ebp,        [edx+0ch]    ; restore EBP
 
-    mov     eax,        [esp+010h]  ; check if fpu enve preserving was requested
+    mov     eax,        [esp+010h]   ; check if fpu enve preserving was requested
     test    eax,        eax 
     je      nxt
 
-    stmxcsr [ecx+02ch]              ; save MMX control word
-    fnstcw  [ecx+030h]              ; save x87 control word
-    ldmxcsr [edx+02ch]              ; restore MMX control word
-    fldcw   [edx+030h]              ; restore x87 control word
+    stmxcsr [ecx+02ch]               ; save MMX control word
+    fnstcw  [ecx+030h]               ; save x87 control word
+    ldmxcsr [edx+02ch]               ; restore MMX control word
+    fldcw   [edx+030h]               ; restore x87 control word
 nxt:
-    mov     ecx,        edx
+    mov     ecx,         edx
     assume  fs:nothing
-    mov     edx,        fs:[018h]   ; load NT_TIB
+    mov     edx,         fs:[018h]   ; load NT_TIB
     assume  fs:error
-    mov     eax,        [ecx+024h]  ; load SEH exception list
-    mov     [edx],      eax         ; restore next SEH item
-    mov     eax,        [ecx+018h]  ; load stack base
-    mov     [edx+04h],  eax         ; restore stack base
-    mov     eax,        [ecx+020h]  ; load stack limit
-    mov     [edx+08h],  eax         ; restore stack limit
-    mov     eax,        [ecx+028h]  ; load fiber local storage
-    mov     [edx+010h], eax         ; restore fiber local storage
-
-    mov     eax,        [esp+0ch]   ; use third arg as return value after jump
-
-    mov     esp,        [ecx+010h]  ; restore ESP
-    mov     [esp+04h],  eax         ; use third arg as first arg in context function
-    mov     ecx,        [ecx+014h]  ; fetch the address to return to
+    mov     eax,         [ecx+024h]  ; load SEH exception list
+    mov     [edx],       eax         ; restore next SEH item
+    mov     eax,         [ecx+018h]  ; load stack base
+    mov     [edx+04h],   eax         ; restore stack base
+    mov     eax,         [ecx+020h]  ; load stack limit
+    mov     [edx+08h],   eax         ; restore stack limit
+    mov     eax,         [ecx+034h]  ; load deallocation stack
+    mov     [edx+0e0ch], eax         ; restore deallocation stack
+    mov     eax,         [ecx+028h]  ; load fiber local storage
+    mov     [edx+010h],  eax         ; restore fiber local storage
+
+    mov     eax,         [esp+0ch]   ; use third arg as return value after jump
+
+    mov     esp,         [ecx+010h]  ; restore ESP
+    mov     [esp+04h],   eax         ; use third arg as first arg in context function
+    mov     ecx,         [ecx+014h]  ; fetch the address to return to
 
     jmp     ecx                     ; indirect jump to context
 jump_fcontext ENDP
Modified: branches/release/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm
==============================================================================
--- branches/release/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm	(original)
+++ branches/release/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -81,6 +81,13 @@
 ;  ----------------------------------------------------------------------------------
 ;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    76   |   77    |                                                            |
+;  ----------------------------------------------------------------------------------
+;  |  0x130  |  0x134  |                                                            |
+;  ----------------------------------------------------------------------------------
+;  |    fc_dealloc     |                                                            |
+;  ----------------------------------------------------------------------------------
 
 EXTERN  _exit:PROC            ; standard C library function
 .code
@@ -88,22 +95,24 @@
 jump_fcontext PROC EXPORT FRAME
     .endprolog
 
-    mov     [rcx],       r12        ; save R12
-    mov     [rcx+08h],   r13        ; save R13
-    mov     [rcx+010h],  r14        ; save R14
-    mov     [rcx+018h],  r15        ; save R15
-    mov     [rcx+020h],  rdi        ; save RDI
-    mov     [rcx+028h],  rsi        ; save RSI
-    mov     [rcx+030h],  rbx        ; save RBX
-    mov     [rcx+038h],  rbp        ; save RBP
-
-    mov     r10,         gs:[030h]  ; load NT_TIB
-    mov     rax,         [r10+08h]  ; load current stack base
-    mov     [rcx+050h],  rax        ; save current stack base
-    mov     rax,         [r10+010h] ; load current stack limit
-    mov     [rcx+060h],  rax        ; save current stack limit
-    mov     rax,         [r10+018h] ; load fiber local storage
-    mov     [rcx+068h],  rax        ; save fiber local storage
+    mov     [rcx],       r12          ; save R12
+    mov     [rcx+08h],   r13          ; save R13
+    mov     [rcx+010h],  r14          ; save R14
+    mov     [rcx+018h],  r15          ; save R15
+    mov     [rcx+020h],  rdi          ; save RDI
+    mov     [rcx+028h],  rsi          ; save RSI
+    mov     [rcx+030h],  rbx          ; save RBX
+    mov     [rcx+038h],  rbp          ; save RBP
+
+    mov     r10,         gs:[030h]    ; load NT_TIB
+    mov     rax,         [r10+08h]    ; load current stack base
+    mov     [rcx+050h],  rax          ; save current stack base
+    mov     rax,         [r10+010h]   ; load current stack limit
+    mov     [rcx+060h],  rax          ; save current stack limit
+    mov     rax,         [r10+01478h] ; load current deallocation stack
+    mov     [rcx+0130h], rax          ; save current deallocation stack
+    mov     rax,         [r10+018h]   ; load fiber local storage
+    mov     [rcx+068h],  rax          ; save fiber local storage
 
     test    r9,          r9
     je      nxt
@@ -163,13 +172,15 @@
     mov     rbx,        [rdx+030h]  ; restore RBX
     mov     rbp,        [rdx+038h]  ; restore RBP
 
-    mov     r10,        gs:[030h]   ; load NT_TIB
-    mov     rax,        [rdx+050h]  ; load stack base
-    mov     [r10+08h],  rax         ; restore stack base
-    mov     rax,        [rdx+060h]  ; load stack limit
-    mov     [r10+010h], rax         ; restore stack limit
-    mov     rax,        [rdx+068h]  ; load fiber local storage
-    mov     [r10+018h], rax         ; restore fiber local storage
+    mov     r10,          gs:[030h]   ; load NT_TIB
+    mov     rax,          [rdx+050h]  ; load stack base
+    mov     [r10+08h],    rax         ; restore stack base
+    mov     rax,          [rdx+060h]  ; load stack limit
+    mov     [r10+010h],   rax         ; restore stack limit
+    mov     rax,          [rdx+0130h] ; load deallocation stack
+    mov     [r10+01478h], rax         ; restore deallocation stack
+    mov     rax,          [rdx+068h]  ; load fiber local storage
+    mov     [r10+018h],   rax         ; restore fiber local storage
 
     mov     rsp,        [rdx+040h]  ; restore RSP
     mov     r10,        [rdx+048h]  ; fetch the address to returned to
Modified: branches/release/libs/context/src/asm/make_i386_ms_pe_masm.asm
==============================================================================
--- branches/release/libs/context/src/asm/make_i386_ms_pe_masm.asm	(original)
+++ branches/release/libs/context/src/asm/make_i386_ms_pe_masm.asm	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -39,6 +39,13 @@
 ;  --------------------------------------------------------------
 ;  | fc_mxcsr|fc_x87_cw|                                        |
 ;  --------------------------------------------------------------
+;  --------------------------------------------------------------
+;  |   13    |                                                  |
+;  --------------------------------------------------------------
+;  |  034h   |                                                  |
+;  --------------------------------------------------------------
+;  |fc_deallo|                                                  |
+;  --------------------------------------------------------------
 
 .386
 .XMM
@@ -48,7 +55,7 @@
 
 make_fcontext PROC EXPORT
     mov  eax,         [esp+04h]     ; load 1. arg of make_fcontext, pointer to context stack (base)
-    lea  eax,         [eax-034h]    ; reserve space for fcontext_t at top of context stack
+    lea  eax,         [eax-038h]    ; 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
@@ -61,6 +68,7 @@
     neg  edx                        ; negate stack size for LEA instruction (== substraction)
     lea  ecx,         [ecx+edx]     ; compute bottom address of context stack (limit)
     mov  [eax+020h],  ecx           ; save address of context stack (limit) in fcontext_t
+    mov  [eax+034h],  ecx           ; save address of context stack limit as 'dealloction stack'
     mov  ecx,         [esp+0ch]     ; load 3. arg of make_fcontext, pointer to context function
     mov  [eax+014h],  ecx           ; save address of context function in fcontext_t
 
Modified: branches/release/libs/context/src/asm/make_ppc32_sysv_elf_gas.S
==============================================================================
--- branches/release/libs/context/src/asm/make_ppc32_sysv_elf_gas.S	(original)
+++ branches/release/libs/context/src/asm/make_ppc32_sysv_elf_gas.S	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -78,7 +78,7 @@
 
     # call align_stack, R3 contains address at 16 byte boundary after return
     # == pointer to fcontext_t and address of context stack
-    rlwinm  %r3, %r3, 0, 0, 27
+    clrrwi  %r3, %r3, 4
 
     stw     %r0, 92(%r3)        # save address of context stack (base) in fcontext_t
     stw     %r4, 96(%r3)        # save context stack size in fcontext_t
Modified: branches/release/libs/context/src/asm/make_ppc64_sysv_elf_gas.S
==============================================================================
--- branches/release/libs/context/src/asm/make_ppc64_sysv_elf_gas.S	(original)
+++ branches/release/libs/context/src/asm/make_ppc64_sysv_elf_gas.S	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -99,13 +99,13 @@
 
     # call align_stack, R3 contains address at 16 byte boundary after return
     # == pointer to fcontext_t and address of context stack
-    rlwinm  %r3, %r3, 0, 0, 59
+    clrrdi  %r3, %r3, 4
 
     std     %r0, 184(%r3)       # save address of context stack (base) in fcontext_t
     std     %r4, 192(%r3)       # save context stack size in fcontext_t
     std     %r5, 176(%r3)       # save address of context function in fcontext_t
 
-    subf    %r0, %r3, 64        # 64 bytes on stack for parameter area (== 8 registers)
+    subi    %r0, %r3, 64        # 64 bytes on stack for parameter area (== 8 registers)
     std     %r0, 152(%r3)       # save the stack base
 
     mflr    %r0                 # load LR
@@ -128,5 +128,6 @@
     stwu    %r1, -32(%r1)       # allocate stack space, SP % 16 == 0
 
     li      %r3,  0             # set return value to zero
-    bl      _exit_at_plt           # exit application
+    bl      _exit               # exit application
+    nop
 .size .make_fcontext, .-.make_fcontext
Modified: branches/release/libs/context/src/asm/make_x86_64_ms_pe_masm.asm
==============================================================================
--- branches/release/libs/context/src/asm/make_x86_64_ms_pe_masm.asm	(original)
+++ branches/release/libs/context/src/asm/make_x86_64_ms_pe_masm.asm	2013-05-09 01:40:43 EDT (Thu, 09 May 2013)
@@ -81,6 +81,13 @@
 ;  ----------------------------------------------------------------------------------
 ;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    76   |   77    |                                                            |
+;  ----------------------------------------------------------------------------------
+;  |  0x130  |  0x134  |                                                            |
+;  ----------------------------------------------------------------------------------
+;  |     fc_dealloc    |                                                            |
+;  ----------------------------------------------------------------------------------
 
 EXTERN  _exit:PROC            ; standard C library function
 .code
@@ -88,7 +95,7 @@
 make_fcontext PROC EXPORT FRAME  ; generate function table entry in .pdata and unwind information in
     .endprolog                   ; .xdata for a function's structured exception handling unwind behavior
 
-    lea  rax,        [rcx-0130h] ; reserve space for fcontext_t at top of context stack
+    lea  rax,        [rcx-0138h] ; 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
@@ -99,8 +106,9 @@
     mov  [rax+050h], rcx         ; save address of context stack pointer (base) in fcontext_t
 
     neg  rdx                     ; negate stack size for LEA instruction (== substraction)
-    lea  rcx,        [rcx+rdx]   ; compute bottom address of context stack (limit)
-    mov  [rax+060h], rcx         ; save bottom address of context stack (limit) in fcontext_t
+    lea  rcx,         [rcx+rdx]  ; compute bottom address of context stack (limit)
+    mov  [rax+060h],  rcx        ; save bottom address of context stack (limit) in fcontext_t
+    mov  [rax+0130h], rcx        ; save address of context stack limit as 'dealloction stack'
 
     stmxcsr [rax+070h]           ; save MMX control and status word
     fnstcw  [rax+074h]           ; save x87 control word