|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r79956 - in trunk: boost/context/detail libs/context/doc libs/context/example libs/context/performance libs/context/src libs/context/src/asm libs/context/test
From: oliver.kowalke_at_[hidden]
Date: 2012-08-10 12:07:29
Author: olli
Date: 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
New Revision: 79956
URL: http://svn.boost.org/trac/boost/changeset/79956
Log:
context: use size instead of limit if fc_stack
Text files modified:
trunk/boost/context/detail/fcontext_arm.hpp | 6 ++-
trunk/boost/context/detail/fcontext_i386.hpp | 4 +-
trunk/boost/context/detail/fcontext_i386_win.hpp | 5 ++
trunk/boost/context/detail/fcontext_mips.hpp | 6 ++-
trunk/boost/context/detail/fcontext_ppc.hpp | 6 ++-
trunk/boost/context/detail/fcontext_x86_64.hpp | 6 ++-
trunk/boost/context/detail/fcontext_x86_64_win.hpp | 6 ++-
trunk/libs/context/doc/context.qbk | 1
trunk/libs/context/doc/fcontext.qbk | 20 ++++------
trunk/libs/context/example/exit.cpp | 6 +--
trunk/libs/context/example/jump.cpp | 6 +--
trunk/libs/context/example/transfer.cpp | 3 -
trunk/libs/context/performance/performance.cpp | 6 +--
trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S | 13 +++---
trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm | 61 +++++++++++++++++---------------
trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S | 25 ++++++-------
trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S | 19 ++++-----
trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S | 13 +++---
trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S | 11 ++---
trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S | 11 ++---
trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm | 73 ++++++++++++++++++++-------------------
trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S | 15 +++----
trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S | 15 +++----
trunk/libs/context/src/seh.cpp | 9 ++++
trunk/libs/context/src/stack_allocator_windows.cpp | 16 ++++----
trunk/libs/context/test/test_context.cpp | 14 +++---
26 files changed, 192 insertions(+), 184 deletions(-)
Modified: trunk/boost/context/detail/fcontext_arm.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_arm.hpp (original)
+++ trunk/boost/context/detail/fcontext_arm.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -7,6 +7,8 @@
#ifndef BOOST_CTX_DETAIL_FCONTEXT_ARM_H
#define BOOST_CTX_DETAIL_FCONTEXT_ARM_H
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -26,10 +28,10 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_i386.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_i386.hpp (original)
+++ trunk/boost/context/detail/fcontext_i386.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -28,10 +28,10 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_i386_win.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_i386_win.hpp (original)
+++ trunk/boost/context/detail/fcontext_i386_win.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -11,6 +11,8 @@
# pragma once
#endif
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -36,9 +38,10 @@
{
void * base;
void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), limit( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_mips.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_mips.hpp (original)
+++ trunk/boost/context/detail/fcontext_mips.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -7,6 +7,8 @@
#ifndef BOOST_CTX_DETAIL_FCONTEXT_MIPS_H
#define BOOST_CTX_DETAIL_FCONTEXT_MIPS_H
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -28,10 +30,10 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_ppc.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_ppc.hpp (original)
+++ trunk/boost/context/detail/fcontext_ppc.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -7,6 +7,8 @@
#ifndef BOOST_CTX_DETAIL_FCONTEXT_PPC_H
#define BOOST_CTX_DETAIL_FCONTEXT_PPC_H
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -26,10 +28,10 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_x86_64.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_x86_64.hpp (original)
+++ trunk/boost/context/detail/fcontext_x86_64.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -7,6 +7,8 @@
#ifndef BOOST_CTX_DETAIL_FCONTEXT_X86_64_H
#define BOOST_CTX_DETAIL_FCONTEXT_X86_64_H
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -26,10 +28,10 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), size( 0)
{}
};
Modified: trunk/boost/context/detail/fcontext_x86_64_win.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_x86_64_win.hpp (original)
+++ trunk/boost/context/detail/fcontext_x86_64_win.hpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -11,7 +11,8 @@
# pragma once
#endif
-#include <boost/assert.hpp>
+#include <cstddef>
+
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
@@ -37,9 +38,10 @@
{
void * base;
void * limit;
+ std::size_t size;
stack_t() :
- base( 0), limit( 0)
+ base( 0), limit( 0), size( 0)
{}
};
Modified: trunk/libs/context/doc/context.qbk
==============================================================================
--- trunk/libs/context/doc/context.qbk (original)
+++ trunk/libs/context/doc/context.qbk 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -51,7 +51,6 @@
[def __bad_alloc__ ['std::bad_alloc]]
[def __fc_base__ ['fc_base]]
-[def __fc_limit__ ['fc_limit]]
[def __fc_link__ ['fc_link]]
[def __jump_fcontext__ ['jump_fcontext()]]
[def __make_fcontext__ ['make_fcontext()]]
Modified: trunk/libs/context/doc/fcontext.qbk
==============================================================================
--- trunk/libs/context/doc/fcontext.qbk (original)
+++ trunk/libs/context/doc/fcontext.qbk 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -35,14 +35,13 @@
// creates and manages a protected stack (with guard page)
ctx::stack_allocator alloc;
fc.fc_stack.base = alloc.allocate(ctx::minimum_stacksize());
- fc.fc_stack.limit =
- static_cast< char * >( fc.fc_stack.base) - ctx::minimum_stacksize();
+ fc.fc_stack.size = ctx::minimum_stacksize();
// context fc uses f() as context function
make_fcontext( & fc, f);
__fcontext__ requires a pointer to the top of the stack (__fc_base__) as well
-as a pointer to the lower bound of the stack (__fc_limit__).
+as the size of the stack.
Calling __jump_fcontext__ invokes the __context_fn__ in a newly created context
complete with registers, flags, stack and instruction pointers. When control
@@ -78,13 +77,11 @@
ctx::stack_allocator alloc1, alloc2;
fc1.fc_stack.base = alloc1.allocate(ctx::minimum_stacksize());
- fc1.fc_stack.limit =
- static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f1);
fc2.fc_stack.base = alloc2.allocate(ctx::minimum_stacksize());
- fc2.fc_stack.limit =
- static_cast< char * >( fc2.fc_stack.base) - ctx::minimum_stacksize();
+ fc2.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc2, f2);
std::cout << "main: call jump_fcontext( & fcm, & fc1, 0)" << std::endl;
@@ -147,8 +144,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate(ctx::minimum_stacksize());
- fc1.fc_stack.limit =
- static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
fc1.fc_link = & fcm;
pair_t p( std::make_pair( 2, 7) );
ctx::make_fcontext( & fc1, f1);
@@ -199,7 +195,7 @@
struct stack_t
{
void * base;
- void * limit;
+ std::size_t size;
};
struct fcontext_t
@@ -217,9 +213,9 @@
[[Member:] [Pointer to the top of the stack.]]
]
-[heading `limit`]
+[heading `size`]
[variablelist
-[[Member:] [Pointer to the bottom of the stack.]]
+[[Member:] [Size of the stack in bytes.]]
]
[heading `fc_stack`]
Modified: trunk/libs/context/example/exit.cpp
==============================================================================
--- trunk/libs/context/example/exit.cpp (original)
+++ trunk/libs/context/example/exit.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -38,13 +38,11 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate(ctx::minimum_stacksize());
- fc1.fc_stack.limit =
- static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f1);
fc2.fc_stack.base = alloc.allocate(ctx::minimum_stacksize());
- fc2.fc_stack.limit =
- static_cast< char * >( fc2.fc_stack.base) - ctx::minimum_stacksize();
+ fc2.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc2, f2);
std::cout << "main: call start_fcontext( & fcm, & fc1, 0)" << std::endl;
Modified: trunk/libs/context/example/jump.cpp
==============================================================================
--- trunk/libs/context/example/jump.cpp (original)
+++ trunk/libs/context/example/jump.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -38,13 +38,11 @@
ctx::stack_allocator alloc1, alloc2;
fc1.fc_stack.base = alloc1.allocate(ctx::minimum_stacksize());
- fc1.fc_stack.limit =
- static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f1);
fc2.fc_stack.base = alloc2.allocate(ctx::minimum_stacksize());
- fc2.fc_stack.limit =
- static_cast< char * >( fc2.fc_stack.base) - ctx::minimum_stacksize();
+ fc2.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc2, f2);
std::cout << "main: call start_fcontext( & fcm, & fc1, 0)" << std::endl;
Modified: trunk/libs/context/example/transfer.cpp
==============================================================================
--- trunk/libs/context/example/transfer.cpp (original)
+++ trunk/libs/context/example/transfer.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -33,8 +33,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate(ctx::minimum_stacksize());
- fc1.fc_stack.limit =
- static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f1);
pair_t p( std::make_pair( 2, 7) );
Modified: trunk/libs/context/performance/performance.cpp
==============================================================================
--- trunk/libs/context/performance/performance.cpp (original)
+++ trunk/libs/context/performance/performance.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -116,8 +116,7 @@
{
ctx::stack_allocator alloc;
fc.fc_stack.base = alloc.allocate(ctx::default_stacksize());
- fc.fc_stack.limit =
- static_cast< char * >( fc.fc_stack.base) - ctx::default_stacksize();
+ fc.fc_stack.size = ctx::default_stacksize();
ctx::make_fcontext( & fc, f1);
ctx::jump_fcontext( & fcm, & fc, 7, preserve_fpu);
@@ -189,8 +188,7 @@
{
ctx::stack_allocator alloc;
fc.fc_stack.base = alloc.allocate(ctx::default_stacksize());
- fc.fc_stack.limit =
- static_cast< char * >( fc.fc_stack.base) - ctx::default_stacksize();
+ fc.fc_stack.size = ctx::default_stacksize();
ctx::make_fcontext( & fc, f1);
ctx::jump_fcontext( & fcm, & fc, 7, preserve_fpu);
Modified: trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -77,17 +77,16 @@
.align 2
.type make_fcontext,%function
make_fcontext:
- str a1, [a1,#0] @ save the address of passed context
- str a2, [a1,#40] @ save address of the context function
- ldr a2, [a1,#44] @ load the stack base
+ str a2, [a1,#40] @ save address of context function
+ ldr a2, [a1,#44] @ load address of context stack base
push {a1,lr} @ save pointer to fcontext_t
- mov a1, a2 @ stack pointer as arg for align_stack
- bl align_stack_at_PLT @ align stack
- mov a2, a1 @ begin of aligned stack
+ mov a1, a2 @ context stack pointer as arg for align_stack
+ bl align_stack_at_PLT @ call align_stack
+ mov a2, a1 @ begin of aligned context stack
pop {a1,lr} @ restore pointer to fcontext_t
- str a2, [a1,#32] @ save the aligned stack base
+ str a2, [a1,#32] @ save the aligned context stack base
adr a2, finish @ address of finish; called after context function returns
str a2, [a1,#36]
Modified: trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm (original)
+++ trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -12,30 +12,30 @@
; | EDI | ESI | EBX | EBP | ESP | EIP |
; --------------------------------------------------------------
; --------------------------------------------------------------
-; | 6 | 7 | |
+; | 6 | 7 | 8 | |
; --------------------------------------------------------------
-; | 018h | 01ch | |
+; | 018h | 01ch | 020h | |
; --------------------------------------------------------------
-; | ss_base | ss_limit| |
+; | base | limit | size | |
; --------------------------------------------------------------
; --------------------------------------------------------------
-; | 8 | |
+; | 9 | |
; --------------------------------------------------------------
-; | 020h | |
+; | 024h | |
; --------------------------------------------------------------
; |fc_execpt| |
; --------------------------------------------------------------
; --------------------------------------------------------------
-; | 9 | |
+; | 10 | |
; --------------------------------------------------------------
-; | 024h | |
+; | 028h | |
; --------------------------------------------------------------
; |fc_strage| |
; --------------------------------------------------------------
; --------------------------------------------------------------
-; | 10 | 11 | |
+; | 11 | 12 | |
; --------------------------------------------------------------
-; | 028h | 02ch | |
+; | 02ch | 030h | |
; --------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| |
; --------------------------------------------------------------
@@ -59,13 +59,13 @@
mov edx, fs:[018h] ; load NT_TIB
assume fs:error
mov eax, [edx] ; load current SEH exception list
- mov [ecx+020h], eax ; save current 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+01ch], eax ; save current stack limit
mov eax, [edx+010h] ; load fiber local storage
- mov [ecx+024h], eax ; save 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
@@ -82,22 +82,22 @@
test eax, eax
je nxt
- stmxcsr [ecx+028h] ; save MMX control word
- fnstcw [ecx+02ch] ; save x87 control word
- ldmxcsr [edx+028h] ; restore MMX control word
- fldcw [edx+02ch] ; 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
assume fs:nothing
mov edx, fs:[018h] ; load NT_TIB
assume fs:error
- mov eax, [ecx+020h] ; load SEH exception list
+ 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+01ch] ; load stack limit
mov [edx+08h], eax ; restore stack limit
- mov eax, [ecx+024h] ; load fiber local storage
+ 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
@@ -110,20 +110,23 @@
jump_fcontext ENDP
make_fcontext PROC EXPORT
- mov eax, [esp+04h] ; load address of the fcontext_t arg0
- mov [eax], eax ; save the address of passed context
- mov ecx, [esp+08h] ; load the address of the context function
- mov [eax+014h], ecx ; save the address of the context function
- mov edx, [eax+018h] ; load the stack base
+ mov eax, [esp+04h] ; load address of the fcontext_t
+ mov ecx, [esp+08h] ; load address of the context function
+ mov [eax+014h], ecx ; save address of the context function
+ mov edx, [eax+018h] ; load address of context stack base
+ mov ecx, [eax+020h] ; load context stack size
+ neg ecx ; negate stacksize for LEA
+ lea ecx, [edx+ecx] ; compute context stack limit
+ mov [eax+01ch], ecx ; save context stack limit
push eax ; save pointer to fcontext_t
- push edx ; stack pointer as arg for align_stack
- call align_stack ; align stack
- mov edx, eax ; begin of aligned stack
+ push edx ; context stack as arg for align_stack
+ call align_stack ; call align_stack
+ mov edx, eax ; begin of aligned context stack
pop eax ; remove arg for align_stack
pop eax ; restore pointer to fcontext_t
- lea edx, [edx-014h] ; reserve space for last frame on stack, (ESP + 4) & 15 == 0
+ lea edx, [edx-014h] ; reserve space for last frame on context stack, (ESP + 4) & 15 == 0
mov [eax+010h], edx ; save the aligned stack
mov ecx, seh_fcontext ; set ECX to exception-handler
@@ -131,10 +134,10 @@
mov ecx, 0ffffffffh ; set ECX to -1
mov [edx+08h], ecx ; save ECX as next SEH item
lea ecx, [edx+08h] ; load address of next SEH item
- mov [eax+02ch], ecx ; save next SEH
+ mov [eax+024h], ecx ; save next SEH
- stmxcsr [eax+028h] ; save MMX control word
- fnstcw [eax+02ch] ; save x87 control word
+ stmxcsr [eax+02ch] ; save MMX control word
+ fnstcw [eax+030h] ; save x87 control word
mov ecx, finish ; address of finish
mov [edx], ecx
Modified: trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -77,25 +77,24 @@
.type make_fcontext,@function
make_fcontext:
movl 0x4(%esp), %eax /* load address of the fcontext_t */
- movl %eax, (%eax) /* save the address of current context */
- movl 0x8(%esp), %ecx /* load the address of the context function */
- movl %ecx, 0x14(%eax) /* save the address of the context function */
- movl 0x18(%eax), %edx /* load the stack base */
+ movl 0x8(%esp), %ecx /* load address of the context function */
+ movl %ecx, 0x14(%eax) /* save address of the context function */
+ movl 0x18(%eax), %edx /* load address of context stack base */
pushl %eax /* save pointer to fcontext_t */
pushl %ebx /* save EBX */
- pushl %edx /* stack pointer as arg for align_stack */
+ pushl %edx /* context stack pointer as arg for align_stack */
call 1f
-1: popl %ebx /* address of label 1 */
+1: popl %ebx /* address of label 1 */
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx /* compute address of GOT and store it in EBX */
- call align_stack_at_PLT /* align stack */
- movl %eax, %edx /* begin of aligned stack */
- popl %eax /* remove arg for align_stack */
- popl %ebx /* restore EBX */
- popl %eax /* restore pointer to fcontext_t */
+ call align_stack_at_PLT /* call align_stack */
+ movl %eax, %edx /* begin of aligned context stack */
+ popl %eax /* remove arg for align_stack */
+ popl %ebx /* restore EBX */
+ popl %eax /* restore pointer to fcontext_t */
- leal -0x14(%edx), %edx /* reserve space for the last frame on stack, (ESP + 4) % 16 == 0 */
- movl %edx, 0x10(%eax) /* save the aligned stack base */
+ leal -0x14(%edx), %edx /* reserve space for the last frame on context stack, (ESP + 4) % 16 == 0 */
+ movl %edx, 0x10(%eax) /* save the aligned context stack base */
stmxcsr 0x20(%eax) /* save MMX control and status word */
fnstcw 0x24(%eax) /* save x87 control word */
Modified: trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -74,28 +74,27 @@
.align 2
_make_fcontext:
movl 0x4(%esp), %eax /* load address of the fcontext_t */
- movl %eax, (%eax) /* save the address of current context */
- movl 0x8(%esp), %ecx /* load the address of the context function */
- movl %ecx, 0x14(%eax) /* save the address of the context function */
- movl 0x18(%eax), %edx /* load the stack base */
+ movl 0x8(%esp), %ecx /* load address of the context function */
+ movl %ecx, 0x14(%eax) /* save address of the context function */
+ movl 0x18(%eax), %edx /* load address of context stack base */
pushl %eax /* save pointer to fcontext_t */
pushl %ebx /* save EBX */
- pushl %edx /* stack pointer as arg for align_stack */
- call _align_stack /* align stack */
- movl %eax, %edx /* begin of aligned stack */
+ pushl %edx /* context stack pointer as arg for align_stack */
+ call _align_stack /* call align_stack */
+ movl %eax, %edx /* begin of aligned context stack */
popl %eax /* remove arg for align_stack */
popl %ebx /* restore EBX */
popl %eax /* restore pointer to fcontext_t */
- leal -0x14(%edx), %edx /* reserve space for the last frame on stack, (ESP + 4) % 16 == 0 */
- movl %edx, 0x10(%eax) /* save the aligned stack base */
+ leal -0x14(%edx), %edx /* reserve space for the last frame on context stack, (ESP + 4) % 16 == 0 */
+ movl %edx, 0x10(%eax) /* save the aligned context stack base */
stmxcsr 0x20(%eax) /* save MMX control and status word */
fnstcw 0x24(%eax) /* save x87 control word */
call 1f
-1: popl %ecx
+1: popl %ecx /* address of lable 1 */
addl $finish-1b, %ecx /* helper code executed after context function returns */
movl %ecx, (%edx)
Modified: trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -109,19 +109,18 @@
.cpload $t9
.set reorder
#endif
- sw $a0, ($a0) # save the current context
sw $gp, 24($a0) # save global pointer
- sw $a1, 96($a0) # save the address of the context function
- lw $t0, 104($a0) # load the stack base
+ sw $a1, 96($a0) # save address of context function
+ lw $t0, 104($a0) # load address of context stack base
sub $sp, $sp, 28
sw $ra, 24($sp)
sw $a0, 20($sp)
- move $a0, $t0 # stack pointer as arg for align_stack
- lw $t9, %call16(align_stack)($gp) # align stack
- jalr $t9
+ move $a0, $t0 # context stack pointer as arg for align_stack
+ lw $t9, %call16(align_stack)($gp) # address of align_stack
+ jalr $t9 # call align_stack
nop
- move $t0, $v0 # begin of aligned stack
+ move $t0, $v0 # begin of aligned context stack
lw $ra, 24($sp)
lw $a0, 20($sp)
addi $sp, $sp, 28
Modified: trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -184,9 +184,8 @@
.align 2
.type make_fcontext,@function
make_fcontext:
- stw %r3, 0(%r3) # save the current context
- stw %r4, 88(%r3) # save the address of the context function
- lwz %r0, 92(%r3) # load the stack base
+ stw %r4, 88(%r3) # save address of context function
+ lwz %r0, 92(%r3) # load address of context stack base
li %r4, 28
subf %r1, %r4, %r1 # reserve space on stack
@@ -208,10 +207,10 @@
mflr %r0 # load LR
bl 1f # jump to label 1
1:
- mflr %r4 # load LR
+ mflr %r4 # load LR
addi %r4, %r4, finish - 1b # address of finish; called after context function returns
- mtlr %r0 # restore LR
- stw %r4, 84(%r3)
+ mtlr %r0 # restore LR
+ stw %r4, 84(%r3) # save address of finish
li %r3, 0
blr
Modified: trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -212,9 +212,8 @@
.type .make_fcontext,@function
.globl .make_fcontext
.make_fcontext:
- std %r3, 0(%r3) # save the current context
- std %r4, 176(%r3) # save the address of the function supposed to be run
- ld %r0, 184(%r3) # load the stack base
+ std %r4, 176(%r3) # save address of context function
+ ld %r0, 184(%r3) # load address of context stack base
li %r4, 56
subf %r1, %r4, %r1 # reserve space on stack
@@ -236,10 +235,10 @@
mflr %r0 # load LR
bl 1f # jump to label 1
1:
- mflr %r4 # load LR
+ mflr %r4 # load LR
addi %r4, %r4, finish - 1b # calulate absolute address of finish
- mtlr %r0 # restore LR
- std %r4, 168(%r3) # save address of finish
+ mtlr %r0 # restore LR
+ std %r4, 168(%r3) # save address of finish
li %r3, 0 # set return value to zero
blr
Modified: trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm (original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -23,61 +23,61 @@
; ----------------------------------------------------------------------------------
; | 0x40 | 0x44 | 0x48 | 0x4c | |
; ----------------------------------------------------------------------------------
-; | RSP | RIP | |
+; | RSP | RIP | |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 20 | 21 | 22 | 23 | |
+; | 20 | 21 | 22 | 23 | 24 | 25 | |
; ----------------------------------------------------------------------------------
-; | 0x50 | 0x54 | 0x58 | 0x5c | |
+; | 0x50 | 0x54 | 0x58 | 0x5c | 0x60 | 0x64 | |
; ----------------------------------------------------------------------------------
-; | sbase | slimit | |
+; | base | limit | size | |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 24 | 25 | |
+; | 26 | 27 | |
; ----------------------------------------------------------------------------------
-; | 0x60 | 0x64 | |
+; | 0x68 | 0x6c | |
; ----------------------------------------------------------------------------------
; | fbr_strg | |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 26 | 27 | 28 | 29 | |
+; | 28 | 29 | 30 | 31 | |
; ----------------------------------------------------------------------------------
-; | 0x68 | 0x6c | 0x70 | 0x74 | |
+; | 0x70 | 0x74 | 0x78 | 0x7c | |
; ----------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| fc_xmm | |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
+; | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
; ----------------------------------------------------------------------------------
-; | 0x78 | 0x7c | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 |
+; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
; ----------------------------------------------------------------------------------
; | XMM6 | XMM7 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
+; | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
; ----------------------------------------------------------------------------------
-; | 0x98 | 0x9c | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 |
+; | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c |
; ----------------------------------------------------------------------------------
; | XMM8 | XMM9 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
+; | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
; ----------------------------------------------------------------------------------
-; | 0x118 | 0x11c | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 |
+; | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c |
; ----------------------------------------------------------------------------------
; | XMM10 | XMM11 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
+; | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
; ----------------------------------------------------------------------------------
-; | 0x138 | 0x13c | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 |
+; | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c |
; ----------------------------------------------------------------------------------
; | XMM12 | XMM13 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
-; | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
+; | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
; ----------------------------------------------------------------------------------
-; | 0x158 | 0x15c | 0x160 | 0x164 | 0x168 | 0x16c | 0x170 | 0x174 |
+; | 0x160 | 0x164 | 0x168 | 0x16c | 0x170 | 0x174 | 0x178 | 0x17c |
; ----------------------------------------------------------------------------------
; | XMM14 | XMM15 |
; ----------------------------------------------------------------------------------
@@ -105,14 +105,14 @@
mov rax, [r10+010h] ; load current stack limit
mov [rcx+058h], rax ; save current stack limit
mov rax, [r10+018h] ; load fiber local storage
- mov [rcx+060h], rax ; save fiber local storage
+ mov [rcx+068h], rax ; save fiber local storage
test r9, r9
je nxt
- stmxcsr [rcx+068h] ; save MMX control and status word
- fnstcw [rcx+06ch] ; save x87 control word
- mov r10, [rcx+070h] ; address of aligned XMM storage
+ stmxcsr [rcx+070h] ; save MMX control and status word
+ fnstcw [rcx+074h] ; save x87 control word
+ mov r10, [rcx+078h] ; address of aligned XMM storage
movaps [r10], xmm6
movaps [r10+010h], xmm7
movaps [r10+020h], xmm8
@@ -124,9 +124,9 @@
movaps [r10+080h], xmm14
movaps [r10+090h], xmm15
- ldmxcsr [rdx+068h] ; restore MMX control and status word
- fldcw [rdx+06ch] ; restore x87 control word
- mov r10, [rdx+070h] ; address of aligned XMM storage
+ ldmxcsr [rdx+070h] ; restore MMX control and status word
+ fldcw [rdx+074h] ; restore x87 control word
+ mov r10, [rdx+078h] ; address of aligned XMM storage
movaps xmm6, [r10]
movaps xmm7, [r10+010h]
movaps xmm8, [r10+020h]
@@ -158,7 +158,7 @@
mov [r10+08h], rax ; restore stack base
mov rax, [rdx+058h] ; load stack limit
mov [r10+010h], rax ; restore stack limit
- mov rax, [rdx+060h] ; load fiber local storage
+ mov rax, [rdx+068h] ; load fiber local storage
mov [r10+018h], rax ; restore fiber local storage
mov rsp, [rdx+040h] ; restore RSP
@@ -173,24 +173,27 @@
make_fcontext PROC EXPORT FRAME ; generate function table entry in .pdata and unwind information in E
.endprolog ; .xdata for a function's structured exception handling unwind behavior
- mov [rcx], rcx ; store the address of current context
- mov [rcx+048h], rdx ; save the address of the function supposed to run
- mov rdx, [rcx+050h] ; load the address where the context stack beginns
+ mov [rcx+048h], rdx ; save address of context function
+ mov rdx, [rcx+050h] ; load address of context stack base
+ mov r8, [rcx+060h] ; load context stack size
+ neg r8 ; negate r8 for LEA
+ lea r8, [rdx+r8] ; compute the address of context stack limit
+ mov [rcx+058h], r8 ; save the address of context stack limit
push rcx ; save pointer to fcontext_t
sub rsp, 028h ; reserve shadow space for align_stack
- mov rcx, rdx ; stack pointer as arg for align_stack
+ mov rcx, rdx ; context stack pointer as arg for align_stack
mov [rsp+8], rcx
- call align_stack ; align stack
- mov rdx, rax ; begin of aligned stack
+ call align_stack ; call align_stack
+ mov rdx, rax ; begin of aligned context stack
add rsp, 028h
pop rcx ; restore pointer to fcontext_t
lea rdx, [rdx-028h] ; reserve 32byte shadow space + return address on stack, (RSP + 8) % 16 == 0
- mov [rcx+040h], rdx ; save the address where the context stack beginns
+ mov [rcx+040h], rdx ; save the address where the context stack begins
- stmxcsr [rcx+068h] ; save MMX control and status word
- fnstcw [rcx+06ch] ; save x87 control word
+ stmxcsr [rcx+070h] ; save MMX control and status word
+ fnstcw [rcx+074h] ; save x87 control word
lea rax, finish ; helper code executed after fn() returns
mov [rdx], rax ; store address off the helper function as return address
Modified: trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -86,18 +86,17 @@
.type make_fcontext,@function
.align 16
make_fcontext:
- movq %rdi, (%rdi) /* save the address of passed context */
- movq %rsi, 0x38(%rdi) /* save the address of the context function */
- movq 0x40(%rdi), %rdx /* load the stack base */
+ movq %rsi, 0x38(%rdi) /* save address of context function */
+ movq 0x40(%rdi), %rdx /* load address of context stack base */
pushq %rdi /* save pointer to fcontext_t */
- movq %rdx, %rdi /* stack pointer as arg for align_stack */
- call align_stack_at_PLT /* align stack */
- movq %rax, %rdx /* begin of aligned stack */
+ movq %rdx, %rdi /* context stack pointer as arg for align_stack */
+ call align_stack_at_PLT /* align context stack */
+ movq %rax, %rdx /* begin of aligned context stack */
popq %rdi /* restore pointer to fcontext_t */
- leaq -0x8(%rdx), %rdx /* reserve space for the last frame on stack, (RSP + 8) & 15 == 0 */
- movq %rdx, 0x30(%rdi) /* save the algined stack base */
+ leaq -0x8(%rdx), %rdx /* reserve space for the last frame on context stack, (RSP + 8) & 15 == 0 */
+ movq %rdx, 0x30(%rdi) /* save the algined context stack base */
stmxcsr 0x50(%rdi) /* save MMX control and status word */
fnstcw 0x54(%rdi) /* save x87 control word */
Modified: trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -83,18 +83,17 @@
.globl _make_fcontext
.align 8
_make_fcontext:
- movq %rdi, (%rdi) /* save the address of current context */
- movq %rsi, 0x38(%rdi) /* save the address of the function supposed to run */
- movq 0x40(%rdi), %rdx /* load the stack base */
+ movq %rsi, 0x38(%rdi) /* save address of context function */
+ movq 0x40(%rdi), %rdx /* load address of context stack base */
pushq %rdi /* save pointer to fcontext_t */
- movq %rdx, %rdi /* stack pointer as arg for align_stack */
- call _align_stack /* align stack */
- movq %rax, %rdx /* begin of aligned stack */
+ movq %rdx, %rdi /* context stack pointer as arg for align_stack */
+ call _align_stack /* call align_stack */
+ movq %rax, %rdx /* begin of aligned context stack */
popq %rdi /* restore pointer to fcontext_t */
- leaq -0x8(%rdx), %rdx /* reserve space for the last frame on stack, (RSP + 8) % 16 == 0 */
- movq %rdx, 0x30(%rdi) /* save the address */
+ leaq -0x8(%rdx), %rdx /* reserve space for the last frame on context stack, (RSP + 8) % 16 == 0 */
+ movq %rdx, 0x30(%rdi) /* save the algined context stack base */
stmxcsr 0x50(%rdi) /* save MMX control and status word */
fnstcw 0x54(%rdi) /* save x87 control word */
Modified: trunk/libs/context/src/seh.cpp
==============================================================================
--- trunk/libs/context/src/seh.cpp (original)
+++ trunk/libs/context/src/seh.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -6,6 +6,11 @@
#define BOOST_CONTEXT_SOURCE
+# if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4996)
+# endif
+
extern "C" {
#include <stddef.h>
@@ -80,4 +85,8 @@
return ExceptionContinueSearch; // never reached
}
+# if defined(BOOST_MSVC)
+# pragma warning(pop)
+# endif
+
}
Modified: trunk/libs/context/src/stack_allocator_windows.cpp
==============================================================================
--- trunk/libs/context/src/stack_allocator_windows.cpp (original)
+++ trunk/libs/context/src/stack_allocator_windows.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -21,15 +21,15 @@
#include <boost/context/stack_utils.hpp>
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
# if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable:4244 4267)
# endif
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
+
namespace boost {
namespace ctx {
@@ -77,10 +77,10 @@
}}
-# if defined(BOOST_MSVC)
-# pragma warning(pop)
-# endif
-
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
+
+# if defined(BOOST_MSVC)
+# pragma warning(pop)
+# endif
Modified: trunk/libs/context/test/test_context.cpp
==============================================================================
--- trunk/libs/context/test/test_context.cpp (original)
+++ trunk/libs/context/test/test_context.cpp 2012-08-10 12:07:25 EDT (Fri, 10 Aug 2012)
@@ -81,7 +81,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f1);
BOOST_CHECK_EQUAL( 0, value1);
@@ -96,7 +96,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f3);
BOOST_CHECK_EQUAL( 0, value1);
@@ -111,7 +111,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
ctx::make_fcontext( & fc1, f4);
int result = ( int) ctx::jump_fcontext( & fcm, & fc1, 0);
@@ -123,7 +123,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
int i = 7;
ctx::make_fcontext( & fc1, f5);
@@ -136,7 +136,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
std::pair< int, int > data = std::make_pair( 3, 7);
ctx::make_fcontext( & fc1, f6);
@@ -152,7 +152,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
const char * what = "hello world";
ctx::make_fcontext( & fc1, f7);
@@ -165,7 +165,7 @@
ctx::stack_allocator alloc;
fc1.fc_stack.base = alloc.allocate( ctx::minimum_stacksize() );
- fc1.fc_stack.limit = static_cast< char * >( fc1.fc_stack.base) - ctx::minimum_stacksize();
+ fc1.fc_stack.size = ctx::minimum_stacksize();
double d = 7.13;
ctx::make_fcontext( & fc1, f8);
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk