Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
las3_pub
/
predictable_parallel_patterns
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
c25e6134
authored
Feb 03, 2020
by
FritzFlorian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WIP: Add fcontext and thread sanitizer support to our coroutine abstraction.
parent
4a44ad9f
Pipeline
#1397
failed with stages
in 36 seconds
Changes
100
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
100 changed files
with
9232 additions
and
169 deletions
+9232
-169
app/benchmark_fft/main.cpp
+1
-1
app/benchmark_fib/main.cpp
+2
-1
app/playground/main.cpp
+6
-19
cmake/SetupThreadSanitizer.cmake
+2
-0
lib/context_switcher/CMakeLists.txt
+41
-10
lib/context_switcher/asm/cscontext/SelectAssemblyFiles.cmake
+20
-0
lib/context_switcher/asm/cscontext/enter_context_x86_64_sysv_elf.s
+18
-13
lib/context_switcher/asm/cscontext/switch_context_x86_64_sysv_elf.s
+4
-6
lib/context_switcher/asm/enter_context_arm32.s
+0
-53
lib/context_switcher/asm/fcontext/SelectAssemblyFiles.cmake
+27
-0
lib/context_switcher/asm/fcontext/jump_arm64_aapcs_elf_gas.S
+114
-0
lib/context_switcher/asm/fcontext/jump_arm64_aapcs_macho_gas.S
+109
-0
lib/context_switcher/asm/fcontext/jump_arm_aapcs_elf_gas.S
+88
-0
lib/context_switcher/asm/fcontext/jump_arm_aapcs_macho_gas.S
+95
-0
lib/context_switcher/asm/fcontext/jump_arm_aapcs_pe_armasm.asm
+81
-0
lib/context_switcher/asm/fcontext/jump_combined_sysv_macho_gas.S
+20
-0
lib/context_switcher/asm/fcontext/jump_i386_ms_pe_gas.asm
+123
-0
lib/context_switcher/asm/fcontext/jump_i386_ms_pe_masm.asm
+116
-0
lib/context_switcher/asm/fcontext/jump_i386_sysv_elf_gas.S
+83
-0
lib/context_switcher/asm/fcontext/jump_i386_sysv_macho_gas.S
+74
-0
lib/context_switcher/asm/fcontext/jump_i386_x86_64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/jump_mips32_o32_elf_gas.S
+119
-0
lib/context_switcher/asm/fcontext/jump_mips64_n64_elf_gas.S
+121
-0
lib/context_switcher/asm/fcontext/jump_ppc32_ppc64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_elf_gas.S
+201
-0
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_macho_gas.S
+201
-0
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_xcoff_gas.S
+203
-0
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_elf_gas.S
+221
-0
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_macho_gas.S
+164
-0
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_xcoff_gas.S
+92
-0
lib/context_switcher/asm/fcontext/jump_riscv64_sysv_elf_gas.S
+150
-0
lib/context_switcher/asm/fcontext/jump_s390x_sysv_elf_gas.S
+117
-0
lib/context_switcher/asm/fcontext/jump_x86_64_ms_pe_gas.asm
+209
-0
lib/context_switcher/asm/fcontext/jump_x86_64_ms_pe_masm.asm
+205
-0
lib/context_switcher/asm/fcontext/jump_x86_64_sysv_elf_gas.S
+81
-0
lib/context_switcher/asm/fcontext/jump_x86_64_sysv_macho_gas.S
+75
-0
lib/context_switcher/asm/fcontext/make_arm64_aapcs_elf_gas.S
+85
-0
lib/context_switcher/asm/fcontext/make_arm64_aapcs_macho_gas.S
+88
-0
lib/context_switcher/asm/fcontext/make_arm_aapcs_elf_gas.S
+81
-0
lib/context_switcher/asm/fcontext/make_arm_aapcs_macho_gas.S
+71
-0
lib/context_switcher/asm/fcontext/make_arm_aapcs_pe_armasm.asm
+77
-0
lib/context_switcher/asm/fcontext/make_combined_sysv_macho_gas.S
+20
-0
lib/context_switcher/asm/fcontext/make_i386_ms_pe_gas.asm
+153
-0
lib/context_switcher/asm/fcontext/make_i386_ms_pe_masm.asm
+140
-0
lib/context_switcher/asm/fcontext/make_i386_sysv_elf_gas.S
+107
-0
lib/context_switcher/asm/fcontext/make_i386_sysv_macho_gas.S
+90
-0
lib/context_switcher/asm/fcontext/make_i386_x86_64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/make_mips32_o32_elf_gas.S
+97
-0
lib/context_switcher/asm/fcontext/make_mips64_n64_elf_gas.S
+96
-0
lib/context_switcher/asm/fcontext/make_ppc32_ppc64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/make_ppc32_sysv_elf_gas.S
+146
-0
lib/context_switcher/asm/fcontext/make_ppc32_sysv_macho_gas.S
+137
-0
lib/context_switcher/asm/fcontext/make_ppc32_sysv_xcoff_gas.S
+138
-0
lib/context_switcher/asm/fcontext/make_ppc64_sysv_elf_gas.S
+177
-0
lib/context_switcher/asm/fcontext/make_ppc64_sysv_macho_gas.S
+126
-0
lib/context_switcher/asm/fcontext/make_ppc64_sysv_xcoff_gas.S
+68
-0
lib/context_switcher/asm/fcontext/make_riscv64_sysv_elf_gas.S
+91
-0
lib/context_switcher/asm/fcontext/make_s390x_sysv_elf_gas.S
+104
-0
lib/context_switcher/asm/fcontext/make_x86_64_ms_pe_gas.asm
+174
-0
lib/context_switcher/asm/fcontext/make_x86_64_ms_pe_masm.asm
+163
-0
lib/context_switcher/asm/fcontext/make_x86_64_sysv_elf_gas.S
+82
-0
lib/context_switcher/asm/fcontext/make_x86_64_sysv_macho_gas.S
+76
-0
lib/context_switcher/asm/fcontext/ontop_arm64_aapcs_elf_gas.S
+113
-0
lib/context_switcher/asm/fcontext/ontop_arm64_aapcs_macho_gas.S
+108
-0
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_elf_gas.S
+93
-0
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_macho_gas.S
+100
-0
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_pe_armasm.asm
+86
-0
lib/context_switcher/asm/fcontext/ontop_combined_sysv_macho_gas.S
+20
-0
lib/context_switcher/asm/fcontext/ontop_i386_ms_pe_gas.asm
+131
-0
lib/context_switcher/asm/fcontext/ontop_i386_ms_pe_masm.asm
+124
-0
lib/context_switcher/asm/fcontext/ontop_i386_sysv_elf_gas.S
+90
-0
lib/context_switcher/asm/fcontext/ontop_i386_sysv_macho_gas.S
+81
-0
lib/context_switcher/asm/fcontext/ontop_i386_x86_64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/ontop_mips32_o32_elf_gas.S
+120
-0
lib/context_switcher/asm/fcontext/ontop_mips64_n64_elf_gas.S
+120
-0
lib/context_switcher/asm/fcontext/ontop_ppc32_ppc64_sysv_macho_gas.S
+16
-0
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_elf_gas.S
+193
-0
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_macho_gas.S
+201
-0
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_xcoff_gas.S
+203
-0
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_elf_gas.S
+244
-0
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_macho_gas.S
+151
-0
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_xcoff_gas.S
+83
-0
lib/context_switcher/asm/fcontext/ontop_riscv64_sysv_elf_gas.S
+149
-0
lib/context_switcher/asm/fcontext/ontop_s390x_sysv_elf_gas.S
+112
-0
lib/context_switcher/asm/fcontext/ontop_x86_64_ms_pe_gas.asm
+211
-0
lib/context_switcher/asm/fcontext/ontop_x86_64_ms_pe_masm.asm
+207
-0
lib/context_switcher/asm/fcontext/ontop_x86_64_sysv_elf_gas.S
+84
-0
lib/context_switcher/asm/fcontext/ontop_x86_64_sysv_macho_gas.S
+78
-0
lib/context_switcher/asm/fcontext/tail_ppc32_sysv_elf_gas.cpp
+18
-0
lib/context_switcher/asm/switch_context_arm32.s
+0
-38
lib/context_switcher/include/context_switcher/context.h
+25
-0
lib/context_switcher/include/context_switcher/context_switcher.h
+42
-10
lib/context_switcher/include/context_switcher/continuation.h
+24
-6
lib/context_switcher/include/context_switcher/cscontext.h
+2
-1
lib/context_switcher/include/context_switcher/fcontext.h
+36
-0
lib/context_switcher/include/context_switcher/lambda_capture.h
+40
-7
lib/context_switcher/include/context_switcher/tsan_fiber_api.h
+21
-0
lib/context_switcher/src/context_switcher.cpp
+34
-3
lib/pls/include/pls/internal/base/error_handling.h
+1
-1
lib/pls/include/pls/internal/helpers/tsan_fiber_api.h
+21
-0
No files found.
app/benchmark_fft/main.cpp
View file @
c25e6134
...
@@ -37,7 +37,7 @@ void conquer(fft::complex_vector::iterator data, int n) {
...
@@ -37,7 +37,7 @@ void conquer(fft::complex_vector::iterator data, int n) {
constexpr
int
MAX_NUM_THREADS
=
8
;
constexpr
int
MAX_NUM_THREADS
=
8
;
constexpr
int
MAX_NUM_TASKS
=
32
;
constexpr
int
MAX_NUM_TASKS
=
32
;
constexpr
int
MAX_STACK_SIZE
=
1024
*
1
;
constexpr
int
MAX_STACK_SIZE
=
1024
*
4
;
static_scheduler_memory
<
MAX_NUM_THREADS
,
static_scheduler_memory
<
MAX_NUM_THREADS
,
MAX_NUM_TASKS
,
MAX_NUM_TASKS
,
...
...
app/benchmark_fib/main.cpp
View file @
c25e6134
...
@@ -33,7 +33,7 @@ int pls_fib(int n) {
...
@@ -33,7 +33,7 @@ int pls_fib(int n) {
constexpr
int
MAX_NUM_THREADS
=
8
;
constexpr
int
MAX_NUM_THREADS
=
8
;
constexpr
int
MAX_NUM_TASKS
=
32
;
constexpr
int
MAX_NUM_TASKS
=
32
;
constexpr
int
MAX_STACK_SIZE
=
1024
*
1
;
constexpr
int
MAX_STACK_SIZE
=
1024
*
64
;
static_scheduler_memory
<
MAX_NUM_THREADS
,
static_scheduler_memory
<
MAX_NUM_THREADS
,
MAX_NUM_TASKS
,
MAX_NUM_TASKS
,
...
@@ -51,6 +51,7 @@ int main(int argc, char **argv) {
...
@@ -51,6 +51,7 @@ int main(int argc, char **argv) {
scheduler
scheduler
{
global_scheduler_memory
,
(
unsigned
)
num_threads
};
scheduler
scheduler
{
global_scheduler_memory
,
(
unsigned
)
num_threads
};
volatile
int
res
;
volatile
int
res
;
scheduler
.
perform_work
([
&
]()
{
scheduler
.
perform_work
([
&
]()
{
for
(
int
i
=
0
;
i
<
fib
::
NUM_WARMUP_ITERATIONS
;
i
++
)
{
for
(
int
i
=
0
;
i
<
fib
::
NUM_WARMUP_ITERATIONS
;
i
++
)
{
res
=
pls_fib
(
fib
::
INPUT_N
);
res
=
pls_fib
(
fib
::
INPUT_N
);
...
...
app/playground/main.cpp
View file @
c25e6134
...
@@ -6,34 +6,21 @@ using namespace context_switcher;
...
@@ -6,34 +6,21 @@ using namespace context_switcher;
using
namespace
std
;
using
namespace
std
;
// Memory for custom stack and continuation semantics
// Memory for custom stack and continuation semantics
const
size_t
STACK_SIZE
=
512
*
16
;
const
size_t
STACK_SIZE
=
512
*
32
;
const
size_t
NUM_STACKS
=
4
;
const
size_t
NUM_STACKS
=
4
;
char
custom_stacks
[
NUM_STACKS
][
STACK_SIZE
];
char
custom_stacks
[
NUM_STACKS
][
STACK_SIZE
];
volatile
int
result
;
volatile
int
result
;
int
main
()
{
int
main
()
{
context_switcher
::
continuation
outer_cont
=
enter_context
(
custom_stacks
[
0
],
STACK_SIZE
,
[](
continuation
&&
main_cont
)
{
while
(
true
)
{
enter_context
(
custom_stacks
[
1
],
STACK_SIZE
,
[
&
main_cont
](
continuation
&&
middle_cont
)
{
context_switcher
::
continuation
cont
=
enter_context
(
custom_stacks
[
0
],
STACK_SIZE
,
[](
continuation
&&
main_cont
)
{
enter_context
(
custom_stacks
[
2
],
STACK_SIZE
,
[
&
main_cont
](
continuation
&&
inner_cont
)
{
// main_cont = context_switcher::switch_context(std::move(main_cont));
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
printf
(
"Inner %d
\n
"
,
i
);
main_cont
=
context_switcher
::
switch_context
(
std
::
move
(
main_cont
));
}
return
std
::
move
(
inner_cont
);
});
return
std
::
move
(
middle_cont
);
});
return
std
::
move
(
main_cont
);
return
std
::
move
(
main_cont
);
});
});
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
// cont = context_switcher::switch_context(std::move(cont));
printf
(
"Outer %d
\n
"
,
i
);
};
outer_cont
=
context_switcher
::
switch_context
(
std
::
move
(
outer_cont
));
}
return
0
;
return
0
;
}
}
cmake/SetupThreadSanitizer.cmake
View file @
c25e6134
...
@@ -6,5 +6,7 @@ option(THREAD_SANITIZER "Add thread sanitizer" OFF)
...
@@ -6,5 +6,7 @@ option(THREAD_SANITIZER "Add thread sanitizer" OFF)
if
(
THREAD_SANITIZER
)
if
(
THREAD_SANITIZER
)
add_compile_options
(
-fsanitize=thread -g -fno-omit-frame-pointer
)
add_compile_options
(
-fsanitize=thread -g -fno-omit-frame-pointer
)
set
(
CMAKE_EXE_LINKER_FLAGS
"
${
CMAKE_EXE_LINKER_FLAGS
}
-fsanitize=thread -fno-omit-frame-pointer"
)
set
(
CMAKE_EXE_LINKER_FLAGS
"
${
CMAKE_EXE_LINKER_FLAGS
}
-fsanitize=thread -fno-omit-frame-pointer"
)
add_compile_definitions
(
THREAD_SANITIZER
)
endif
()
endif
()
message
(
"-- Thread Sanitizer:
${
THREAD_SANITIZER
}
"
)
message
(
"-- Thread Sanitizer:
${
THREAD_SANITIZER
}
"
)
lib/context_switcher/CMakeLists.txt
View file @
c25e6134
...
@@ -7,23 +7,54 @@ project(context_switcher
...
@@ -7,23 +7,54 @@ project(context_switcher
set
(
CMAKE_CXX_STANDARD 11
)
set
(
CMAKE_CXX_STANDARD 11
)
# Platform Support - Edit this when porting the context switch facility.
# Platform Support - Edit this when porting the context switch facility.
# We are rather conservative with our flags, maybe more systems follow implemented calling conventions.
# Settings:
# See our documentation and boost context for help when adding a new system.
# CS_USE_BOOST = ON/OFF Use boost's fcontext as the assembly implementation for the context switch.
if
(
CMAKE_SYSTEM_PROCESSOR STREQUAL
"x86_64"
AND CMAKE_SYSTEM_NAME STREQUAL
"Linux"
)
# CS_USE_FAST = ON/OFF Use custom implementation optimized for fast creation/return context switch.
SET
(
CONTEXT_SWITCH_ASSEMBLY
"asm/enter_context_x86_64.s"
"asm/switch_context_x86_64.s"
)
# CMAKE_SYSTEM_PROCESSOR = String Target processor
elseif
(
CMAKE_SYSTEM_PROCESSOR STREQUAL
"armv7l"
AND CMAKE_SYSTEM_NAME STREQUAL
"Linux"
)
# CMAKE_SYSTEM_NAME = String Target
SET
(
CONTEXT_SWITCH_ASSEMBLY
"asm/enter_context_arm32.s"
"asm/switch_context_arm32.s"
)
#
# Typically cross compiling in cmake will set CMAKE_SYSTEM_PROCESSOR and CMAKE_SYSTEM_NAME.
# The library uses these two to select the correct assembly file for performing the context switch.
# We currently only include minimal system support in our config file. The fastest way to port the
# library is to see if one of the boost.context assembly files matches your target platform and adding
# that to tho selection script.
#
# By default we use CS_USE_FAST if available and fall back to CS_USE_BOOST if needed.
# When sanitizers are turned on (or other instrumentation) we recommend to use CS_USE_BOOST
# as its calling convention causes no problems with function entry/exit instrumentation.
message
(
"-- Configure Context Switcher:
${
CMAKE_SYSTEM_PROCESSOR
}
running
${
CMAKE_SYSTEM_NAME
}
"
)
include
(
asm/cscontext/SelectAssemblyFiles.cmake
)
include
(
asm/fcontext/SelectAssemblyFiles.cmake
)
if
(
CS_CSCONTEXT_FOUND AND NOT THREAD_SANITIZER AND NOT CS_FORCE_FALLBACK
)
MESSAGE
(
"-- Using cscontext implementation"
)
SET
(
CS_CONTEXT_SWITCH_ASSEMBLY
${
CS_CSCONTEXT_ASSEMBLY
}
)
SET
(
CS_USE_CSCONTEXT TRUE
)
elseif
(
CS_FCONTEXT_FOUND
)
if
(
THREAD_SANITIZER
)
MESSAGE
(
"-- Falling back to fcontext implementation (thread sanitizer active)"
)
else
()
MESSAGE
(
"-- Falling back to fcontext implementation"
)
endif
()
SET
(
CS_CONTEXT_SWITCH_ASSEMBLY
${
CS_FCONTEXT_ASSEMBLY
}
)
SET
(
CS_USE_CSCONTEXT FALSE
)
else
()
else
()
MESSAGE
(
FATAL_ERROR
"Platform (
${
CMAKE_SYSTEM_PROCESSOR
}
on
${
CMAKE_SYSTEM_NAME
}
) not supported! Please see Readme for instructions to port."
)
MESSAGE
(
FATAL_ERROR
"Platform (
${
CMAKE_SYSTEM_PROCESSOR
}
on
${
CMAKE_SYSTEM_NAME
}
) not supported! Please see Readme for instructions to port."
)
endif
()
endif
()
message
(
"-- Con
text Switcher:
${
CMAKE_SYSTEM_PROCESSOR
}
running
${
CMAKE_SYSTEM_NAME
}
"
)
message
(
"-- Con
figure Context Switcher: Configuration Done
"
)
add_library
(
context_switcher STATIC
add_library
(
context_switcher STATIC
${
CONTEXT_SWITCH_ASSEMBLY
}
${
C
S_C
ONTEXT_SWITCH_ASSEMBLY
}
include/context_switcher/context_switcher.h src/context_switcher.cpp
include/context_switcher/context_switcher.h src/context_switcher.cpp
include/context_switcher/assembly_bindings.h
include/context_switcher/cscontext.h
include/context_switcher/fcontext.h
include/context_switcher/continuation.h
include/context_switcher/continuation.h
include/context_switcher/lambda_capture.h
)
include/context_switcher/lambda_capture.h include/context_switcher/context.h
)
if
(
CS_USE_CSCONTEXT
)
target_compile_definitions
(
context_switcher PUBLIC CS_USE_CSCONTEXT
)
endif
()
# Add everything in `./include` to be in the include path of this project
# Add everything in `./include` to be in the include path of this project
target_include_directories
(
context_switcher
target_include_directories
(
context_switcher
...
...
lib/context_switcher/asm/cscontext/SelectAssemblyFiles.cmake
0 → 100644
View file @
c25e6134
# Tries to locate the correct CS_FAST_ASSEMBLY files for this platform and
# sets CS_CSCONTEXT_FOUND to true if the platform is supported.
#
# To add a platform add a clause locating the correct assembly implementations for the system.
SET
(
CS_CSCONTEXT_FOUND TRUE
)
if
(
CMAKE_SYSTEM_PROCESSOR STREQUAL
"x86_64"
AND CMAKE_SYSTEM_NAME STREQUAL
"Linux"
)
# Typical Linux running on x86_64
SET
(
CS_CSCONTEXT_ASSEMBLY
asm/cscontext/enter_context_x86_64_sysv_elf.s
asm/cscontext/switch_context_x86_64_sysv_elf.s
)
else
()
SET
(
CS_CSCONTEXT_FOUND FALSE
)
endif
()
if
(
CS_CSCONTEXT_FOUND
)
MESSAGE
(
"-- CS_CSCONTEXT_FOUND:
${
CS_CSCONTEXT_ASSEMBLY
}
"
)
else
()
MESSAGE
(
"-- CS_CSCONTEXT_FOUND: NOT FOUND"
)
endif
()
lib/context_switcher/asm/
enter_context_x86_64
.s
→
lib/context_switcher/asm/
cscontext/enter_context_x86_64_sysv_elf
.s
View file @
c25e6134
...
@@ -17,11 +17,9 @@ __cs_enter_context:
...
@@ -17,11 +17,9 @@ __cs_enter_context:
# Variables
# Variables
# r12 = temporary for the old stack pointer
# r12 = temporary for the old stack pointer
pushq %rbp
movq %rsp, %rbp
subq $0x38, %rsp
############### Save State ###############
############### Save State ###############
# Make space on the stack
leaq -0x38(%rsp), %rsp
# Store calee saved general registers.
# Store calee saved general registers.
movq %r12, 0x00(%rsp)
movq %r12, 0x00(%rsp)
movq %r13, 0x08(%rsp)
movq %r13, 0x08(%rsp)
...
@@ -43,12 +41,13 @@ __cs_enter_context:
...
@@ -43,12 +41,13 @@ __cs_enter_context:
# Switch to new stack pointer.
# Switch to new stack pointer.
movq %rdi, %rsp
movq %rdi, %rsp
# Init the new stack (in our case we want the stack trace to 'stick' to where it was created.
# Init the new stack to something reasonable.
# This will not necessary be valid all the time (thus returning into it is not ok), but
# Here we point it at the finish part of our function with the frame pointer at 0x0.
# we only use it for debugging as we explicitly state throwing exceptions beyond the fiber is not ok.
# This is not stricly required, but stops debuggers/tools from freaking out.
# pushq 0x8(%rbp)
leaq __cs_finish(%rip), %r13
# pushq 0x0(%rbp)
pushq %r13
# movq %rsp, %rbp
pushq $0x0
movq %rsp, %rbp
# Perform actual function call, this will now be on the new stack
# Perform actual function call, this will now be on the new stack
# rdi = first parametor to callback (continuation)
# rdi = first parametor to callback (continuation)
...
@@ -73,12 +72,18 @@ __cs_enter_context:
...
@@ -73,12 +72,18 @@ __cs_enter_context:
ldmxcsr 0x30(%rsp)
ldmxcsr 0x30(%rsp)
# restore x87 control-word
# restore x87 control-word
fldcw 0x34(%rsp)
fldcw 0x34(%rsp)
# Free space on the stack
leaq 0x38(%rsp), %rsp
############ Restore State ############
############ Restore State ############
# Just return back from the call.
# Just return back from the call.
# This is the end of a fiber, so we have no continuation.
# This is the end of a fiber, so we have no continuation.
xor %rax, %rax
xor %rax, %rax
movq %rbp, %rsp
popq %rbp
ret
ret
__cs_finish:
# exit code is zero
xorq %rdi, %rdi
# exit application
call _exit@PLT
hlt
lib/context_switcher/asm/
switch_context_x86_64
.s
→
lib/context_switcher/asm/
cscontext/switch_context_x86_64_sysv_elf
.s
View file @
c25e6134
...
@@ -11,11 +11,9 @@ __cs_switch_context:
...
@@ -11,11 +11,9 @@ __cs_switch_context:
# Return
# Return
# rax = continuation that returned control back to the caller (null if fallthrough)
# rax = continuation that returned control back to the caller (null if fallthrough)
pushq %rbp
movq %rsp, %rbp
subq $0x38, %rsp
############### Save State ###############
############### Save State ###############
# Make space on the stack
leaq -0x38(%rsp), %rsp
# Store calee saved general registers.
# Store calee saved general registers.
movq %r12, 0x00(%rsp)
movq %r12, 0x00(%rsp)
movq %r13, 0x08(%rsp)
movq %r13, 0x08(%rsp)
...
@@ -47,10 +45,10 @@ __cs_switch_context:
...
@@ -47,10 +45,10 @@ __cs_switch_context:
ldmxcsr 0x30(%rsp)
ldmxcsr 0x30(%rsp)
# restore x87 control-word
# restore x87 control-word
fldcw 0x34(%rsp)
fldcw 0x34(%rsp)
# Free space on the stack
leaq 0x38(%rsp), %rsp
############ Restore State ############
############ Restore State ############
# Return the context we came from as a continuation.
# Return the context we came from as a continuation.
# rax has already the correct value
# rax has already the correct value
movq %rbp, %rsp
popq %rbp
ret
ret
lib/context_switcher/asm/enter_context_arm32.s
deleted
100644 → 0
View file @
4a44ad9f
.arm
.text
.global __cs_enter_context
.type __cs_enter_context, %function
__cs_enter_context:
/* Parameter List (in order)
* r0 = new stack pointer
* r1 = first parameter to callback
* r2 = callback function pointer
* r3 = new stack limit (not used on most platforms)
*
* Return
* r0 = continuation that returned control back to the caller (null if fallthrough)
*
* Variables
* r4 = temporary for the old stack pointer */
/* ========== Save State ========== */
/* store programm counter for later return */
push {lr}
/* store callee saved registers */
push {r4-r12,lr}
/* ========== Save State ========== */
/* Perform change to new stack */
/* Keep old stack as second parameter to our callback function. */
mov r4, sp
/* Make sure that stack start is properly aligned. */
and r0, r0, #-16
/* Switch to new stack pointer. */
mov sp, r0
/* Perform actual function call, this will now be on the new stack */
/* r0 = first parametor to callback (continuation) */
/* r1 = second parameter to callback (arbetary pointer) */
mov r0, r4
blx r2
/* Restore state of returned continuation. */
/* To do so we first reset the stack pointer (which we get returned in r0). */
/* After that we execute our standard restore procedere to pop the state from the stack. */
mov sp, r0
/* ========== Restore State ========== */
/* restore callee saved registers */
pop {r4-r12,lr}
/* ========== Restore State ========== */
/* Just return back from the call. */
/* This is the end of a fiber, so we have no continuation. */
eor r0, r0, r0
pop {pc}
lib/context_switcher/asm/fcontext/SelectAssemblyFiles.cmake
0 → 100644
View file @
c25e6134
# Tries to locate the correct CS_FCONTEXT_ASSEMBLY files for this platform and
# sets CS_FCONTEXT_FOUND to true if the platform is supported.
#
# To add a platform add a clause locating the correct assembly implementations for the system.
SET
(
CS_FCONTEXT_FOUND TRUE
)
if
(
CMAKE_SYSTEM_PROCESSOR STREQUAL
"x86_64"
AND CMAKE_SYSTEM_NAME STREQUAL
"Linux"
)
# Typical Linux running on x86_64
SET
(
CS_FCONTEXT_ASSEMBLY
asm/fcontext/jump_x86_64_sysv_elf_gas.S
asm/fcontext/make_x86_64_sysv_elf_gas.S
asm/fcontext/ontop_x86_64_sysv_elf_gas.S
)
elseif
(
CMAKE_SYSTEM_PROCESSOR STREQUAL
"armv7l"
AND CMAKE_SYSTEM_NAME STREQUAL
"Linux"
)
# Typical Linux running on ARMv7
SET
(
CS_FCONTEXT_ASSEMBLY
asm/fcontext/jump_arm_aapcs_elf_gas.S
asm/fcontext/make_arm_aapcs_elf_gas.S
asm/fcontext/ontop_arm_aapcs_elf_gas.S
)
else
()
SET
(
CS_FCONTEXT_FOUND FALSE
)
endif
()
if
(
CS_FCONTEXT_FOUND
)
MESSAGE
(
"-- CS_FCONTEXT_FOUND:
${
CS_FCONTEXT_ASSEMBLY
}
"
)
else
()
MESSAGE
(
"-- CS_FCONTEXT_FOUND: NOT FOUND"
)
endif
()
lib/context_switcher/asm/fcontext/jump_arm64_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "jump_arm64_aapcs_elf_gas.S"
.text
.align 2
.global jump_fcontext
.type jump_fcontext, %function
jump_fcontext:
# prepare stack for GP + FPU
sub sp, sp, #0xb0
# save d8 - d15
stp d8, d9, [sp, #0x00]
stp d10, d11, [sp, #0x10]
stp d12, d13, [sp, #0x20]
stp d14, d15, [sp, #0x30]
# save x19-x30
stp x19, x20, [sp, #0x40]
stp x21, x22, [sp, #0x50]
stp x23, x24, [sp, #0x60]
stp x25, x26, [sp, #0x70]
stp x27, x28, [sp, #0x80]
stp x29, x30, [sp, #0x90]
# save LR as PC
str x30, [sp, #0xa0]
# store RSP (pointing to context-data) in X0
mov x4, sp
# restore RSP (pointing to context-data) from X1
mov sp, x0
# load d8 - d15
ldp d8, d9, [sp, #0x00]
ldp d10, d11, [sp, #0x10]
ldp d12, d13, [sp, #0x20]
ldp d14, d15, [sp, #0x30]
# load x19-x30
ldp x19, x20, [sp, #0x40]
ldp x21, x22, [sp, #0x50]
ldp x23, x24, [sp, #0x60]
ldp x25, x26, [sp, #0x70]
ldp x27, x28, [sp, #0x80]
ldp x29, x30, [sp, #0x90]
# return transfer_t from jump
# pass transfer_t as first arg in context function
# X0 == FCTX, X1 == DATA
mov x0, x4
# load pc
ldr x4, [sp, #0xa0]
# restore stack from GP + FPU
add sp, sp, #0xb0
ret x4
.size jump_fcontext,.-jump_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_arm64_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _jump_fcontext
.balign 16
_jump_fcontext:
; prepare stack for GP + FPU
sub sp, sp, #0xb0
; save d8 - d15
stp d8, d9, [sp, #0x00]
stp d10, d11, [sp, #0x10]
stp d12, d13, [sp, #0x20]
stp d14, d15, [sp, #0x30]
; save x19-x30
stp x19, x20, [sp, #0x40]
stp x21, x22, [sp, #0x50]
stp x23, x24, [sp, #0x60]
stp x25, x26, [sp, #0x70]
stp x27, x28, [sp, #0x80]
stp fp, lr, [sp, #0x90]
; save LR as PC
str lr, [sp, #0xa0]
; store RSP (pointing to context-data) in X0
mov x4, sp
; restore RSP (pointing to context-data) from X1
mov sp, x0
; load d8 - d15
ldp d8, d9, [sp, #0x00]
ldp d10, d11, [sp, #0x10]
ldp d12, d13, [sp, #0x20]
ldp d14, d15, [sp, #0x30]
; load x19-x30
ldp x19, x20, [sp, #0x40]
ldp x21, x22, [sp, #0x50]
ldp x23, x24, [sp, #0x60]
ldp x25, x26, [sp, #0x70]
ldp x27, x28, [sp, #0x80]
ldp fp, lr, [sp, #0x90]
; return transfer_t from jump
; pass transfer_t as first arg in context function
; X0 == FCTX, X1 == DATA
mov x0, x4
; load pc
ldr x4, [sp, #0xa0]
; restore stack from GP + FPU
add sp, sp, #0xb0
ret x4
lib/context_switcher/asm/fcontext/jump_arm_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* |hiddn| v1 | v2 | v3 | v4 | v5 | v6 | v7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "jump_arm_aapcs_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,%function
.syntax unified
jump_fcontext:
@ save LR as PC
push {lr}
@ save hidden,V1-V8,LR
push {a1,v1-v8,lr}
@ prepare stack for FPU
sub sp, sp, #64
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ save S16-S31
vstmia sp, {d8-d15}
#endif
@ store RSP (pointing to context-data) in A1
mov a1, sp
@ restore RSP (pointing to context-data) from A2
mov sp, a2
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ restore S16-S31
vldmia sp, {d8-d15}
#endif
@ prepare stack for FPU
add sp, sp, #64
@ restore hidden,V1-V8,LR
pop {a4,v1-v8,lr}
@ return transfer_t from jump
str a1, [a4, #0]
str a3, [a4, #4]
@ pass transfer_t as first arg in context function
@ A1 == FCTX, A2 == DATA
mov a2, a3
@ restore PC
pop {pc}
.size jump_fcontext,.-jump_fcontext
@ Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_arm_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
* ------------------------------------------------- *
* | sjlj|hiddn| v1 | v2 | v3 | v4 | v5 | v6 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | v7 | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _jump_fcontext
.align 2
_jump_fcontext:
@ save LR as PC
push {lr}
@ save hidden,V1-V8,LR
push {a1,v1-v8,lr}
@ locate TLS to save/restore SjLj handler
mrc p15, 0, v2, c13, c0, #3
bic v2, v2, #3
@ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
ldr v1, [v2, #8]
@ save SjLj handler
push {v1}
@ prepare stack for FPU
sub sp, sp, #64
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ save S16-S31
vstmia sp, {d8-d15}
#endif
@ store RSP (pointing to context-data) in A1
mov a1, sp
@ restore RSP (pointing to context-data) from A2
mov sp, a2
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ restore S16-S31
vldmia sp, {d8-d15}
#endif
@ prepare stack for FPU
add sp, sp, #64
@ r#estore SjLj handler
pop {v1}
@ store SjLj handler in TLS
str v1, [v2, #8]
@ restore hidden,V1-V8,LR
pop {a4,v1-v8,lr}
@ return transfer_t from jump
str a1, [a4, #0]
str a3, [a4, #4]
@ pass transfer_t as first arg in context function
@ A1 == FCTX, A2 == DATA
mov a2, a3
@ restore PC
pop {pc}
lib/context_switcher/asm/fcontext/jump_arm_aapcs_pe_armasm.asm
0 → 100644
View file @
c25e6134
;/*
; Copyright Oliver Kowalke 2009.
; 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| *
; * ------------------------------------------------- *
; * |deall|limit| base|hiddn| v1 | v2 | v3 | v4 | *
; * ------------------------------------------------- *
; * ------------------------------------------------- *
; * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
; * ------------------------------------------------- *
; * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
; * ------------------------------------------------- *
; * | v5 | v6 | v7 | v8 | lr | pc | FCTX| DATA| *
; * ------------------------------------------------- *
; * *
; *******************************************************
AREA
|
.
text
|
,
CODE
ALIGN
4
EXPORT
jump_fcontext
jump_fcontext
PROC
; save LR as PC
push
{
lr
}
; save hidden,V1-V8,LR
push
{
a1
,
v1
-
v8
,
lr
}
; load TIB to save/restore thread size and limit.
; we do not need preserve CPU flag and can use it's arg register
mrc
p15
,
#
0
,
v1
,
c13
,
c0
,
#
2
; save current stack base
ldr
a5
,
[
v1
,
#
0x04
]
push
{
a5
}
; save current stack limit
ldr
a5
,
[
v1
,
#
0x08
]
push
{
a5
}
; save current deallocation stack
ldr
a5
,
[
v1
,
#
0xe0c
]
push
{
a5
}
; store RSP (pointing to context-data) in A1
mov
a1
,
sp
; restore RSP (pointing to context-data) from A2
mov
sp
,
a2
; restore deallocation stack
pop
{
a5
}
str
a5
,
[
v1
,
#
0xe0c
]
; restore stack limit
pop
{
a5
}
str
a5
,
[
v1
,
#
0x08
]
; restore stack base
pop
{
a5
}
str
a5
,
[
v1
,
#
0x04
]
; restore hidden,V1-V8,LR
pop
{
a4
,
v1
-
v8
,
lr
}
; return transfer_t from jump
str
a1
,
[
a4
,
#
0
]
str
a3
,
[
a4
,
#
4
]
; pass transfer_t as first arg in context function
; A1 == FCTX, A2 == DATA
mov
a2
,
a3
; restore PC
pop
{
pc
}
ENDP
END
lib/context_switcher/asm/fcontext/jump_combined_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "jump_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "jump_x86_64_sysv_macho_gas.S"
#elif defined(__ppc__)
#include "jump_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "jump_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/jump_i386_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
---------------------------------------------------------------------------------
*
*
|
0
h
|
04
h
|
08
h
|
0
ch
|
010
h
|
014
h
|
018
h
|
01
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
fc_strg
|
fc_deallo
|
limit
|
base
|
fc_seh
|
EDI
|
*
*
---------------------------------------------------------------------------------
*
*
---------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
---------------------------------------------------------------------------------
*
*
|
020
h
|
024
h
|
028
h
|
02
ch
|
030
h
|
034
h
|
038
h
|
03
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
ESI
|
EBX
|
EBP
|
EIP
|
to
|
data
|
EH
NXT
|
SEH
HNDLR
|
*
*
---------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"jump_i386_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
/*
mark
as
using
no
unregistered
SEH
handlers
*/
.
globl
@
feat
.
00
.
def
@
feat
.
00
; .scl 3; .type 0; .endef
.
set
@
feat
.
00
,
1
.
globl
_jump_fcontext
.
def
_jump_fcontext
; .scl 2; .type 32; .endef
_jump_fcontext
:
/*
prepare
stack
*/
leal
-
0x2c
(
%
esp
),
%
esp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
save
MMX
control
-
and
status
-
word
*/
stmxcsr
(
%
esp
)
/*
save
x87
control
-
word
*/
fnstcw
0x4
(
%
esp
)
#
endif
/*
load
NT_TIB
*/
movl
%
fs
:
(
0x18
),
%
edx
/*
load
fiber
local
storage
*/
movl
0x10
(
%
edx
),
%
eax
movl
%
eax
,
0x8
(
%
esp
)
/*
load
current
dealloction
stack
*/
movl
0xe0c
(
%
edx
),
%
eax
movl
%
eax
,
0xc
(
%
esp
)
/*
load
current
stack
limit
*/
movl
0x8
(
%
edx
),
%
eax
movl
%
eax
,
0x10
(
%
esp
)
/*
load
current
stack
base
*/
movl
0x4
(
%
edx
),
%
eax
movl
%
eax
,
0x14
(
%
esp
)
/*
load
current
SEH
exception
list
*/
movl
(
%
edx
),
%
eax
movl
%
eax
,
0x18
(
%
esp
)
movl
%
edi
,
0x1c
(
%
esp
)
/*
save
EDI
*/
movl
%
esi
,
0x20
(
%
esp
)
/*
save
ESI
*/
movl
%
ebx
,
0x24
(
%
esp
)
/*
save
EBX
*/
movl
%
ebp
,
0x28
(
%
esp
)
/*
save
EBP
*/
/*
store
ESP
(
pointing
to
context
-
data
)
in
EAX
*/
movl
%
esp
,
%
eax
/*
firstarg
of
jump_fcontext
()
==
fcontext
to
jump
to
*/
movl
0x30
(
%
esp
),
%
ecx
/*
restore
ESP
(
pointing
to
context
-
data
)
from
ECX
*/
movl
%
ecx
,
%
esp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
restore
MMX
control
-
and
status
-
word
*/
ldmxcsr
(
%
esp
)
/*
restore
x87
control
-
word
*/
fldcw
0x4
(
%
esp
)
#
endif
/*
restore
NT_TIB
into
EDX
*/
movl
%
fs
:
(
0x18
),
%
edx
/*
restore
fiber
local
storage
*/
movl
0x8
(
%
esp
),
%
ecx
movl
%
ecx
,
0x10
(
%
edx
)
/*
restore
current
deallocation
stack
*/
movl
0xc
(
%
esp
),
%
ecx
movl
%
ecx
,
0xe0c
(
%
edx
)
/*
restore
current
stack
limit
*/
movl
0x10
(
%
esp
),
%
ecx
movl
%
ecx
,
0x8
(
%
edx
)
/*
restore
current
stack
base
*/
movl
0x14
(
%
esp
),
%
ecx
movl
%
ecx
,
0x4
(
%
edx
)
/*
restore
current
SEH
exception
list
*/
movl
0x18
(
%
esp
),
%
ecx
movl
%
ecx
,
(
%
edx
)
movl
0x2c
(
%
esp
),
%
ecx
/*
restore
EIP
*/
movl
0x1c
(
%
esp
),
%
edi
/*
restore
EDI
*/
movl
0x20
(
%
esp
),
%
esi
/*
restore
ESI
*/
movl
0x24
(
%
esp
),
%
ebx
/*
restore
EBX
*/
movl
0x28
(
%
esp
),
%
ebp
/*
restore
EBP
*/
/*
prepare
stack
*/
leal
0x30
(
%
esp
),
%
esp
/*
return
transfer_t
*/
/*
FCTX
==
EAX
,
DATA
==
EDX
*/
movl
0x34
(
%
eax
),
%
edx
/*
jump
to
context
*/
jmp
*
%
ecx
.
section
.
drectve
.
ascii
" -export:
\"
_jump_fcontext
\"
"
lib/context_switcher/asm/fcontext/jump_i386_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ---------------------------------------------------------------------------------
; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
; ---------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
; ---------------------------------------------------------------------------------
; ---------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ---------------------------------------------------------------------------------
; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
; ---------------------------------------------------------------------------------
; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
; ---------------------------------------------------------------------------------
.
386
.
XMM
.
model
flat
,
c
.
code
jump_fcontext
PROC
BOOST_CONTEXT_EXPORT
; prepare stack
lea
esp
,
[
esp
-
02
ch
]
IFNDEF
BOOST_USE_TSX
; save MMX control- and status-word
stmxcsr
[esp]
; save x87 control-word
fnstcw
[
esp
+
04
h
]
ENDIF
assume
fs
:
nothing
; load NT_TIB into ECX
mov
edx
,
fs
:
[018h]
assume
fs
:
error
; load fiber local storage
mov
eax
,
[
edx
+
010
h
]
mov
[
esp
+
08
h
]
,
eax
; load current deallocation stack
mov
eax
,
[
edx
+
0
e0ch
]
mov
[
esp
+
0
ch
]
,
eax
; load current stack limit
mov
eax
,
[
edx
+
08
h
]
mov
[
esp
+
010
h
]
,
eax
; load current stack base
mov
eax
,
[
edx
+
04
h
]
mov
[
esp
+
014
h
]
,
eax
; load current SEH exception list
mov
eax
,
[edx]
mov
[
esp
+
018
h
]
,
eax
mov
[
esp
+
01
ch
]
,
edi
; save EDI
mov
[
esp
+
020
h
]
,
esi
; save ESI
mov
[
esp
+
024
h
]
,
ebx
; save EBX
mov
[
esp
+
028
h
]
,
ebp
; save EBP
; store ESP (pointing to context-data) in EAX
mov
eax
,
esp
; firstarg of jump_fcontext() == fcontext to jump to
mov
ecx
,
[
esp
+
030
h
]
; restore ESP (pointing to context-data) from ECX
mov
esp
,
ecx
IFNDEF
BOOST_USE_TSX
; restore MMX control- and status-word
ldmxcsr
[esp]
; restore x87 control-word
fldcw
[
esp
+
04
h
]
ENDIF
assume
fs
:
nothing
; load NT_TIB into EDX
mov
edx
,
fs
:
[018h]
assume
fs
:
error
; restore fiber local storage
mov
ecx
,
[
esp
+
08
h
]
mov
[
edx
+
010
h
]
,
ecx
; restore current deallocation stack
mov
ecx
,
[
esp
+
0
ch
]
mov
[
edx
+
0
e0ch
]
,
ecx
; restore current stack limit
mov
ecx
,
[
esp
+
010
h
]
mov
[
edx
+
08
h
]
,
ecx
; restore current stack base
mov
ecx
,
[
esp
+
014
h
]
mov
[
edx
+
04
h
]
,
ecx
; restore current SEH exception list
mov
ecx
,
[
esp
+
018
h
]
mov
[edx],
ecx
mov
ecx
,
[
esp
+
02
ch
]
; restore EIP
mov
edi
,
[
esp
+
01
ch
]
; restore EDI
mov
esi
,
[
esp
+
020
h
]
; restore ESI
mov
ebx
,
[
esp
+
024
h
]
; restore EBX
mov
ebp
,
[
esp
+
028
h
]
; restore EBP
; prepare stack
lea
esp
,
[
esp
+
030
h
]
; return transfer_t
; FCTX == EAX, DATA == EDX
mov
edx
,
[
eax
+
034
h
]
; jump to context
jmp
ecx
jump_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/jump_i386_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | | *
* ---------------------------------------------------------------------------------- *
* | to | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "jump_i386_sysv_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,@function
jump_fcontext:
leal -0x18(%esp), %esp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%esp) /* save MMX control- and status-word */
fnstcw 0x4(%esp) /* save x87 control-word */
#endif
movl %edi, 0x8(%esp) /* save EDI */
movl %esi, 0xc(%esp) /* save ESI */
movl %ebx, 0x10(%esp) /* save EBX */
movl %ebp, 0x14(%esp) /* save EBP */
/* store ESP (pointing to context-data) in ECX */
movl %esp, %ecx
/* first arg of jump_fcontext() == fcontext to jump to */
movl 0x20(%esp), %eax
/* second arg of jump_fcontext() == data to be transferred */
movl 0x24(%esp), %edx
/* restore ESP (pointing to context-data) from EAX */
movl %eax, %esp
/* address of returned transport_t */
movl 0x1c(%esp), %eax
/* return parent fcontext_t */
movl %ecx, (%eax)
/* return data */
movl %edx, 0x4(%eax)
movl 0x18(%esp), %ecx /* restore EIP */
#if !defined(BOOST_USE_TSX)
ldmxcsr (%esp) /* restore MMX control- and status-word */
fldcw 0x4(%esp) /* restore x87 control-word */
#endif
movl 0x8(%esp), %edi /* restore EDI */
movl 0xc(%esp), %esi /* restore ESI */
movl 0x10(%esp), %ebx /* restore EBX */
movl 0x14(%esp), %ebp /* restore EBP */
leal 0x20(%esp), %esp /* prepare stack */
/* jump to context */
jmp *%ecx
.size jump_fcontext,.-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_i386_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | to | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | | *
* ---------------------------------------------------------------------------------- *
* | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _jump_fcontext
.align 2
_jump_fcontext:
leal -0x18(%esp), %esp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%esp) /* save MMX control- and status-word */
fnstcw 0x4(%esp) /* save x87 control-word */
#endif
movl %edi, 0x8(%esp) /* save EDI */
movl %esi, 0xc(%esp) /* save ESI */
movl %ebx, 0x10(%esp) /* save EBX */
movl %ebp, 0x14(%esp) /* save EBP */
/* store ESP (pointing to context-data) in ECX */
movl %esp, %ecx
/* first arg of jump_fcontext() == fcontext to jump to */
movl 0x1c(%esp), %eax
/* second arg of jump_fcontext() == data to be transferred */
movl 0x20(%esp), %edx
/* restore ESP (pointing to context-data) from EAX */
movl %eax, %esp
/* return parent fcontext_t */
movl %ecx, %eax
/* returned data is stored in EDX */
movl 0x18(%esp), %ecx /* restore EIP */
#if !defined(BOOST_USE_TSX)
ldmxcsr (%esp) /* restore MMX control- and status-word */
fldcw 0x4(%esp) /* restore x87 control-word */
#endif
movl 0x8(%esp), %edi /* restore EDI */
movl 0xc(%esp), %esi /* restore ESI */
movl 0x10(%esp), %ebx /* restore EBX */
movl 0x14(%esp), %ebp /* restore EBP */
leal 0x1c(%esp), %esp /* prepare stack */
/* jump to context */
jmp *%ecx
lib/context_switcher/asm/fcontext/jump_i386_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "jump_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "jump_x86_64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/jump_mips32_o32_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F20 | F22 | F24 | F26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F28 | F30 | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | ABI ARGS | GP | FCTX| DATA| | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "jump_mips32_o32_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,@function
.ent jump_fcontext
jump_fcontext:
# reserve space on stack
addiu $sp, $sp, -96
sw $s0, 48($sp) # save S0
sw $s1, 52($sp) # save S1
sw $s2, 56($sp) # save S2
sw $s3, 60($sp) # save S3
sw $s4, 64($sp) # save S4
sw $s5, 68($sp) # save S5
sw $s6, 72($sp) # save S6
sw $s7, 76($sp) # save S7
sw $fp, 80($sp) # save FP
sw $a0, 84($sp) # save hidden, address of returned transfer_t
sw $ra, 88($sp) # save RA
sw $ra, 92($sp) # save RA as PC
#if defined(__mips_hard_float)
s.d $f20, ($sp) # save F20
s.d $f22, 8($sp) # save F22
s.d $f24, 16($sp) # save F24
s.d $f26, 24($sp) # save F26
s.d $f28, 32($sp) # save F28
s.d $f30, 40($sp) # save F30
#endif
# store SP (pointing to context-data) in A0
move $a0, $sp
# restore SP (pointing to context-data) from A1
move $sp, $a1
#if defined(__mips_hard_float)
l.d $f20, ($sp) # restore F20
l.d $f22, 8($sp) # restore F22
l.d $f24, 16($sp) # restore F24
l.d $f26, 24($sp) # restore F26
l.d $f28, 32($sp) # restore F28
l.d $f30, 40($sp) # restore F30
#endif
lw $s0, 48($sp) # restore S0
lw $s1, 52($sp) # restore S1
lw $s2, 56($sp) # restore S2
lw $s3, 60($sp) # restore S3
lw $s4, 64($sp) # restore S4
lw $s5, 68($sp) # restore S5
lw $s6, 72($sp) # restore S6
lw $s7, 76($sp) # restore S7
lw $fp, 80($sp) # restore FP
lw $v0, 84($sp) # restore hidden, address of returned transfer_t
lw $ra, 88($sp) # restore RA
# load PC
lw $t9, 92($sp)
# adjust stack
addiu $sp, $sp, 96
# return transfer_t from jump
sw $a0, ($v0) # fctx of transfer_t
sw $a2, 4($v0) # data of transfer_t
# pass transfer_t as first arg in context function
# A0 == fctx, A1 == data
move $a1, $a2
# jump to context
jr $t9
.end jump_fcontext
.size jump_fcontext, .-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_mips64_n64_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Jiaxun Yang 2018.
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 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | F24 | F25 | F26 | F27 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | F28 | F29 | F30 | F31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | FP | GP | RA | PC | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "jump_mips64_n64_elf_gas.S"
.text
.globl jump_fcontext
.align 3
.type jump_fcontext,@function
.ent jump_fcontext
jump_fcontext:
# reserve space on stack
daddiu $sp, $sp, -160
sd $s0, 64($sp) # save S0
sd $s1, 72($sp) # save S1
sd $s2, 80($sp) # save S2
sd $s3, 88($sp) # save S3
sd $s4, 96($sp) # save S4
sd $s5, 104($sp) # save S5
sd $s6, 112($sp) # save S6
sd $s7, 120($sp) # save S7
sd $fp, 128($sp) # save FP
sd $ra, 144($sp) # save RA
sd $ra, 152($sp) # save RA as PC
s.d $f24, 0($sp) # save F24
s.d $f25, 8($sp) # save F25
s.d $f26, 16($sp) # save F26
s.d $f27, 24($sp) # save F27
s.d $f28, 32($sp) # save F28
s.d $f29, 40($sp) # save F29
s.d $f30, 48($sp) # save F30
s.d $f31, 56($sp) # save F31
# store SP (pointing to old context-data) in v0 as return
move $v0, $sp
# get SP (pointing to new context-data) from a0 param
move $sp, $a0
l.d $f24, 0($sp) # restore F24
l.d $f25, 8($sp) # restore F25
l.d $f26, 16($sp) # restore F26
l.d $f27, 24($sp) # restore F27
l.d $f28, 32($sp) # restore F28
l.d $f29, 40($sp) # restore F29
l.d $f30, 48($sp) # restore F30
l.d $f31, 56($sp) # restore F31
ld $s0, 64($sp) # restore S0
ld $s1, 72($sp) # restore S1
ld $s2, 80($sp) # restore S2
ld $s3, 88($sp) # restore S3
ld $s4, 96($sp) # restore S4
ld $s5, 104($sp) # restore S5
ld $s6, 112($sp) # restore S6
ld $s7, 120($sp) # restore S7
ld $fp, 128($sp) # restore FP
ld $ra, 144($sp) # restore RAa
# load PC
ld $t9, 152($sp)
# adjust stack
daddiu $sp, $sp, 160
move $a0, $v0 # move old sp from v0 to a0 as param
move $v1, $a1 # move *data from a1 to v1 as return
# jump to context
jr $t9
.end jump_fcontext
.size jump_fcontext, .-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_ppc32_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__ppc__)
#include "jump_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "jump_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------|------------ *
* | 224 | 228 | 232 | 236 | 240 | 244 | *
* ------------------------|------------ *
* | F30 | F31 |bchai| LR | *
* ------------------------|------------ *
* *
*******************************************************/
.file "jump_ppc32_sysv_elf_gas.S"
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,@function
jump_fcontext:
# Linux: jump_fcontext( hidden transfer_t * R3, R4, R5)
# Other: transfer_t R3:R4 = jump_fcontext( R3, R4)
mflr %r0 # return address from LR
mffs %f0 # FPSCR
mfcr %r8 # condition register
stwu %r1, -240(%r1) # allocate stack space, R1 % 16 == 0
stw %r0, 244(%r1) # save LR in caller's frame
#ifdef __linux__
stw %r3, 4(%r1) # hidden pointer
#endif
stfd %f0, 8(%r1) # FPSCR
stw %r0, 16(%r1) # LR as PC
stw %r8, 20(%r1) # CR
# Save registers R14 to R31.
# Don't change R2, the thread-local storage pointer.
# Don't change R13, the small data pointer.
stw %r14, 24(%r1)
stw %r15, 28(%r1)
stw %r16, 32(%r1)
stw %r17, 36(%r1)
stw %r18, 40(%r1)
stw %r19, 44(%r1)
stw %r20, 48(%r1)
stw %r21, 52(%r1)
stw %r22, 56(%r1)
stw %r23, 60(%r1)
stw %r24, 64(%r1)
stw %r25, 68(%r1)
stw %r26, 72(%r1)
stw %r27, 76(%r1)
stw %r28, 80(%r1)
stw %r29, 84(%r1)
stw %r30, 88(%r1)
stw %r31, 92(%r1)
# Save registers F14 to F31 in slots with 8-byte alignment.
# 4-byte alignment may stall the pipeline of some processors.
# Less than 4 may cause alignment traps.
stfd %f14, 96(%r1)
stfd %f15, 104(%r1)
stfd %f16, 112(%r1)
stfd %f17, 120(%r1)
stfd %f18, 128(%r1)
stfd %f19, 136(%r1)
stfd %f20, 144(%r1)
stfd %f21, 152(%r1)
stfd %f22, 160(%r1)
stfd %f23, 168(%r1)
stfd %f24, 176(%r1)
stfd %f25, 184(%r1)
stfd %f26, 192(%r1)
stfd %f27, 200(%r1)
stfd %f28, 208(%r1)
stfd %f29, 216(%r1)
stfd %f30, 224(%r1)
stfd %f31, 232(%r1)
# store RSP (pointing to context-data) in R7/R6
# restore RSP (pointing to context-data) from R4/R3
#ifdef __linux__
mr %r7, %r1
mr %r1, %r4
lwz %r3, 4(%r1) # hidden pointer
#else
mr %r6, %r1
mr %r1, %r3
#endif
lfd %f0, 8(%r1) # FPSCR
lwz %r0, 16(%r1) # PC
lwz %r8, 20(%r1) # CR
mtfsf 0xff, %f0 # restore FPSCR
mtctr %r0 # load CTR with PC
mtcr %r8 # restore CR
# restore R14 to R31
lwz %r14, 24(%r1)
lwz %r15, 28(%r1)
lwz %r16, 32(%r1)
lwz %r17, 36(%r1)
lwz %r18, 40(%r1)
lwz %r19, 44(%r1)
lwz %r20, 48(%r1)
lwz %r21, 52(%r1)
lwz %r22, 56(%r1)
lwz %r23, 60(%r1)
lwz %r24, 64(%r1)
lwz %r25, 68(%r1)
lwz %r26, 72(%r1)
lwz %r27, 76(%r1)
lwz %r28, 80(%r1)
lwz %r29, 84(%r1)
lwz %r30, 88(%r1)
lwz %r31, 92(%r1)
# restore F14 to F31
lfd %f14, 96(%r1)
lfd %f15, 104(%r1)
lfd %f16, 112(%r1)
lfd %f17, 120(%r1)
lfd %f18, 128(%r1)
lfd %f19, 136(%r1)
lfd %f20, 144(%r1)
lfd %f21, 152(%r1)
lfd %f22, 160(%r1)
lfd %f23, 168(%r1)
lfd %f24, 176(%r1)
lfd %f25, 184(%r1)
lfd %f26, 192(%r1)
lfd %f27, 200(%r1)
lfd %f28, 208(%r1)
lfd %f29, 216(%r1)
lfd %f30, 224(%r1)
lfd %f31, 232(%r1)
# restore LR from caller's frame
lwz %r0, 244(%r1)
mtlr %r0
# adjust stack
addi %r1, %r1, 240
# return transfer_t
#ifdef __linux__
stw %r7, 0(%r3)
stw %r5, 4(%r3)
#else
mr %r3, %r6
# %r4, %r4
#endif
# jump to context
bctr
.size jump_fcontext, .-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _jump_fcontext
.align 2
_jump_fcontext:
; reserve space on stack
subi r1, r1, 244
stfd f14, 0(r1) # save F14
stfd f15, 8(r1) # save F15
stfd f16, 16(r1) # save F16
stfd f17, 24(r1) # save F17
stfd f18, 32(r1) # save F18
stfd f19, 40(r1) # save F19
stfd f20, 48(r1) # save F20
stfd f21, 56(r1) # save F21
stfd f22, 64(r1) # save F22
stfd f23, 72(r1) # save F23
stfd f24, 80(r1) # save F24
stfd f25, 88(r1) # save F25
stfd f26, 96(r1) # save F26
stfd f27, 104(r1) # save F27
stfd f28, 112(r1) # save F28
stfd f29, 120(r1) # save F29
stfd f30, 128(r1) # save F30
stfd f31, 136(r1) # save F31
mffs f0 # load FPSCR
stfd f0, 144(r1) # save FPSCR
stw r13, 152(r1) # save R13
stw r14, 156(r1) # save R14
stw r15, 160(r1) # save R15
stw r16, 164(r1) # save R16
stw r17, 168(r1) # save R17
stw r18, 172(r1) # save R18
stw r19, 176(r1) # save R19
stw r20, 180(r1) # save R20
stw r21, 184(r1) # save R21
stw r22, 188(r1) # save R22
stw r23, 192(r1) # save R23
stw r24, 196(r1) # save R24
stw r25, 200(r1) # save R25
stw r26, 204(r1) # save R26
stw r27, 208(r1) # save R27
stw r28, 212(r1) # save R28
stw r29, 216(r1) # save R29
stw r30, 220(r1) # save R30
stw r31, 224(r1) # save R31
stw r3, 228(r1) # save hidden
# save CR
mfcr r0
stw r0, 232(r1)
# save LR
mflr r0
stw r0, 236(r1)
# save LR as PC
stw r0, 240(r1)
# store RSP (pointing to context-data) in R6
mr r6, r1
# restore RSP (pointing to context-data) from R4
mr r1, r4
lfd f14, 0(r1) # restore F14
lfd f15, 8(r1) # restore F15
lfd f16, 16(r1) # restore F16
lfd f17, 24(r1) # restore F17
lfd f18, 32(r1) # restore F18
lfd f19, 40(r1) # restore F19
lfd f20, 48(r1) # restore F20
lfd f21, 56(r1) # restore F21
lfd f22, 64(r1) # restore F22
lfd f23, 72(r1) # restore F23
lfd f24, 80(r1) # restore F24
lfd f25, 88(r1) # restore F25
lfd f26, 96(r1) # restore F26
lfd f27, 104(r1) # restore F27
lfd f28, 112(r1) # restore F28
lfd f29, 120(r1) # restore F29
lfd f30, 128(r1) # restore F30
lfd f31, 136(r1) # restore F31
lfd f0, 144(r1) # load FPSCR
mtfsf 0xff, f0 # restore FPSCR
lwz r13, 152(r1) # restore R13
lwz r14, 156(r1) # restore R14
lwz r15, 160(r1) # restore R15
lwz r16, 164(r1) # restore R16
lwz r17, 168(r1) # restore R17
lwz r18, 172(r1) # restore R18
lwz r19, 176(r1) # restore R19
lwz r20, 180(r1) # restore R20
lwz r21, 184(r1) # restore R21
lwz r22, 188(r1) # restore R22
lwz r23, 192(r1) # restore R23
lwz r24, 196(r1) # restore R24
lwz r25, 200(r1) # restore R25
lwz r26, 204(r1) # restore R26
lwz r27, 208(r1) # restore R27
lwz r28, 212(r1) # restore R28
lwz r29, 216(r1) # restore R29
lwz r30, 220(r1) # restore R30
lwz r31, 224(r1) # restore R31
lwz r3, 228(r1) # restore hidden
# restore CR
lwz r0, 232(r1)
mtcr r0
# restore LR
lwz r0, 236(r1)
mtlr r0
# load PC
lwz r0, 240(r1)
# restore CTR
mtctr r0
# adjust stack
addi r1, r1, 244
# return transfer_t
stw r6, 0(r3)
stw r5, 4(r3)
# jump to context
bctr
lib/context_switcher/asm/fcontext/jump_ppc32_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.globl .jump_fcontext
.globl jump_fcontext[DS]
.align 2
.csect jump_fcontext[DS]
jump_fcontext:
.long .jump_fcontext
.jump_fcontext:
# reserve space on stack
subi r1, r1, 244
stfd f14, 0(r1) # save F14
stfd f15, 8(r1) # save F15
stfd f16, 16(r1) # save F16
stfd f17, 24(r1) # save F17
stfd f18, 32(r1) # save F18
stfd f19, 40(r1) # save F19
stfd f20, 48(r1) # save F20
stfd f21, 56(r1) # save F21
stfd f22, 64(r1) # save F22
stfd f23, 72(r1) # save F23
stfd f24, 80(r1) # save F24
stfd f25, 88(r1) # save F25
stfd f26, 96(r1) # save F26
stfd f27, 104(r1) # save F27
stfd f28, 112(r1) # save F28
stfd f29, 120(r1) # save F29
stfd f30, 128(r1) # save F30
stfd f31, 136(r1) # save F31
mffs f0 # load FPSCR
stfd f0, 144(r1) # save FPSCR
stw r13, 152(r1) # save R13
stw r14, 156(r1) # save R14
stw r15, 160(r1) # save R15
stw r16, 164(r1) # save R16
stw r17, 168(r1) # save R17
stw r18, 172(r1) # save R18
stw r19, 176(r1) # save R19
stw r20, 180(r1) # save R20
stw r21, 184(r1) # save R21
stw r22, 188(r1) # save R22
stw r23, 192(r1) # save R23
stw r24, 196(r1) # save R24
stw r25, 200(r1) # save R25
stw r26, 204(r1) # save R26
stw r27, 208(r1) # save R27
stw r28, 212(r1) # save R28
stw r29, 216(r1) # save R29
stw r30, 220(r1) # save R30
stw r31, 224(r1) # save R31
stw r3, 228(r1) # save hidden
# save CR
mfcr r0
stw r0, 232(r1)
# save LR
mflr r0
stw r0, 236(r1)
# save LR as PC
stw r0, 240(r1)
# store RSP (pointing to context-data) in R6
mr r6, r1
# restore RSP (pointing to context-data) from R4
mr r1, r4
lfd f14, 0(r1) # restore F14
lfd f15, 8(r1) # restore F15
lfd f16, 16(r1) # restore F16
lfd f17, 24(r1) # restore F17
lfd f18, 32(r1) # restore F18
lfd f19, 40(r1) # restore F19
lfd f20, 48(r1) # restore F20
lfd f21, 56(r1) # restore F21
lfd f22, 64(r1) # restore F22
lfd f23, 72(r1) # restore F23
lfd f24, 80(r1) # restore F24
lfd f25, 88(r1) # restore F25
lfd f26, 96(r1) # restore F26
lfd f27, 104(r1) # restore F27
lfd f28, 112(r1) # restore F28
lfd f29, 120(r1) # restore F29
lfd f30, 128(r1) # restore F30
lfd f31, 136(r1) # restore F31
lfd f0, 144(r1) # load FPSCR
mtfsf 0xff, f0 # restore FPSCR
lwz r13, 152(r1) # restore R13
lwz r14, 156(r1) # restore R14
lwz r15, 160(r1) # restore R15
lwz r16, 164(r1) # restore R16
lwz r17, 168(r1) # restore R17
lwz r18, 172(r1) # restore R18
lwz r19, 176(r1) # restore R19
lwz r20, 180(r1) # restore R20
lwz r21, 184(r1) # restore R21
lwz r22, 188(r1) # restore R22
lwz r23, 192(r1) # restore R23
lwz r24, 196(r1) # restore R24
lwz r25, 200(r1) # restore R25
lwz r26, 204(r1) # restore R26
lwz r27, 208(r1) # restore R27
lwz r28, 212(r1) # restore R28
lwz r29, 216(r1) # restore R29
lwz r30, 220(r1) # restore R30
lwz r31, 224(r1) # restore R31
lwz r3, 228(r1) # restore hidden
# restore CR
lwz r0, 232(r1)
mtcr r0
# restore LR
lwz r0, 236(r1)
mtlr r0
# load PC
lwz r0, 240(r1)
# restore CTR
mtctr r0
# adjust stack
addi r1, r1, 244
# return transfer_t
stw r6, 0(r3)
stw r5, 4(r3)
# jump to context
bctr
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "jump_ppc64_sysv_elf_gas.S"
.globl jump_fcontext
#if _CALL_ELF == 2
.text
.align 2
jump_fcontext:
addis %r2, %r12, .TOC.-jump_fcontext@ha
addi %r2, %r2, .TOC.-jump_fcontext@l
.localentry jump_fcontext, . - jump_fcontext
#else
.section ".opd","aw"
.align 3
jump_fcontext:
# ifdef _CALL_LINUX
.quad .L.jump_fcontext,.TOC.@tocbase,0
.type jump_fcontext,@function
.text
.align 2
.L.jump_fcontext:
# else
.hidden .jump_fcontext
.globl .jump_fcontext
.quad .jump_fcontext,.TOC.@tocbase,0
.size jump_fcontext,24
.type .jump_fcontext,@function
.text
.align 2
.jump_fcontext:
# endif
#endif
# reserve space on stack
subi %r1, %r1, 184
#if _CALL_ELF != 2
std %r2, 0(%r1) # save TOC
#endif
std %r14, 8(%r1) # save R14
std %r15, 16(%r1) # save R15
std %r16, 24(%r1) # save R16
std %r17, 32(%r1) # save R17
std %r18, 40(%r1) # save R18
std %r19, 48(%r1) # save R19
std %r20, 56(%r1) # save R20
std %r21, 64(%r1) # save R21
std %r22, 72(%r1) # save R22
std %r23, 80(%r1) # save R23
std %r24, 88(%r1) # save R24
std %r25, 96(%r1) # save R25
std %r26, 104(%r1) # save R26
std %r27, 112(%r1) # save R27
std %r28, 120(%r1) # save R28
std %r29, 128(%r1) # save R29
std %r30, 136(%r1) # save R30
std %r31, 144(%r1) # save R31
#if _CALL_ELF != 2
std %r3, 152(%r1) # save hidden
#endif
# save CR
mfcr %r0
std %r0, 160(%r1)
# save LR
mflr %r0
std %r0, 168(%r1)
# save LR as PC
std %r0, 176(%r1)
# store RSP (pointing to context-data) in R6
mr %r6, %r1
#if _CALL_ELF == 2
# restore RSP (pointing to context-data) from R3
mr %r1, %r3
#else
# restore RSP (pointing to context-data) from R4
mr %r1, %r4
ld %r2, 0(%r1) # restore TOC
#endif
ld %r14, 8(%r1) # restore R14
ld %r15, 16(%r1) # restore R15
ld %r16, 24(%r1) # restore R16
ld %r17, 32(%r1) # restore R17
ld %r18, 40(%r1) # restore R18
ld %r19, 48(%r1) # restore R19
ld %r20, 56(%r1) # restore R20
ld %r21, 64(%r1) # restore R21
ld %r22, 72(%r1) # restore R22
ld %r23, 80(%r1) # restore R23
ld %r24, 88(%r1) # restore R24
ld %r25, 96(%r1) # restore R25
ld %r26, 104(%r1) # restore R26
ld %r27, 112(%r1) # restore R27
ld %r28, 120(%r1) # restore R28
ld %r29, 128(%r1) # restore R29
ld %r30, 136(%r1) # restore R30
ld %r31, 144(%r1) # restore R31
#if _CALL_ELF != 2
ld %r3, 152(%r1) # restore hidden
#endif
# restore CR
ld %r0, 160(%r1)
mtcr %r0
# restore LR
ld %r0, 168(%r1)
mtlr %r0
# load PC
ld %r12, 176(%r1)
# restore CTR
mtctr %r12
# adjust stack
addi %r1, %r1, 184
#if _CALL_ELF == 2
# copy transfer_t into transfer_fn arg registers
mr %r3, %r6
# arg pointer already in %r4
# jump to context
bctr
.size jump_fcontext, .-jump_fcontext
#else
# zero in r3 indicates first jump to context-function
cmpdi %r3, 0
beq use_entry_arg
# return transfer_t
std %r6, 0(%r3)
std %r5, 8(%r3)
# jump to context
bctr
use_entry_arg:
# copy transfer_t into transfer_fn arg registers
mr %r3, %r6
mr %r4, %r5
# jump to context
bctr
# ifdef _CALL_LINUX
.size .jump_fcontext, .-.L.jump_fcontext
# else
.size .jump_fcontext, .-.jump_fcontext
# endif
#endif
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.align 2
.globl _jump_fcontext
_jump_fcontext:
; reserve space on stack
subi r1, r1, 184
std r14, 8(r1) ; save R14
std r15, 16(r1) ; save R15
std r16, 24(r1) ; save R16
std r17, 32(r1) ; save R17
std r18, 40(r1) ; save R18
std r19, 48(r1) ; save R19
std r20, 56(r1) ; save R20
std r21, 64(r1) ; save R21
std r22, 72(r1) ; save R22
std r23, 80(r1) ; save R23
std r24, 88(r1) ; save R24
std r25, 96(r1) ; save R25
std r26, 104(r1) ; save R26
std r27, 112(r1) ; save R27
std r28, 120(r1) ; save R28
std r29, 128(r1) ; save R29
std r30, 136(r1) ; save R30
std r31, 144(r1) ; save R31
std r3, 152(r1) ; save hidden
; save CR
mfcr r0
std r0, 160(r1)
; save LR
mflr r0
std r0, 168(r1)
; save LR as PC
std r0, 176(r1)
; store RSP (pointing to context-data) in R6
mr r6, r1
; restore RSP (pointing to context-data) from R4
mr r1, r4
ld r14, 8(r1) ; restore R14
ld r15, 16(r1) ; restore R15
ld r16, 24(r1) ; restore R16
ld r17, 32(r1) ; restore R17
ld r18, 40(r1) ; restore R18
ld r19, 48(r1) ; restore R19
ld r20, 56(r1) ; restore R20
ld r21, 64(r1) ; restore R21
ld r22, 72(r1) ; restore R22
ld r23, 80(r1) ; restore R23
ld r24, 88(r1) ; restore R24
ld r25, 96(r1) ; restore R25
ld r26, 104(r1) ; restore R26
ld r27, 112(r1) ; restore R27
ld r28, 120(r1) ; restore R28
ld r29, 128(r1) ; restore R29
ld r30, 136(r1) ; restore R30
ld r31, 144(r1) ; restore R31
ld r3, 152(r1) ; restore hidden
; restore CR
ld r0, 160(r1)
mtcr r0
; restore LR
ld r0, 168(r1)
mtlr r0
; load PC
ld r12, 176(r1)
# restore CTR
mtctr r12
# adjust stack
addi r1, r1, 184
# zero in r3 indicates first jump to context-function
cmpdi r3, 0
beq use_entry_arg
# return transfer_t
std r6, 0(r3)
std r5, 8(r3)
# jump to context
bctr
use_entry_arg:
# copy transfer_t into transfer_fn arg registers
mr r3, r6
mr r4, r5
# jump to context
bctr
lib/context_switcher/asm/fcontext/jump_ppc64_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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)
*/
.align 2
.globl .jump_fcontext
.jump_fcontext:
# reserve space on stack
subi 1, 1, 184
std 13, 0(1) # save R13
std 14, 8(1) # save R14
std 15, 16(1) # save R15
std 16, 24(1) # save R16
std 17, 32(1) # save R17
std 18, 40(1) # save R18
std 19, 48(1) # save R19
std 20, 56(1) # save R20
std 21, 64(1) # save R21
std 22, 72(1) # save R22
std 23, 80(1) # save R23
std 24, 88(1) # save R24
std 25, 96(1) # save R25
std 26, 104(1) # save R26
std 27, 112(1) # save R27
std 29, 120(1) # save R28
std 29, 128(1) # save R29
std 30, 136(1) # save R30
std 31, 144(1) # save R31
std 3, 152(1) # save hidden
# save CR
mfcr 0
std 0, 160(1)
# save LR
mflr 0
std 0, 168(1)
# save LR as PC
std 0, 176(1)
# store RSP (pointing to context-data) in R6
mr 6, 1
# restore RSP (pointing to context-data) from R4
mr 1, 4
ld 13, 0(1) # restore R13
ld 14, 8(1) # restore R14
ld 15, 16(1) # restore R15
ld 16, 24(1) # restore R16
ld 17, 32(1) # restore R17
ld 18, 40(1) # restore R18
ld 19, 48(1) # restore R19
ld 20, 56(1) # restore R20
ld 21, 64(1) # restore R21
ld 22, 72(1) # restore R22
ld 23, 80(1) # restore R23
ld 24, 88(1) # restore R24
ld 25, 96(1) # restore R25
ld 26, 104(1) # restore R26
ld 27, 112(1) # restore R27
ld 28, 120(1) # restore R28
ld 29, 128(1) # restore R29
ld 30, 136(1) # restore R30
ld 31, 144(1) # restore R31
ld 3, 152(1) # restore hidden
# restore CR
ld 0, 160(1)
mtcr 0
# restore LR
ld 0, 168(1)
mtlr 0
# load PC
ld 0, 176(1)
# restore CTR
mtctr 0
# adjust stack
addi 1, 1, 184
# return transfer_t
std 6, 0(3)
std 5, 8(3)
# jump to context
bctr
lib/context_switcher/asm/fcontext/jump_riscv64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
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| *
* ------------------------------------------------- *
* | fs0 | fs1 | fs2 | fs3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | fs4 | fs5 | fs6 | fs7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | fs8 | fs9 | fs10 | fs11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | s0 | s1 | s2 | s3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | s4 | s5 | s6 | s7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
* ------------------------------------------------- *
* | s8 | s9 | s10 | s11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | | | | | *
* ------------------------------------------------- *
* | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
* ------------------------------------------------- *
* | ra | pc | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "jump_riscv64_sysv_elf_gas.S"
.text
.align 1
.global jump_fcontext
.type jump_fcontext, %function
jump_fcontext:
# prepare stack for GP + FPU
addi sp, sp, -0xd0
# save fs0 - fs11
fsd fs0, 0x00(sp)
fsd fs1, 0x08(sp)
fsd fs2, 0x10(sp)
fsd fs3, 0x18(sp)
fsd fs4, 0x20(sp)
fsd fs5, 0x28(sp)
fsd fs6, 0x30(sp)
fsd fs7, 0x38(sp)
fsd fs8, 0x40(sp)
fsd fs9, 0x48(sp)
fsd fs10, 0x50(sp)
fsd fs11, 0x58(sp)
# save s0-s11, ra
sd s0, 0x60(sp)
sd s1, 0x68(sp)
sd s2, 0x70(sp)
sd s3, 0x78(sp)
sd s4, 0x80(sp)
sd s5, 0x88(sp)
sd s6, 0x90(sp)
sd s7, 0x98(sp)
sd s8, 0xa0(sp)
sd s9, 0xa8(sp)
sd s10, 0xb0(sp)
sd s11, 0xb8(sp)
sd ra, 0xc0(sp)
# save RA as PC
sd ra, 0xc8(sp)
# store SP (pointing to context-data) in A2
mv a2, sp
# restore SP (pointing to context-data) from A0
mv sp, a0
# load fs0 - fs11
fld fs0, 0x00(sp)
fld fs1, 0x08(sp)
fld fs2, 0x10(sp)
fld fs3, 0x18(sp)
fld fs4, 0x20(sp)
fld fs5, 0x28(sp)
fld fs6, 0x30(sp)
fld fs7, 0x38(sp)
fld fs8, 0x40(sp)
fld fs9, 0x48(sp)
fld fs10, 0x50(sp)
fld fs11, 0x58(sp)
# load s0-s11,ra
ld s0, 0x60(sp)
ld s1, 0x68(sp)
ld s2, 0x70(sp)
ld s3, 0x78(sp)
ld s4, 0x80(sp)
ld s5, 0x88(sp)
ld s6, 0x90(sp)
ld s7, 0x98(sp)
ld s8, 0xa0(sp)
ld s9, 0xa8(sp)
ld s10, 0xb0(sp)
ld s11, 0xb8(sp)
ld ra, 0xc0(sp)
# return transfer_t from jump
# pass transfer_t as first arg in context function
# a0 == FCTX, a1 == DATA
mv a0, a2
# load pc
ld a2, 0xc8(sp)
# restore stack from GP + FPU
addi sp, sp, 0xd0
jr a2
.size jump_fcontext,.-jump_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_s390x_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | R6 | R7 | R8 | R9 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | R10 | R11 | R12 | R13 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | R14/LR | R15 | F1 | F3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | | *
* ------------------------------------------------- *
* | 96 | 104 | 112 | 120 | *
* ------------------------------------------------- *
* | F5 | F7 | PC | | *
* ------------------------------------------------- *
* *****************************************************/
.file "jump_s390x_sysv_elf_gas.S"
.text
.align 4 # According to the sample code in the ELF ABI docs
.global jump_fcontext
.type jump_fcontext, @function
#define GR_OFFSET 0
#define LR_OFFSET 64
#define SP_OFFSET 72
#define FP_OFFSET 80
#define PC_OFFSET 112
#define L_CTX 120
#define L_STACKFRAME 120
jump_fcontext:
# Reserved the space for stack to store the data of current context
# before we jump to the new context.
aghi %r15,-L_STACKFRAME
# save the registers to the stack
stmg %r6, %r15, GR_OFFSET(%r15)
# save the floating point registers
std %f0,FP_OFFSET(%r15)
std %f3,FP_OFFSET+8(%r15)
std %f5,FP_OFFSET+16(%r15)
std %f7,FP_OFFSET+24(%r15)
# Save LR as PC
stg %r14,PC_OFFSET(%r15)
# Store the SP pointing to the old context-data into R0
lgr %r0,%r15
# Get the SP pointing to the new context-data
# Note: Since the return type of the jump_fcontext is struct whose
# size is more than 8. The compiler automatically passes the
# address of the transfer_t where the data needs to store into R2.
# Hence the first param passed to the jump_fcontext which represent
# the fctx we want to switch to is present in R3
# R2 --> Address of the return transfer_t struct
# R3 --> Context we want to switch to
# R4 --> Data
lgr %r15,%r3
# Load the registers with the data present in context-data of the
# context we are going to switch to
lmg %r6, %r14, GR_OFFSET(%r15)
# Restore Floating point registers
ld %f1,FP_OFFSET(%r15)
ld %f3,FP_OFFSET+8(%r15)
ld %f5,FP_OFFSET+16(%r15)
ld %f7,FP_OFFSET+24(%r15)
# Load PC
lg %r1,PC_OFFSET(%r15)
# Adjust the stack
aghi %r15,120
# R2 --> Address where the return transfer_t is stored
# R0 --> FCTX
# R4 --> DATA
# Store the elements to return transfer_t
stg %r15, 0(%r2)
stg %r4, 8(%r2)
# Note: The address in R2 points to the place where the return
# transfer_t is stored. Since context_function take transfer_t
# as first parameter. And R2 is the register which holds the
# first parameter value.
#jump to context
br %r1
.size jump_fcontext,.-jump_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_x86_64_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x20
|
0x24
|
0x28
|
0x2c
|
0x30
|
0x34
|
0x38
|
0x3c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe40
|
0x44
|
0x48
|
0x4c
|
0x50
|
0x54
|
0x58
|
0x5c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x60
|
0x64
|
0x68
|
0x6c
|
0x70
|
0x74
|
0x78
|
0x7c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
32
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x80
|
0x84
|
0x88
|
0x8c
|
0x90
|
0x94
|
0x98
|
0x9c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xa0
|
0xa4
|
0xa8
|
0xac
|
0xb0
|
0xb4
|
0xb8
|
0xbc
|
*
*
----------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
<
alignment
>
|
fbr_strg
|
fc_dealloc
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xc0
|
0xc4
|
0xc8
|
0xcc
|
0xd0
|
0xd4
|
0xd8
|
0xdc
|
*
*
----------------------------------------------------------------------------------
*
*
|
limit
|
base
|
R12
|
R13
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe0
|
0xe4
|
0xe8
|
0xec
|
0xf0
|
0xf4
|
0xf8
|
0xfc
|
*
*
----------------------------------------------------------------------------------
*
*
|
R14
|
R15
|
RDI
|
RSI
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x100
|
0x104
|
0x108
|
0x10c
|
0x110
|
0x114
|
0x118
|
0x11c
|
*
*
----------------------------------------------------------------------------------
*
*
|
RBX
|
RBP
|
hidden
|
RIP
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x120
|
0x124
|
0x128
|
0x12c
|
0x130
|
0x134
|
0x138
|
0x13c
|
*
*
----------------------------------------------------------------------------------
*
*
|
parameter
area
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x140
|
0x144
|
0x148
|
0x14c
|
0x150
|
0x154
|
0x158
|
0x15c
|
*
*
----------------------------------------------------------------------------------
*
*
|
FCTX
|
DATA
|
|
*
*
----------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"jump_x86_64_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
.
globl
jump_fcontext
.
def
jump_fcontext
; .scl 2; .type 32; .endef
.
seh_proc
jump_fcontext
jump_fcontext
:
.
seh_endprologue
leaq
-
0x118
(
%
rsp
),
%
rsp
/*
prepare
stack
*/
#
if
!
defined
(
BOOST_USE_TSX
)
/*
save
XMM
storage
*/
movaps
%
xmm6
,
0x0
(
%
rsp
)
movaps
%
xmm7
,
0x10
(
%
rsp
)
movaps
%
xmm8
,
0x20
(
%
rsp
)
movaps
%
xmm9
,
0x30
(
%
rsp
)
movaps
%
xmm10
,
0x40
(
%
rsp
)
movaps
%
xmm11
,
0x50
(
%
rsp
)
movaps
%
xmm12
,
0x60
(
%
rsp
)
movaps
%
xmm13
,
0x70
(
%
rsp
)
movaps
%
xmm14
,
0x80
(
%
rsp
)
movaps
%
xmm15
,
0x90
(
%
rsp
)
stmxcsr
0xa0
(
%
rsp
)
/*
save
MMX
control
-
and
status
-
word
*/
fnstcw
0xa4
(
%
rsp
)
/*
save
x87
control
-
word
*/
#
endif
/*
load
NT_TIB
*/
movq
%
gs
:
(
0x30
),
%
r10
/*
save
fiber
local
storage
*/
movq
0x20
(
%
r10
),
%
rax
movq
%
rax
,
0xb0
(
%
rsp
)
/*
save
current
deallocation
stack
*/
movq
0x1478
(
%
r10
),
%
rax
movq
%
rax
,
0xb8
(
%
rsp
)
/*
save
current
stack
limit
*/
movq
0x10
(
%
r10
),
%
rax
movq
%
rax
,
0xc0
(
%
rsp
)
/*
save
current
stack
base
*/
movq
0x08
(
%
r10
),
%
rax
movq
%
rax
,
0xc8
(
%
rsp
)
movq
%
r12
,
0xd0
(
%
rsp
)
/*
save
R12
*/
movq
%
r13
,
0xd8
(
%
rsp
)
/*
save
R13
*/
movq
%
r14
,
0xe0
(
%
rsp
)
/*
save
R14
*/
movq
%
r15
,
0xe8
(
%
rsp
)
/*
save
R15
*/
movq
%
rdi
,
0xf0
(
%
rsp
)
/*
save
RDI
*/
movq
%
rsi
,
0xf8
(
%
rsp
)
/*
save
RSI
*/
movq
%
rbx
,
0x100
(
%
rsp
)
/*
save
RBX
*/
movq
%
rbp
,
0x108
(
%
rsp
)
/*
save
RBP
*/
movq
%
rcx
,
0x110
(
%
rsp
)
/*
save
hidden
address
of
transport_t
*/
/*
preserve
RSP
(
pointing
to
context
-
data
)
in
R9
*/
movq
%
rsp
,
%
r9
/*
restore
RSP
(
pointing
to
context
-
data
)
from
RDX
*/
movq
%
rdx
,
%
rsp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
restore
XMM
storage
*/
movaps
0x0
(
%
rsp
),
%
xmm6
movaps
0x10
(
%
rsp
),
%
xmm7
movaps
0x20
(
%
rsp
),
%
xmm8
movaps
0x30
(
%
rsp
),
%
xmm9
movaps
0x40
(
%
rsp
),
%
xmm10
movaps
0x50
(
%
rsp
),
%
xmm11
movaps
0x60
(
%
rsp
),
%
xmm12
movaps
0x70
(
%
rsp
),
%
xmm13
movaps
0x80
(
%
rsp
),
%
xmm14
movaps
0x90
(
%
rsp
),
%
xmm15
ldmxcsr
0xa0
(
%
rsp
)
/*
restore
MMX
control
-
and
status
-
word
*/
fldcw
0xa4
(
%
rsp
)
/*
restore
x87
control
-
word
*/
#
endif
/*
load
NT_TIB
*/
movq
%
gs
:
(
0x30
),
%
r10
/*
restore
fiber
local
storage
*/
movq
0xb0
(
%
rsp
),
%
rax
movq
%
rax
,
0x20
(
%
r10
)
/*
restore
current
deallocation
stack
*/
movq
0xb8
(
%
rsp
),
%
rax
movq
%
rax
,
0x1478
(
%
r10
)
/*
restore
current
stack
limit
*/
movq
0xc0
(
%
rsp
),
%
rax
movq
%
rax
,
0x10
(
%
r10
)
/*
restore
current
stack
base
*/
movq
0xc8
(
%
rsp
),
%
rax
movq
%
rax
,
0x08
(
%
r10
)
movq
0xd0
(
%
rsp
),
%
r12
/*
restore
R12
*/
movq
0xd8
(
%
rsp
),
%
r13
/*
restore
R13
*/
movq
0xe0
(
%
rsp
),
%
r14
/*
restore
R14
*/
movq
0xe8
(
%
rsp
),
%
r15
/*
restore
R15
*/
movq
0xf0
(
%
rsp
),
%
rdi
/*
restore
RDI
*/
movq
0xf8
(
%
rsp
),
%
rsi
/*
restore
RSI
*/
movq
0x100
(
%
rsp
),
%
rbx
/*
restore
RBX
*/
movq
0x108
(
%
rsp
),
%
rbp
/*
restore
RBP
*/
movq
0x110
(
%
rsp
),
%
rax
/*
restore
hidden
address
of
transport_t
*/
leaq
0x118
(
%
rsp
),
%
rsp
/*
prepare
stack
*/
/*
restore
return
-
address
*/
popq
%
r10
/*
transport_t
returned
in
RAX
*/
/*
return
parent
fcontext_t
*/
movq
%
r9
,
0x0
(
%
rax
)
/*
return
data
*/
movq
%
r8
,
0x8
(
%
rax
)
/*
transport_t
as
1
.
arg
of
context
-
function
*/
movq
%
rax
,
%
rcx
/*
indirect
jump
to
context
*/
jmp
*
%
r10
.
seh_endproc
.
section
.
drectve
.
ascii
" -export:
\"
jump_fcontext
\"
"
lib/context_switcher/asm/fcontext/jump_x86_64_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ----------------------------------------------------------------------------------
; | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
; ----------------------------------------------------------------------------------
; | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
; ----------------------------------------------------------------------------------
; | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
; ----------------------------------------------------------------------------------
; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
; ----------------------------------------------------------------------------------
; | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc |
; ----------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
; ----------------------------------------------------------------------------------
; | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc |
; ----------------------------------------------------------------------------------
; | limit | base | R12 | R13 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
; ----------------------------------------------------------------------------------
; | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc |
; ----------------------------------------------------------------------------------
; | R14 | R15 | RDI | RSI |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
; ----------------------------------------------------------------------------------
; | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c |
; ----------------------------------------------------------------------------------
; | RBX | RBP | hidden | RIP |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
; ----------------------------------------------------------------------------------
; | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c |
; ----------------------------------------------------------------------------------
; | parameter area |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
; ----------------------------------------------------------------------------------
; | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c |
; ----------------------------------------------------------------------------------
; | FCTX | DATA | |
; ----------------------------------------------------------------------------------
.
code
jump_fcontext
PROC
BOOST_CONTEXT_EXPORT
FRAME
.
endprolog
; prepare stack
lea
rsp
,
[
rsp
-
0118
h
]
IFNDEF
BOOST_USE_TSX
; save XMM storage
movaps
[rsp],
xmm6
movaps
[
rsp
+
010
h
]
,
xmm7
movaps
[
rsp
+
020
h
]
,
xmm8
movaps
[
rsp
+
030
h
]
,
xmm9
movaps
[
rsp
+
040
h
]
,
xmm10
movaps
[
rsp
+
050
h
]
,
xmm11
movaps
[
rsp
+
060
h
]
,
xmm12
movaps
[
rsp
+
070
h
]
,
xmm13
movaps
[
rsp
+
080
h
]
,
xmm14
movaps
[
rsp
+
090
h
]
,
xmm15
; save MMX control- and status-word
stmxcsr
[
rsp
+
0
a0h
]
; save x87 control-word
fnstcw
[
rsp
+
0
a4h
]
ENDIF
; load NT_TIB
mov
r10
,
gs
:
[030h]
; save fiber local storage
mov
rax
,
[
r10
+
020
h
]
mov
[
rsp
+
0
b0h
]
,
rax
; save current deallocation stack
mov
rax
,
[
r10
+
01478
h
]
mov
[
rsp
+
0
b8h
]
,
rax
; save current stack limit
mov
rax
,
[
r10
+
010
h
]
mov
[
rsp
+
0
c0h
]
,
rax
; save current stack base
mov
rax
,
[
r10
+
08
h
]
mov
[
rsp
+
0
c8h
]
,
rax
mov
[
rsp
+
0
d0h
]
,
r12
; save R12
mov
[
rsp
+
0
d8h
]
,
r13
; save R13
mov
[
rsp
+
0
e0h
]
,
r14
; save R14
mov
[
rsp
+
0
e8h
]
,
r15
; save R15
mov
[
rsp
+
0
f0h
]
,
rdi
; save RDI
mov
[
rsp
+
0
f8h
]
,
rsi
; save RSI
mov
[
rsp
+
0100
h
]
,
rbx
; save RBX
mov
[
rsp
+
0108
h
]
,
rbp
; save RBP
mov
[
rsp
+
0110
h
]
,
rcx
; save hidden address of transport_t
; preserve RSP (pointing to context-data) in R9
mov
r9
,
rsp
; restore RSP (pointing to context-data) from RDX
mov
rsp
,
rdx
IFNDEF
BOOST_USE_TSX
; restore XMM storage
movaps
xmm6
,
[rsp]
movaps
xmm7
,
[
rsp
+
010
h
]
movaps
xmm8
,
[
rsp
+
020
h
]
movaps
xmm9
,
[
rsp
+
030
h
]
movaps
xmm10
,
[
rsp
+
040
h
]
movaps
xmm11
,
[
rsp
+
050
h
]
movaps
xmm12
,
[
rsp
+
060
h
]
movaps
xmm13
,
[
rsp
+
070
h
]
movaps
xmm14
,
[
rsp
+
080
h
]
movaps
xmm15
,
[
rsp
+
090
h
]
; restore MMX control- and status-word
ldmxcsr
[
rsp
+
0
a0h
]
; save x87 control-word
fldcw
[
rsp
+
0
a4h
]
ENDIF
; load NT_TIB
mov
r10
,
gs
:
[030h]
; restore fiber local storage
mov
rax
,
[
rsp
+
0
b0h
]
mov
[
r10
+
020
h
]
,
rax
; restore current deallocation stack
mov
rax
,
[
rsp
+
0
b8h
]
mov
[
r10
+
01478
h
]
,
rax
; restore current stack limit
mov
rax
,
[
rsp
+
0
c0h
]
mov
[
r10
+
010
h
]
,
rax
; restore current stack base
mov
rax
,
[
rsp
+
0
c8h
]
mov
[
r10
+
08
h
]
,
rax
mov
r12
,
[
rsp
+
0
d0h
]
; restore R12
mov
r13
,
[
rsp
+
0
d8h
]
; restore R13
mov
r14
,
[
rsp
+
0
e0h
]
; restore R14
mov
r15
,
[
rsp
+
0
e8h
]
; restore R15
mov
rdi
,
[
rsp
+
0
f0h
]
; restore RDI
mov
rsi
,
[
rsp
+
0
f8h
]
; restore RSI
mov
rbx
,
[
rsp
+
0100
h
]
; restore RBX
mov
rbp
,
[
rsp
+
0108
h
]
; restore RBP
mov
rax
,
[
rsp
+
0110
h
]
; restore hidden address of transport_t
; prepare stack
lea
rsp
,
[
rsp
+
0118
h
]
; load return-address
pop
r10
; transport_t returned in RAX
; return parent fcontext_t
mov
[rax],
r9
; return data
mov
[
rax
+
08
h
]
,
r8
; transport_t as 1.arg of context-function
mov
rcx
,
rax
; indirect jump to context
jmp
r10
jump_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/jump_x86_64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "jump_x86_64_sysv_elf_gas.S"
.text
.globl jump_fcontext
.type jump_fcontext,@function
.align 16
jump_fcontext:
leaq -0x38(%rsp), %rsp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%rsp) /* save MMX control- and status-word */
fnstcw 0x4(%rsp) /* save x87 control-word */
#endif
movq %r12, 0x8(%rsp) /* save R12 */
movq %r13, 0x10(%rsp) /* save R13 */
movq %r14, 0x18(%rsp) /* save R14 */
movq %r15, 0x20(%rsp) /* save R15 */
movq %rbx, 0x28(%rsp) /* save RBX */
movq %rbp, 0x30(%rsp) /* save RBP */
/* store RSP (pointing to context-data) in RAX */
movq %rsp, %rax
/* restore RSP (pointing to context-data) from RDI */
movq %rdi, %rsp
movq 0x38(%rsp), %r8 /* restore return-address */
#if !defined(BOOST_USE_TSX)
ldmxcsr (%rsp) /* restore MMX control- and status-word */
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
movq 0x8(%rsp), %r12 /* restore R12 */
movq 0x10(%rsp), %r13 /* restore R13 */
movq 0x18(%rsp), %r14 /* restore R14 */
movq 0x20(%rsp), %r15 /* restore R15 */
movq 0x28(%rsp), %rbx /* restore RBX */
movq 0x30(%rsp), %rbp /* restore RBP */
leaq 0x40(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
/* pass transfer_t as first arg in context function */
/* RDI == fctx, RSI == data */
movq %rax, %rdi
/* indirect jump to context */
jmp *%r8
.size jump_fcontext,.-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/jump_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _jump_fcontext
.align 8
_jump_fcontext:
leaq -0x38(%rsp), %rsp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%rsp) /* save MMX control- and status-word */
fnstcw 0x4(%rsp) /* save x87 control-word */
#endif
movq %r12, 0x8(%rsp) /* save R12 */
movq %r13, 0x10(%rsp) /* save R13 */
movq %r14, 0x18(%rsp) /* save R14 */
movq %r15, 0x20(%rsp) /* save R15 */
movq %rbx, 0x28(%rsp) /* save RBX */
movq %rbp, 0x30(%rsp) /* save RBP */
/* store RSP (pointing to context-data) in RAX */
movq %rsp, %rax
/* restore RSP (pointing to context-data) from RDI */
movq %rdi, %rsp
movq 0x38(%rsp), %r8 /* restore return-address */
#if !defined(BOOST_USE_TSX)
ldmxcsr (%rsp) /* restore MMX control- and status-word */
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
movq 0x8(%rsp), %r12 /* restore R12 */
movq 0x10(%rsp), %r13 /* restore R13 */
movq 0x18(%rsp), %r14 /* restore R14 */
movq 0x20(%rsp), %r15 /* restore R15 */
movq 0x28(%rsp), %rbx /* restore RBX */
movq 0x30(%rsp), %rbp /* restore RBP */
leaq 0x40(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
/* pass transfer_t as first arg in context function */
/* RDI == fctx, RSI == data */
movq %rax, %rdi
/* indirect jump to context */
jmp *%r8
lib/context_switcher/asm/fcontext/make_arm64_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "make_arm64_aapcs_elf_gas.S"
.text
.align 2
.global make_fcontext
.type make_fcontext, %function
make_fcontext:
# shift address in x0 (allocated stack) to lower 16 byte boundary
and x0, x0, ~0xF
# reserve space for context-data on context-stack
sub x0, x0, #0xb0
# third arg of make_fcontext() == address of context-function
# store address as a PC to jump in
str x2, [x0, #0xa0]
# save address of finish as return-address for context-function
# will be entered after context-function returns (LR register)
adr x1, finish
str x1, [x0, #0x98]
ret x30 // return pointer to context-data (x0)
finish:
# exit code is zero
mov x0, #0
# exit application
bl _exit
.size make_fcontext,.-make_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_arm64_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _make_fcontext
.balign 16
_make_fcontext:
; shift address in x0 (allocated stack) to lower 16 byte boundary
and x0, x0, ~0xF
; reserve space for context-data on context-stack
sub x0, x0, #0xb0
; third arg of make_fcontext() == address of context-function
; store address as a PC to jump in
str x2, [x0, #0xa0]
; compute abs address of label finish
; 0x0c = 3 instructions * size (4) before label 'finish'
; TODO: Numeric offset since llvm still does not support labels in ADR. Fix:
; http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140407/212336.html
adr x1, 0x0c
; save address of finish as return-address for context-function
; will be entered after context-function returns (LR register)
str x1, [x0, #0x98]
ret lr ; return pointer to context-data (x0)
finish:
; exit code is zero
mov x0, #0
; exit application
bl __exit
lib/context_switcher/asm/fcontext/make_arm_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* |hiddn| v1 | v2 | v3 | v4 | v5 | v6 | v7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "make_arm_aapcs_elf_gas.S"
.text
.globl make_fcontext
.align 2
.type make_fcontext,%function
.syntax unified
make_fcontext:
@ shift address in A1 to lower 16 byte boundary
bic a1, a1, #15
@ reserve space for context-data on context-stack
sub a1, a1, #124
@ third arg of make_fcontext() == address of context-function
str a3, [a1, #104]
@ compute address of returned transfer_t
add a2, a1, #108
mov a3, a2
str a3, [a1, #64]
@ compute abs address of label finish
adr a2, finish
@ save address of finish as return-address for context-function
@ will be entered after context-function returns
str a2, [a1, #100]
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
#endif
bx lr @ return pointer to context-data
finish:
@ exit code is zero
mov a1, #0
@ exit application
bl _exit@PLT
.size make_fcontext,.-make_fcontext
@ Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_arm_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
* ------------------------------------------------- *
* | sjlj|hiddn| v1 | v2 | v3 | v4 | v5 | v6 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | v7 | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _make_fcontext
.align 2
_make_fcontext:
@ shift address in A1 to lower 16 byte boundary
bic a1, a1, #15
@ reserve space for context-data on context-stack
sub a1, a1, #124
@ third arg of make_fcontext() == address of context-function
str a3, [a1, #108]
@ compute address of returned transfer_t
add a2, a1, #112
mov a3, a2
str a3, [a1, #68]
@ compute abs address of label finish
adr a2, finish
@ save address of finish as return-address for context-function
@ will be entered after context-function returns
str a2, [a1, #104]
bx lr @ return pointer to context-data
finish:
@ exit code is zero
mov a1, #0
@ exit application
bl __exit
lib/context_switcher/asm/fcontext/make_arm_aapcs_pe_armasm.asm
0 → 100644
View file @
c25e6134
;/*
; Copyright Oliver Kowalke 2009.
; 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| *
; * ------------------------------------------------- *
; * |deall|limit| base|hiddn| v1 | v2 | v3 | v4 | *
; * ------------------------------------------------- *
; * ------------------------------------------------- *
; * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
; * ------------------------------------------------- *
; * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
; * ------------------------------------------------- *
; * | v5 | v6 | v7 | v8 | lr | pc | FCTX| DATA| *
; * ------------------------------------------------- *
; * *
; *******************************************************
AREA
|
.
text
|
,
CODE
ALIGN
4
EXPORT
make_fcontext
IMPORT
_exit
make_fcontext
PROC
; first arg of make_fcontext() == top of context-stack
; save top of context-stack (base) A4
mov
a4
,
a1
; shift address in A1 to lower 16 byte boundary
bic
a1
,
a1
,
#
0x0f
; reserve space for context-data on context-stack
sub
a1
,
a1
,
#
0x48
; save top address of context_stack as 'base'
str
a4
,
[
a1
,
#
0x8
]
; second arg of make_fcontext() == size of context-stack
; compute bottom address of context-stack (limit)
sub
a4
,
a4
,
a2
; save bottom address of context-stack as 'limit'
str
a4
,
[
a1
,
#
0x4
]
; save bottom address of context-stack as 'dealloction stack'
str
a4
,
[
a1
,
#
0x0
]
; third arg of make_fcontext() == address of context-function
str
a3
,
[
a1
,
#
0x34
]
; compute address of returned transfer_t
add
a2
,
a1
,
#
0x38
mov
a3
,
a2
str
a3
,
[
a1
,
#
0xc
]
; compute abs address of label finish
adr
a2
,
finish
; save address of finish as return-address for context-function
; will be entered after context-function returns
str
a2
,
[
a1
,
#
0x30
]
bx
lr
; return pointer to context-data
finish
; exit code is zero
mov
a1
,
#
0
; exit application
bl
_exit
ENDP
END
lib/context_switcher/asm/fcontext/make_combined_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "make_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "make_x86_64_sysv_macho_gas.S"
#elif defined(__ppc__)
#include "make_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "make_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/make_i386_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
---------------------------------------------------------------------------------
*
*
|
0
h
|
04
h
|
08
h
|
0
ch
|
010
h
|
014
h
|
018
h
|
01
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
fc_strg
|
fc_deallo
|
limit
|
base
|
fc_seh
|
EDI
|
*
*
---------------------------------------------------------------------------------
*
*
---------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
---------------------------------------------------------------------------------
*
*
|
020
h
|
024
h
|
028
h
|
02
ch
|
030
h
|
034
h
|
038
h
|
03
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
ESI
|
EBX
|
EBP
|
EIP
|
to
|
data
|
EH
NXT
|
SEH
HNDLR
|
*
*
---------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"make_i386_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
/*
mark
as
using
no
unregistered
SEH
handlers
*/
.
globl
@
feat
.
00
.
def
@
feat
.
00
; .scl 3; .type 0; .endef
.
set
@
feat
.
00
,
1
.
globl
_make_fcontext
.
def
_make_fcontext
; .scl 2; .type 32; .endef
_make_fcontext
:
/*
first
arg
of
make_fcontext
()
==
top
of
context
-
stack
*/
movl
0x04
(
%
esp
),
%
eax
/*
reserve
space
for
first
argument
of
context
-
function
*/
/*
EAX
might
already
point
to
a
16
byte
border
*/
leal
-
0x8
(
%
eax
),
%
eax
/*
shift
address
in
EAX
to
lower
16
byte
boundary
*/
andl
$
-
16
,
%
eax
/*
reserve
space
for
context
-
data
on
context
-
stack
*/
/*
size
for
fc_mxcsr
..
EIP
+
return
-
address
for
context
-
function
*/
/*
on
context
-
function
entry
:
(
ESP
-
0x4
)
%
8
==
0
*/
/*
additional
space
is
required
for
SEH
*/
leal
-
0x40
(
%
eax
),
%
eax
/*
save
MMX
control
-
and
status
-
word
*/
stmxcsr
(
%
eax
)
/*
save
x87
control
-
word
*/
fnstcw
0x4
(
%
eax
)
/*
first
arg
of
make_fcontext
()
==
top
of
context
-
stack
*/
movl
0x4
(
%
esp
),
%
ecx
/*
save
top
address
of
context
stack
as
'
base
'
*/
movl
%
ecx
,
0x14
(
%
eax
)
/*
second
arg
of
make_fcontext
()
==
size
of
context
-
stack
*/
movl
0x8
(
%
esp
),
%
edx
/*
negate
stack
size
for
LEA
instruction
(
==
substraction
)
*/
negl
%
edx
/*
compute
bottom
address
of
context
stack
(
limit
)
*/
leal
(
%
ecx
,
%
edx
),
%
ecx
/*
save
bottom
address
of
context
-
stack
as
'
limit
'
*/
movl
%
ecx
,
0x10
(
%
eax
)
/*
save
bottom
address
of
context
-
stack
as
'
dealloction
stack
'
*/
movl
%
ecx
,
0xc
(
%
eax
)
/*
set
fiber
-
storage
to
zero
*/
xorl
%
ecx
,
%
ecx
movl
%
ecx
,
0x8
(
%
eax
)
/*
third
arg
of
make_fcontext
()
==
address
of
context
-
function
*/
/*
stored
in
EBX
*/
movl
0xc
(
%
esp
),
%
ecx
movl
%
ecx
,
0x24
(
%
eax
)
/*
compute
abs
address
of
label
trampoline
*/
movl
$
trampoline
,
%
ecx
/*
save
address
of
trampoline
as
return
-
address
for
context
-
function
*/
/*
will
be
entered
after
calling
jump_fcontext
()
first
time
*/
movl
%
ecx
,
0x2c
(
%
eax
)
/*
compute
abs
address
of
label
finish
*/
movl
$
finish
,
%
ecx
/*
save
address
of
finish
as
return
-
address
for
context
-
function
*/
/*
will
be
entered
after
context
-
function
returns
*/
movl
%
ecx
,
0x28
(
%
eax
)
/*
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
*/
/*
load
NT_TIB
into
ECX
*/
movl
%
fs
:
(
0x0
),
%
ecx
walk
:
/*
load
'
next
'
member
of
current
SEH
into
EDX
*/
movl
(
%
ecx
),
%
edx
/*
test
if
'
next
'
of
current
SEH
is
last
(
==
0xffffffff
)
*/
incl
%
edx
jz
found
decl
%
edx
/*
exchange
content
; ECX contains address of next SEH */
xchgl
%
ecx
,
%
edx
/*
inspect
next
SEH
*/
jmp
walk
found
:
/*
load
'
handler
'
member
of
SEH
==
address
of
last
SEH
handler
installed
by
Windows
*/
movl
0x04
(
%
ecx
),
%
ecx
/*
save
address
in
ECX
as
SEH
handler
for
context
*/
movl
%
ecx
,
0x3c
(
%
eax
)
/*
set
ECX
to
-
1
*/
movl
$
0xffffffff
,
%
ecx
/*
save
ECX
as
next
SEH
item
*/
movl
%
ecx
,
0x38
(
%
eax
)
/*
load
address
of
next
SEH
item
*/
leal
0x38
(
%
eax
),
%
ecx
/*
save
next
SEH
*/
movl
%
ecx
,
0x18
(
%
eax
)
/*
return
pointer
to
context
-
data
*/
ret
trampoline
:
/*
move
transport_t
for
entering
context
-
function
*/
/*
FCTX
==
EAX
,
DATA
==
EDX
*/
movl
%
eax
,
(
%
esp
)
movl
%
edx
,
0x4
(
%
esp
)
/*
label
finish
as
return
-
address
*/
pushl
%
ebp
/*
jump
to
context
-
function
*/
jmp
*
%
ebx
finish
:
/*
ESP
points
to
same
address
as
ESP
on
entry
of
context
function
+
0x4
*/
xorl
%
eax
,
%
eax
/*
exit
code
is
zero
*/
movl
%
eax
,
(
%
esp
)
/*
exit
application
*/
call
__exit
hlt
.
def
__exit
; .scl 2; .type 32; .endef /* standard C library function */
.
section
.
drectve
.
ascii
" -export:
\"
_make_fcontext
\"
"
lib/context_switcher/asm/fcontext/make_i386_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ---------------------------------------------------------------------------------
; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
; ---------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
; ---------------------------------------------------------------------------------
; ---------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ---------------------------------------------------------------------------------
; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
; ---------------------------------------------------------------------------------
; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
; ---------------------------------------------------------------------------------
.
386
.
XMM
.
model
flat
,
c
; standard C library function
_exit
PROTO
,
value
:
SDWORD
.
code
make_fcontext
PROC
BOOST_CONTEXT_EXPORT
; first arg of make_fcontext() == top of context-stack
mov
eax
,
[
esp
+
04
h
]
; reserve space for first argument of context-function
; EAX might already point to a 16byte border
lea
eax
,
[
eax
-
08
h
]
; shift address in EAX to lower 16 byte boundary
and
eax
,
-
16
; reserve space for context-data on context-stack
; on context-function entry: (ESP -0x4) % 8 == 0
; additional space is required for SEH
lea
eax
,
[
eax
-
040
h
]
; save MMX control- and status-word
stmxcsr
[eax]
; save x87 control-word
fnstcw
[
eax
+
04
h
]
; first arg of make_fcontext() == top of context-stack
mov
ecx
,
[
esp
+
04
h
]
; save top address of context stack as 'base'
mov
[
eax
+
014
h
]
,
ecx
; second arg of make_fcontext() == size of context-stack
mov
edx
,
[
esp
+
08
h
]
; negate stack size for LEA instruction (== substraction)
neg
edx
; compute bottom address of context stack (limit)
lea
ecx
,
[
ecx
+
edx
]
; save bottom address of context-stack as 'limit'
mov
[
eax
+
010
h
]
,
ecx
; save bottom address of context-stack as 'dealloction stack'
mov
[
eax
+
0
ch
]
,
ecx
; set fiber-storage to zero
xor
ecx
,
ecx
mov
[
eax
+
08
h
]
,
ecx
; third arg of make_fcontext() == address of context-function
; stored in EBX
mov
ecx
,
[
esp
+
0
ch
]
mov
[
eax
+
024
h
]
,
ecx
; compute abs address of label trampoline
mov
ecx
,
trampoline
; save address of trampoline as return-address for context-function
; will be entered after calling jump_fcontext() first time
mov
[
eax
+
02
ch
]
,
ecx
; compute abs address of label finish
mov
ecx
,
finish
; save address of finish as return-address for context-function in EBP
; will be entered after context-function returns
mov
[
eax
+
028
h
]
,
ecx
; 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-handlers are disregarded if not present and the
; program is aborted
assume
fs
:
nothing
; load NT_TIB into ECX
mov
ecx
,
fs
:
[0h]
assume
fs
:
error
walk
:
; load 'next' member of current SEH into EDX
mov
edx
,
[ecx]
; test if 'next' of current SEH is last (== 0xffffffff)
inc
edx
jz
found
dec
edx
; exchange content; ECX contains address of next SEH
xchg
edx
,
ecx
; inspect next SEH
jmp
walk
found
:
; load 'handler' member of SEH == address of last SEH handler installed by Windows
mov
ecx
,
[
ecx
+
04
h
]
; save address in ECX as SEH handler for context
mov
[
eax
+
03
ch
]
,
ecx
; set ECX to -1
mov
ecx
,
0
ffffffffh
; save ECX as next SEH item
mov
[
eax
+
038
h
]
,
ecx
; load address of next SEH item
lea
ecx
,
[
eax
+
038
h
]
; save next SEH
mov
[
eax
+
018
h
]
,
ecx
ret
; return pointer to context-data
trampoline
:
; move transport_t for entering context-function
; FCTX == EAX, DATA == EDX
mov
[esp],
eax
mov
[
esp
+
04
h
]
,
edx
push
ebp
; jump to context-function
jmp
ebx
finish
:
; exit code is zero
xor
eax
,
eax
mov
[esp],
eax
; exit application
call
_exit
hlt
make_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/make_i386_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | | *
* ---------------------------------------------------------------------------------- *
* | to | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "make_i386_sysv_elf_gas.S"
.text
.globl make_fcontext
.align 2
.type make_fcontext,@function
make_fcontext:
/* first arg of make_fcontext() == top of context-stack */
movl 0x4(%esp), %eax
/* reserve space for first argument of context-function
eax might already point to a 16byte border */
leal -0x8(%eax), %eax
/* shift address in EAX to lower 16 byte boundary */
andl $-16, %eax
/* reserve space for context-data on context-stack */
leal -0x28(%eax), %eax
/* third arg of make_fcontext() == address of context-function */
/* stored in EBX */
movl 0xc(%esp), %ecx
movl %ecx, 0x10(%eax)
/* save MMX control- and status-word */
stmxcsr (%eax)
/* save x87 control-word */
fnstcw 0x4(%eax)
/* return transport_t */
/* FCTX == EDI, DATA == ESI */
leal 0x8(%eax), %ecx
movl %ecx, 0x1c(%eax)
/* compute abs address of label trampoline */
call 1f
/* address of trampoline 1 */
1: popl %ecx
/* compute abs address of label trampoline */
addl $trampoline-1b, %ecx
/* save address of trampoline as return address */
/* will be entered after calling jump_fcontext() first time */
movl %ecx, 0x18(%eax)
/* compute abs address of label finish */
call 2f
/* address of label 2 */
2: popl %ecx
/* compute abs address of label finish */
addl $finish-2b, %ecx
/* save address of finish as return-address for context-function */
/* will be entered after context-function returns */
movl %ecx, 0x14(%eax)
ret /* return pointer to context-data */
trampoline:
/* move transport_t for entering context-function */
movl %edi, (%esp)
movl %esi, 0x4(%esp)
pushl %ebp
/* jump to context-function */
jmp *%ebx
finish:
call 3f
/* address of label 3 */
3: popl %ebx
/* compute address of GOT and store it in EBX */
addl $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
/* exit code is zero */
xorl %eax, %eax
movl %eax, (%esp)
/* exit application */
call _exit@PLT
hlt
.size make_fcontext,.-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_i386_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | to | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | | *
* ---------------------------------------------------------------------------------- *
* | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _make_fcontext
.align 2
_make_fcontext:
/* first arg of make_fcontext() == top of context-stack */
movl 0x4(%esp), %eax
/* reserve space for first argument of context-function
eax might already point to a 16byte border */
leal -0x8(%eax), %eax
/* shift address in EAX to lower 16 byte boundary */
andl $-16, %eax
/* reserve space for context-data on context-stack */
leal -0x2c(%eax), %eax
/* third arg of make_fcontext() == address of context-function */
/* stored in EBX */
movl 0xc(%esp), %ecx
movl %ecx, 0x10(%eax)
/* save MMX control- and status-word */
stmxcsr (%eax)
/* save x87 control-word */
fnstcw 0x4(%eax)
/* compute abs address of label trampoline */
call 1f
/* address of trampoline 1 */
1: popl %ecx
/* compute abs address of label trampoline */
addl $trampoline-1b, %ecx
/* save address of trampoline as return address */
/* will be entered after calling jump_fcontext() first time */
movl %ecx, 0x18(%eax)
/* compute abs address of label finish */
call 2f
/* address of label 2 */
2: popl %ecx
/* compute abs address of label finish */
addl $finish-2b, %ecx
/* save address of finish as return-address for context-function */
/* will be entered after context-function returns */
movl %ecx, 0x14(%eax)
ret /* return pointer to context-data */
trampoline:
/* move transport_t for entering context-function */
movl %eax, (%esp)
movl %edx, 0x4(%esp)
pushl %ebp
/* jump to context-function */
jmp *%ebx
finish:
/* exit code is zero */
xorl %eax, %eax
movl %eax, (%esp)
/* exit application */
call __exit
hlt
lib/context_switcher/asm/fcontext/make_i386_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "make_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "make_x86_64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/make_mips32_o32_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F20 | F22 | F24 | F26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F28 | F30 | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | ABI ARGS | GP | FCTX| DATA| | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "make_mips32_o32_elf_gas.S"
.text
.globl make_fcontext
.align 2
.type make_fcontext,@function
.ent make_fcontext
make_fcontext:
#ifdef __PIC__
.set noreorder
.cpload $t9
.set reorder
#endif
# shift address in A0 to lower 16 byte boundary
li $v1, -16 # 0xfffffffffffffff0
and $v0, $v1, $a0
# reserve space for context-data on context-stack
# includes an extra 32 bytes for:
# - 16-byte incoming argument area required by mips ABI used when
# jump_context calls the initial function
# - 4 bytes to save our GP register used in finish
# - 8 bytes to as space for transfer_t returned to finish
# - 4 bytes for alignment
addiu $v0, $v0, -128
# third arg of make_fcontext() == address of context-function
sw $a2, 92($v0)
# save global pointer in context-data
sw $gp, 112($v0)
# compute address of returned transfer_t
addiu $t0, $v0, 116
sw $t0, 84($v0)
# compute abs address of label finish
la $t9, finish
# save address of finish as return-address for context-function
# will be entered after context-function returns
sw $t9, 88($v0)
jr $ra # return pointer to context-data
finish:
# reload our gp register (needed for la)
lw $gp, 16($sp)
# call _exit(0)
# the previous function should have left the 16 bytes incoming argument
# area on the stack which we reuse for calling _exit
la $t9, _exit
move $a0, $zero
jr $t9
.end make_fcontext
.size make_fcontext, .-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_mips64_n64_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Jiaxun Yang 2018.
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 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | F24 | F25 | F26 | F27 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | F28 | F29 | F30 | F31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | FP | GP | RA | PC | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "make_mips64_n64_elf_gas.S"
.text
.globl make_fcontext
.align 3
.type make_fcontext,@function
.ent make_fcontext
make_fcontext:
#ifdef __PIC__
.set noreorder
.cpload $t9
.set reorder
#endif
# shift address in A0 to lower 16 byte boundary
li $v1, 0xfffffffffffffff0
and $v0, $v1, $a0
# reserve space for context-data on context-stack
daddiu $v0, $v0, -160
# third arg of make_fcontext() == address of context-function
sd $a2, 152($v0)
# save global pointer in context-data
sd $gp, 136($v0)
# psudo instruction compute abs address of label finish based on GP
dla $t9, finish
# save address of finish as return-address for context-function
# will be entered after context-function returns
sd $t9, 144($v0)
jr $ra # return pointer to context-data
finish:
# reload our gp register (needed for la)
daddiu $t0, $sp, -160
ld $gp, 136($t0)
# call _exit(0)
# the previous function should have left the 16 bytes incoming argument
# area on the stack which we reuse for calling _exit
dla $t9, _exit
move $a0, $zero
jr $t9
.end make_fcontext
.size make_fcontext, .-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_ppc32_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__ppc__)
#include "make_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "make_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/make_ppc32_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------|------------ *
* | 224 | 228 | 232 | 236 | 240 | 244 | *
* ------------------------|------------ *
* | F30 | F31 |bchai| LR | *
* ------------------------|------------ *
* *
*******************************************************/
.file "make_ppc32_sysv_elf_gas.S"
.text
.globl make_fcontext
.align 2
.type make_fcontext,@function
make_fcontext:
# save return address into R6
mflr %r6
# first arg of make_fcontext() == top address of context-function
# shift address in R3 to lower 16 byte boundary
clrrwi %r3, %r3, 4
# reserve space on context-stack, including 16 bytes of linkage
# and parameter area + 240 bytes of context-data (R1 % 16 == 0)
subi %r3, %r3, 16 + 240
# third arg of make_fcontext() == address of context-function
#ifdef __linux__
# save context-function as PC
stw %r5, 16(%r3)
#else
# save context-function for trampoline
stw %r5, 248(%r3)
#endif
# set back-chain to zero
li %r0, 0
stw %r0, 240(%r3)
# copy FPSCR to new context
mffs %f0
stfd %f0, 8(%r3)
#ifdef __linux__
# set hidden pointer for returning transfer_t
la %r0, 248(%r3)
stw %r0, 4(%r3)
#endif
# load address of label 1 into R4
bl 1f
1: mflr %r4
#ifndef __linux__
# compute abs address of trampoline, use as PC
addi %r7, %r4, trampoline - 1b
stw %r7, 16(%r3)
#endif
# compute abs address of label finish
addi %r4, %r4, finish - 1b
# save address of finish as return-address for context-function
# will be entered after context-function returns
stw %r4, 244(%r3)
# restore return address from R6
mtlr %r6
blr # return pointer to context-data
#ifndef __linux__
trampoline:
# On systems other than Linux, jump_fcontext is returning the
# transfer_t in R3:R4, but we need to pass transfer_t * R3 to
# our context-function.
lwz %r0, 8(%r1) # address of context-function
mtctr %r0
stw %r3, 8(%r1)
stw %r4, 12(%r1)
la %r3, 8(%r1) # address of transfer_t
bctr
#endif
finish:
# Use the secure PLT for _exit(0). If we use the insecure BSS PLT
# here, then the linker may use the insecure BSS PLT even if the
# C++ compiler wanted the secure PLT.
# set R30 for secure PLT, large model
bl 2f
2: mflr %r30
addis %r30, %r30, .Ltoc - 2b@ha
addi %r30, %r30, .Ltoc - 2b@l
# call _exit(0) with special addend 0x8000 for large model
li %r3, 0
bl _exit + 0x8000@plt
.size make_fcontext, .-make_fcontext
/* Provide the GOT pointer for secure PLT, large model. */
.section .got2,"aw"
.Ltoc = . + 0x8000
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_ppc32_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _make_fcontext
.align 2
_make_fcontext:
# save return address into R6
mflr r6
# first arg of make_fcontext() == top address of context-function
# shift address in R3 to lower 16 byte boundary
clrrwi r3, r3, 4
# reserve space for context-data on context-stack
# including 64 byte of linkage + parameter area (R1 16 == 0)
subi r3, r3, 336
# third arg of make_fcontext() == address of context-function
stw r5, 240(r3)
# set back-chain to zero
li r0, 0
stw r0, 244(r3)
mffs f0 # load FPSCR
stfd f0, 144(r3) # save FPSCR
# compute address of returned transfer_t
addi r0, r3, 252
mr r4, r0
stw r4, 228(r3)
# load LR
mflr r0
# jump to label 1
bl 1f
1:
# load LR into R4
mflr r4
# compute abs address of label finish
addi r4, r4, finish - 1b
# restore LR
mtlr r0
# save address of finish as return-address for context-function
# will be entered after context-function returns
stw r4, 236(r3)
# restore return address from R6
mtlr r6
blr # return pointer to context-data
finish:
# save return address into R0
mflr r0
# save return address on stack, set up stack frame
stw r0, 4(r1)
# allocate stack space, R1 16 == 0
stwu r1, -16(r1)
# exit code is zero
li r3, 0
# exit application
bl _exit@plt
lib/context_switcher/asm/fcontext/make_ppc32_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.globl make_fcontext[DS]
.globl .make_fcontext[PR]
.align 2
.csect make_fcontext[DS]
make_fcontext:
.long .make_fcontext[PR]
.csect .make_fcontext[PR], 3
#.make_fcontext:
# save return address into R6
mflr 6
# first arg of make_fcontext() == top address of context-function
# shift address in R3 to lower 16 byte boundary
clrrwi 3, 3, 4
# reserve space for context-data on context-stack
# including 64 byte of linkage + parameter area (R1 % 16 == 0)
subi 3, 3, 336
# third arg of make_fcontext() == address of context-function
stw 5, 240(3)
# set back-chain to zero
li 0, 0
stw 0, 244(3)
# compute address of returned transfer_t
addi 0, 3, 252
mr 4, 0
stw 4, 228(3)
# load LR
mflr 0
# jump to label 1
bl .Label
.Label:
# load LR into R4
mflr 4
# compute abs address of label .L_finish
addi 4, 4, .L_finish - .Label
# restore LR
mtlr 0
# save address of finish as return-address for context-function
# will be entered after context-function returns
stw 4, 236(3)
# restore return address from R6
mtlr 6
blr # return pointer to context-data
.L_finish:
# save return address into R0
mflr 0
# save return address on stack, set up stack frame
stw 0, 4(1)
# allocate stack space, R1 % 16 == 0
stwu 1, -16(1)
# exit code is zero
li 3, 0
# exit application
bl ._exit
nop
lib/context_switcher/asm/fcontext/make_ppc64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "make_ppc64_sysv_elf_gas.S"
.globl make_fcontext
#if _CALL_ELF == 2
.text
.align 2
make_fcontext:
addis %r2, %r12, .TOC.-make_fcontext@ha
addi %r2, %r2, .TOC.-make_fcontext@l
.localentry make_fcontext, . - make_fcontext
#else
.section ".opd","aw"
.align 3
make_fcontext:
# ifdef _CALL_LINUX
.quad .L.make_fcontext,.TOC.@tocbase,0
.type make_fcontext,@function
.text
.align 2
.L.make_fcontext:
# else
.hidden .make_fcontext
.globl .make_fcontext
.quad .make_fcontext,.TOC.@tocbase,0
.size make_fcontext,24
.type .make_fcontext,@function
.text
.align 2
.make_fcontext:
# endif
#endif
# save return address into R6
mflr %r6
# first arg of make_fcontext() == top address of context-stack
# shift address in R3 to lower 16 byte boundary
clrrdi %r3, %r3, 4
# reserve space for context-data on context-stack
# including 64 byte of linkage + parameter area (R1 % 16 == 0)
subi %r3, %r3, 248
# third arg of make_fcontext() == address of context-function
# entry point (ELFv2) or descriptor (ELFv1)
#if _CALL_ELF == 2
# save address of context-function entry point
std %r5, 176(%r3)
#else
# save address of context-function entry point
ld %r4, 0(%r5)
std %r4, 176(%r3)
# save TOC of context-function
ld %r4, 8(%r5)
std %r4, 0(%r3)
#endif
# set back-chain to zero
li %r0, 0
std %r0, 184(%r3)
#if _CALL_ELF != 2
# zero in r3 indicates first jump to context-function
std %r0, 152(%r3)
#endif
# load LR
mflr %r0
# jump to label 1
bl 1f
1:
# load LR into R4
mflr %r4
# compute abs address of label finish
addi %r4, %r4, finish - 1b
# restore LR
mtlr %r0
# save address of finish as return-address for context-function
# will be entered after context-function returns
std %r4, 168(%r3)
# restore return address from R6
mtlr %r6
blr # return pointer to context-data
finish:
# save return address into R0
mflr %r0
# save return address on stack, set up stack frame
std %r0, 8(%r1)
# allocate stack space, R1 % 16 == 0
stdu %r1, -32(%r1)
# exit code is zero
li %r3, 0
# exit application
bl _exit
nop
#if _CALL_ELF == 2
.size make_fcontext, .-make_fcontext
#else
# ifdef _CALL_LINUX
.size .make_fcontext, .-.L.make_fcontext
# else
.size .make_fcontext, .-.make_fcontext
# endif
#endif
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
.text
.globl _make_fcontext
_make_fcontext:
; save return address into R6
mflr r6
; first arg of make_fcontext() == top address of context-function
; shift address in R3 to lower 16 byte boundary
clrrwi r3, r3, 4
; reserve space for context-data on context-stack
; including 64 byte of linkage + parameter area (R1 16 == 0)
subi r3, r3, 248
; third arg of make_fcontext() == address of context-function
stw r5, 176(r3)
; set back-chain to zero
li %r0, 0
std %r0, 184(%r3)
; compute address of returned transfer_t
addi %r0, %r3, 232
mr %r4, %r0
std %r4, 152(%r3)
; load LR
mflr r0
; jump to label 1
bl l1
l1:
; load LR into R4
mflr r4
; compute abs address of label finish
addi r4, r4, lo16((finish - .) + 4)
; restore LR
mtlr r0
; save address of finish as return-address for context-function
; will be entered after context-function returns
std r4, 168(r3)
; restore return address from R6
mtlr r6
blr ; return pointer to context-data
finish:
; save return address into R0
mflr r0
; save return address on stack, set up stack frame
stw r0, 8(r1)
; allocate stack space, R1 16 == 0
stwu r1, -32(r1)
; set return value to zero
li r3, 0
; exit application
bl __exit
nop
lib/context_switcher/asm/fcontext/make_ppc64_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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)
*/
.globl make_fcontext[DS]
.globl .make_fcontext[PR]
.align 2
.csect .make_fcontext[PR], 3
.globl _make_fcontext
#._make_fcontext:
# save return address into R6
mflr 6
# first arg of make_fcontext() == top address of context-function
# shift address in R3 to lower 16 byte boundary
clrrwi 3, 3, 4
# reserve space for context-data on context-stack
# including 64 byte of linkage + parameter area (R1 % 16 == 0)
subi 3, 3, 248
# third arg of make_fcontext() == address of context-function
stw 5, 176(3)
# set back-chain to zero
li 0, 0
std 0, 184(3)
# compute address of returned transfer_t
addi 0, 3, 232
mr 4, 0
std 4, 152(3)
# load LR
mflr 0
# jump to label 1
bl .Label
.Label:
# load LR into R4
mflr 4
# compute abs address of label .L_finish
addi 4, 4, .L_finish - .Label
# restore LR
mtlr 0
# save address of finish as return-address for context-function
# will be entered after context-function returns
stw 4, 168(3)
# restore return address from R6
mtlr 6
blr # return pointer to context-data
.L_finish:
# save return address into R0
mflr 0
# save return address on stack, set up stack frame
stw 0, 8(1)
# allocate stack space, R1 % 16 == 0
stwu 1, -32(1)
# exit code is zero
li 3, 0
# exit application
bl ._exit
nop
lib/context_switcher/asm/fcontext/make_riscv64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
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| *
* ------------------------------------------------- *
* | fs0 | fs1 | fs2 | fs3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | fs4 | fs5 | fs6 | fs7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | fs8 | fs9 | fs10 | fs11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | s0 | s1 | s2 | s3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | s4 | s5 | s6 | s7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
* ------------------------------------------------- *
* | s8 | s9 | s10 | s11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | | | | | *
* ------------------------------------------------- *
* | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
* ------------------------------------------------- *
* | ra | pc | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "make_riscv64_sysv_elf_gas.S"
.text
.align 1
.global make_fcontext
.type make_fcontext, %function
make_fcontext:
# shift address in a0 (allocated stack) to lower 16 byte boundary
andi a0, a0, ~0xF
# reserve space for context-data on context-stack
addi a0, a0, -0xd0
# third arg of make_fcontext() == address of context-function
# store address as a PC to jump in
sd a2, 0xc8(a0)
# save address of finish as return-address for context-function
# will be entered after context-function returns (RA register)
lla a4, finish
sd a4, 0xc0(a0)
ret // return pointer to context-data (a0)
finish:
# exit code is zero
li a0, 0
# exit application
tail _exit@plt
.size make_fcontext,.-make_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_s390x_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | R6 | R7 | R8 | R9 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | R10 | R11 | R12 | R13 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | R14/LR | R15 | F1 | F3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | | *
* ------------------------------------------------- *
* | 96 | 104 | 112 | 120 | *
* ------------------------------------------------- *
* | F5 | F7 | PC | | *
* ------------------------------------------------- *
* *****************************************************/
.file "make_s390x_sysv_elf_gas.S"
.text
.align 4 # According to the sample code in the ELF ABI docs
.global make_fcontext
.type make_fcontext, @function
#define GR_OFFSET 0
#define LR_OFFSET 64
#define SP_OFFSET 72
#define FP_OFFSET 80
#define PC_OFFSET 112
#define L_CTX 120
#define L_STACKFRAME 120
make_fcontext:
# make_fcontext takes in 3 arguments
# arg1 --> The address where the context needs to be made
# arg2 --> The size of the context
# arg3 --> The address of the context function
# According to the ELF ABI, the register R2 holds the first arg.
# R2 also acts as the register which holds return value
# Register R3 holds the second, R4 the third so on.
# Shift the address in R2 to a lower 8 byte boundary
# This is done because according to the ELF ABI Doc, the stack needs
# to be 8 byte aligned.
# In order to do so, we need to make sure that the address is divisible
# by 8. We can check this, by checking if the the last 3 bits of the
# address is zero or not. If not AND it with `-8`.
# Here we AND the lower 16 bits of the memory address present in the
# R2 with the bits 1111 1111 1111 1000
nill %r2,0xfff0
# Reserve space for context-data on context-stack.
# This is done by shifting the SP/address by 112 bytes.
aghi %r2,-L_CTX
# third arg of make_fcontext() == address of the context-function
# Store the address as a PC to jump in, whenever we call the
# make_fcontext.
stg %r4,PC_OFFSET(%r2)
# Save the address of finish as return-address for context-function
# This will be entered after context-function return
# The address of finish will be saved in Link register, this register
# specifies where we need to jump after the function executes
# completely.
larl %r1,finish
stg %r1,LR_OFFSET(%r2)
# Return pointer to context data
# R14 acts as the link register
# R2 holds the address of the context stack. When we return from the
# make_fcontext, R2 is passed back.
br %r14
finish:
# In finish tasks, you load the exit code and exit the make_fcontext
# This is called when the context-function is entirely executed
lghi %r2,0
brasl %r14,_exit@PLT
.size make_fcontext,.-make_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_x86_64_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x20
|
0x24
|
0x28
|
0x2c
|
0x30
|
0x34
|
0x38
|
0x3c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe40
|
0x44
|
0x48
|
0x4c
|
0x50
|
0x54
|
0x58
|
0x5c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x60
|
0x64
|
0x68
|
0x6c
|
0x70
|
0x74
|
0x78
|
0x7c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
32
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x80
|
0x84
|
0x88
|
0x8c
|
0x90
|
0x94
|
0x98
|
0x9c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xa0
|
0xa4
|
0xa8
|
0xac
|
0xb0
|
0xb4
|
0xb8
|
0xbc
|
*
*
----------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
<
alignment
>
|
fbr_strg
|
fc_dealloc
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xc0
|
0xc4
|
0xc8
|
0xcc
|
0xd0
|
0xd4
|
0xd8
|
0xdc
|
*
*
----------------------------------------------------------------------------------
*
*
|
limit
|
base
|
R12
|
R13
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe0
|
0xe4
|
0xe8
|
0xec
|
0xf0
|
0xf4
|
0xf8
|
0xfc
|
*
*
----------------------------------------------------------------------------------
*
*
|
R14
|
R15
|
RDI
|
RSI
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x100
|
0x104
|
0x108
|
0x10c
|
0x110
|
0x114
|
0x118
|
0x11c
|
*
*
----------------------------------------------------------------------------------
*
*
|
RBX
|
RBP
|
hidden
|
RIP
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x120
|
0x124
|
0x128
|
0x12c
|
0x130
|
0x134
|
0x138
|
0x13c
|
*
*
----------------------------------------------------------------------------------
*
*
|
parameter
area
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x140
|
0x144
|
0x148
|
0x14c
|
0x150
|
0x154
|
0x158
|
0x15c
|
*
*
----------------------------------------------------------------------------------
*
*
|
FCTX
|
DATA
|
|
*
*
----------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"make_x86_64_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
.
globl
make_fcontext
.
def
make_fcontext
; .scl 2; .type 32; .endef
.
seh_proc
make_fcontext
make_fcontext
:
.
seh_endprologue
/*
first
arg
of
make_fcontext
()
==
top
of
context
-
stack
*/
movq
%
rcx
,
%
rax
/*
shift
address
in
RAX
to
lower
16
byte
boundary
*/
/*
==
pointer
to
fcontext_t
and
address
of
context
stack
*/
andq
$
-
16
,
%
rax
/*
reserve
space
for
context
-
data
on
context
-
stack
*/
/*
on
context
-
function
entry
:
(
RSP
-
0x8
)
%
16
==
0
*/
leaq
-
0x150
(
%
rax
),
%
rax
/*
third
arg
of
make_fcontext
()
==
address
of
context
-
function
*/
movq
%
r8
,
0x100
(
%
rax
)
/*
first
arg
of
make_fcontext
()
==
top
of
context
-
stack
*/
/*
save
top
address
of
context
stack
as
'
base
'
*/
movq
%
rcx
,
0xc8
(
%
rax
)
/*
second
arg
of
make_fcontext
()
==
size
of
context
-
stack
*/
/*
negate
stack
size
for
LEA
instruction
(
==
substraction
)
*/
negq
%
rdx
/*
compute
bottom
address
of
context
stack
(
limit
)
*/
leaq
(
%
rcx
,
%
rdx
),
%
rcx
/*
save
bottom
address
of
context
stack
as
'
limit
'
*/
movq
%
rcx
,
0xc0
(
%
rax
)
/*
save
address
of
context
stack
limit
as
'
dealloction
stack
'
*/
movq
%
rcx
,
0xb8
(
%
rax
)
/*
set
fiber
-
storage
to
zero
*/
xorq
%
rcx
,
%
rcx
movq
%
rcx
,
0xb0
(
%
rax
)
/*
save
MMX
control
-
and
status
-
word
*/
stmxcsr
0xa0
(
%
rax
)
/*
save
x87
control
-
word
*/
fnstcw
0xa4
(
%
rax
)
/*
compute
address
of
transport_t
*/
leaq
0x140
(
%
rax
),
%
rcx
/*
store
address
of
transport_t
in
hidden
field
*/
movq
%
rcx
,
0x110
(
%
rax
)
/*
compute
abs
address
of
label
trampoline
*/
leaq
trampoline
(
%
rip
),
%
rcx
/*
save
address
of
finish
as
return
-
address
for
context
-
function
*/
/*
will
be
entered
after
jump_fcontext
()
first
time
*/
movq
%
rcx
,
0x118
(
%
rax
)
/*
compute
abs
address
of
label
finish
*/
leaq
finish
(
%
rip
),
%
rcx
/*
save
address
of
finish
as
return
-
address
for
context
-
function
*/
/*
will
be
entered
after
context
-
function
returns
*/
movq
%
rcx
,
0x108
(
%
rax
)
ret
/*
return
pointer
to
context
-
data
*/
trampoline
:
/*
store
return
address
on
stack
*/
/*
fix
stack
alignment
*/
pushq
%
rbp
/*
jump
to
context
-
function
*/
jmp
*
%
rbx
finish
:
/*
32
byte
shadow
-
space
for
_exit
()
*/
andq
$
-
32
,
%
rsp
/*
32
byte
shadow
-
space
for
_exit
()
are
*/
/*
already
reserved
by
make_fcontext
()
*/
/*
exit
code
is
zero
*/
xorq
%
rcx
,
%
rcx
/*
exit
application
*/
call
_exit
hlt
.
seh_endproc
.
def
_exit
; .scl 2; .type 32; .endef /* standard C library function */
.
section
.
drectve
.
ascii
" -export:
\"
make_fcontext
\"
"
lib/context_switcher/asm/fcontext/make_x86_64_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ----------------------------------------------------------------------------------
; | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
; ----------------------------------------------------------------------------------
; | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
; ----------------------------------------------------------------------------------
; | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
; ----------------------------------------------------------------------------------
; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
; ----------------------------------------------------------------------------------
; | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc |
; ----------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
; ----------------------------------------------------------------------------------
; | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc |
; ----------------------------------------------------------------------------------
; | limit | base | R12 | R13 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
; ----------------------------------------------------------------------------------
; | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc |
; ----------------------------------------------------------------------------------
; | R14 | R15 | RDI | RSI |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
; ----------------------------------------------------------------------------------
; | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c |
; ----------------------------------------------------------------------------------
; | RBX | RBP | hidden | RIP |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
; ----------------------------------------------------------------------------------
; | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c |
; ----------------------------------------------------------------------------------
; | parameter area |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
; ----------------------------------------------------------------------------------
; | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c |
; ----------------------------------------------------------------------------------
; | FCTX | DATA | |
; ----------------------------------------------------------------------------------
; standard C library function
EXTERN
_exit
:
PROC
.
code
; generate function table entry in .pdata and unwind information in
make_fcontext
PROC
BOOST_CONTEXT_EXPORT
FRAME
; .xdata for a function's structured exception handling unwind behavior
.
endprolog
; first arg of make_fcontext() == top of context-stack
mov
rax
,
rcx
; shift address in RAX to lower 16 byte boundary
; == pointer to fcontext_t and address of context stack
and
rax
,
-
16
; reserve space for context-data on context-stack
; on context-function entry: (RSP -0x8) % 16 == 0
sub
rax
,
0150
h
; third arg of make_fcontext() == address of context-function
; stored in RBX
mov
[
rax
+
0100
h
]
,
r8
; first arg of make_fcontext() == top of context-stack
; save top address of context stack as 'base'
mov
[
rax
+
0
c8h
]
,
rcx
; second arg of make_fcontext() == size of context-stack
; negate stack size for LEA instruction (== substraction)
neg
rdx
; compute bottom address of context stack (limit)
lea
rcx
,
[
rcx
+
rdx
]
; save bottom address of context stack as 'limit'
mov
[
rax
+
0
c0h
]
,
rcx
; save address of context stack limit as 'dealloction stack'
mov
[
rax
+
0
b8h
]
,
rcx
; set fiber-storage to zero
xor
rcx
,
rcx
mov
[
rax
+
0
b0h
]
,
rcx
; save MMX control- and status-word
stmxcsr
[
rax
+
0
a0h
]
; save x87 control-word
fnstcw
[
rax
+
0
a4h
]
; compute address of transport_t
lea
rcx
,
[
rax
+
0140
h
]
; store address of transport_t in hidden field
mov
[
rax
+
0110
h
]
,
rcx
; compute abs address of label trampoline
lea
rcx
,
trampoline
; save address of trampoline as return-address for context-function
; will be entered after calling jump_fcontext() first time
mov
[
rax
+
0118
h
]
,
rcx
; compute abs address of label finish
lea
rcx
,
finish
; save address of finish as return-address for context-function in RBP
; will be entered after context-function returns
mov
[
rax
+
0108
h
]
,
rcx
ret
; return pointer to context-data
trampoline
:
; store return address on stack
; fix stack alignment
push
rbp
; jump to context-function
jmp
rbx
finish
:
; exit code is zero
xor
rcx
,
rcx
; exit application
call
_exit
hlt
make_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/make_x86_64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "make_x86_64_sysv_elf_gas.S"
.text
.globl make_fcontext
.type make_fcontext,@function
.align 16
make_fcontext:
/* first arg of make_fcontext() == top of context-stack */
movq %rdi, %rax
/* shift address in RAX to lower 16 byte boundary */
andq $-16, %rax
/* reserve space for context-data on context-stack */
/* on context-function entry: (RSP -0x8) % 16 == 0 */
leaq -0x40(%rax), %rax
/* third arg of make_fcontext() == address of context-function */
/* stored in RBX */
movq %rdx, 0x28(%rax)
/* save MMX control- and status-word */
stmxcsr (%rax)
/* save x87 control-word */
fnstcw 0x4(%rax)
/* compute abs address of label trampoline */
leaq trampoline(%rip), %rcx
/* save address of trampoline as return-address for context-function */
/* will be entered after calling jump_fcontext() first time */
movq %rcx, 0x38(%rax)
/* compute abs address of label finish */
leaq finish(%rip), %rcx
/* save address of finish as return-address for context-function */
/* will be entered after context-function returns */
movq %rcx, 0x30(%rax)
ret /* return pointer to context-data */
trampoline:
/* store return address on stack */
/* fix stack alignment */
push %rbp
/* jump to context-function */
jmp *%rbx
finish:
/* exit code is zero */
xorq %rdi, %rdi
/* exit application */
call _exit@PLT
hlt
.size make_fcontext,.-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/make_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _make_fcontext
.align 8
_make_fcontext:
/* first arg of make_fcontext() == top of context-stack */
movq %rdi, %rax
/* shift address in RAX to lower 16 byte boundary */
andq $-16, %rax
/* reserve space for context-data on context-stack */
/* on context-function entry: (RSP -0x8) % 16 == 0 */
leaq -0x40(%rax), %rax
/* third arg of make_fcontext() == address of context-function */
/* stored in RBX */
movq %rdx, 0x28(%rax)
/* save MMX control- and status-word */
stmxcsr (%rax)
/* save x87 control-word */
fnstcw 0x4(%rax)
/* compute abs address of label trampoline */
leaq trampoline(%rip), %rcx
/* save address of trampoline as return-address for context-function */
/* will be entered after calling jump_fcontext() first time */
movq %rcx, 0x38(%rax)
/* compute abs address of label finish */
leaq finish(%rip), %rcx
/* save address of finish as return-address for context-function */
/* will be entered after context-function returns */
movq %rcx, 0x30(%rax)
ret /* return pointer to context-data */
trampoline:
/* store return address on stack */
/* fix stack alignment */
push %rbp
/* jump to context-function */
jmp *%rbx
finish:
/* exit code is zero */
xorq %rdi, %rdi
/* exit application */
call __exit
hlt
lib/context_switcher/asm/fcontext/ontop_arm64_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "ontop_arm64_aapcs_elf_gas.S"
.text
.align 2
.global ontop_fcontext
.type ontop_fcontext, %function
ontop_fcontext:
# prepare stack for GP + FPU
sub sp, sp, #0xb0
# save d8 - d15
stp d8, d9, [sp, #0x00]
stp d10, d11, [sp, #0x10]
stp d12, d13, [sp, #0x20]
stp d14, d15, [sp, #0x30]
# save x19-x30
stp x19, x20, [sp, #0x40]
stp x21, x22, [sp, #0x50]
stp x23, x24, [sp, #0x60]
stp x25, x26, [sp, #0x70]
stp x27, x28, [sp, #0x80]
stp x29, x30, [sp, #0x90]
# save LR as PC
str x30, [sp, #0xa0]
# store RSP (pointing to context-data) in X5
mov x4, sp
# restore RSP (pointing to context-data) from X1
mov sp, x0
# load d8 - d15
ldp d8, d9, [sp, #0x00]
ldp d10, d11, [sp, #0x10]
ldp d12, d13, [sp, #0x20]
ldp d14, d15, [sp, #0x30]
# load x19-x30
ldp x19, x20, [sp, #0x40]
ldp x21, x22, [sp, #0x50]
ldp x23, x24, [sp, #0x60]
ldp x25, x26, [sp, #0x70]
ldp x27, x28, [sp, #0x80]
ldp x29, x30, [sp, #0x90]
# return transfer_t from jump
# pass transfer_t as first arg in context function
# X0 == FCTX, X1 == DATA
mov x0, x4
# skip pc
# restore stack from GP + FPU
add sp, sp, #0xb0
# jump to ontop-function
ret x2
.size ontop_fcontext,.-ontop_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_arm64_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Edward Nevill + Oliver Kowalke 2015
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| *
* ------------------------------------------------- *
* | d8 | d9 | d10 | d11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | d12 | d13 | d14 | d15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | x19 | x20 | x21 | x22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | x23 | x24 | x25 | x26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | x27 | x28 | FP | LR | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | | | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| | | *
* ------------------------------------------------- *
* | PC | align | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.global _ontop_fcontext
.balign 16
_ontop_fcontext:
; prepare stack for GP + FPU
sub sp, sp, #0xb0
; save d8 - d15
stp d8, d9, [sp, #0x00]
stp d10, d11, [sp, #0x10]
stp d12, d13, [sp, #0x20]
stp d14, d15, [sp, #0x30]
; save x19-x30
stp x19, x20, [sp, #0x40]
stp x21, x22, [sp, #0x50]
stp x23, x24, [sp, #0x60]
stp x25, x26, [sp, #0x70]
stp x27, x28, [sp, #0x80]
stp x29, x30, [sp, #0x90]
; save LR as PC
str x30, [sp, #0xa0]
; store RSP (pointing to context-data) in X5
mov x4, sp
; restore RSP (pointing to context-data) from X1
mov sp, x0
; load d8 - d15
ldp d8, d9, [sp, #0x00]
ldp d10, d11, [sp, #0x10]
ldp d12, d13, [sp, #0x20]
ldp d14, d15, [sp, #0x30]
; load x19-x30
ldp x19, x20, [sp, #0x40]
ldp x21, x22, [sp, #0x50]
ldp x23, x24, [sp, #0x60]
ldp x25, x26, [sp, #0x70]
ldp x27, x28, [sp, #0x80]
ldp x29, x30, [sp, #0x90]
; return transfer_t from jump
; pass transfer_t as first arg in context function
; X0 == FCTX, X1 == DATA
mov x0, x4
; skip pc
; restore stack from GP + FPU
add sp, sp, #0xb0
; jump to ontop-function
ret x2
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* |hiddn| v1 | v2 | v3 | v4 | v5 | v6 | v7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "ontop_arm_aapcs_elf_gas.S"
.text
.globl ontop_fcontext
.align 2
.type ontop_fcontext,%function
.syntax unified
ontop_fcontext:
@ save LR as PC
push {lr}
@ save hidden,V1-V8,LR
push {a1,v1-v8,lr}
@ prepare stack for FPU
sub sp, sp, #64
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ save S16-S31
vstmia sp, {d8-d15}
#endif
@ store RSP (pointing to context-data) in A1
mov a1, sp
@ restore RSP (pointing to context-data) from A2
mov sp, a2
@ store parent context in A2
mov a2, a1
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ restore S16-S31
vldmia sp, {d8-d15}
#endif
@ prepare stack for FPU
add sp, sp, #64
@ restore hidden,V1-V8,LR
pop {a1,v1-v8,lr}
@ return transfer_t from jump
str a2, [a1, #0]
str a3, [a1, #4]
@ pass transfer_t as first arg in context function
@ A1 == hidden, A2 == FCTX, A3 == DATA
@ skip PC
add sp, sp, #4
@ jump to ontop-function
bx a4
.size ontop_fcontext,.-ontop_fcontext
@ Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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| *
* ------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
* ------------------------------------------------- *
* | sjlj|hiddn| v1 | v2 | v3 | v4 | v5 | v6 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | v7 | v8 | lr | pc | FCTX| DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _ontop_fcontext
.align 2
_ontop_fcontext:
@ save LR as PC
push {lr}
@ save hidden,V1-V8,LR
push {a1,v1-v8,lr}
@ locate TLS to save/restore SjLj handler
mrc p15, 0, v2, c13, c0, #3
bic v2, v2, #3
@ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
ldr v1, [v2, #8]
@ save SjLj handler
push {v1}
@ prepare stack for FPU
sub sp, sp, #64
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ save S16-S31
vstmia sp, {d8-d15}
#endif
@ store RSP (pointing to context-data) in A1
mov a1, sp
@ restore RSP (pointing to context-data) from A2
mov sp, a2
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
@ restore S16-S31
vldmia sp, {d8-d15}
#endif
@ prepare stack for FPU
add sp, sp, #64
@ restore SjLj handler
pop {v1}
@ store SjLj handler in TLS
str v1, [v2, #8]
@ store parent context in A2
mov a2, a1
@ restore hidden,V1-V8,LR
pop {a1,v1-v8,lr}
@ return transfer_t from jump
str a2, [a1, #0]
str a3, [a1, #4]
@ pass transfer_t as first arg in context function
@ A1 == hidden, A2 == FCTX, A3 == DATA
@ skip PC
add sp, sp, #4
@ jump to ontop-function
bx a4
lib/context_switcher/asm/fcontext/ontop_arm_aapcs_pe_armasm.asm
0 → 100644
View file @
c25e6134
;/*
; Copyright Oliver Kowalke 2009.
; 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| *
; * ------------------------------------------------- *
; * |deall|limit| base|hiddn| v1 | v2 | v3 | v4 | *
; * ------------------------------------------------- *
; * ------------------------------------------------- *
; * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
; * ------------------------------------------------- *
; * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
; * ------------------------------------------------- *
; * | v5 | v6 | v7 | v8 | lr | pc | FCTX| DATA| *
; * ------------------------------------------------- *
; * *
; *******************************************************
AREA
|
.
text
|
,
CODE
ALIGN
4
EXPORT
ontop_fcontext
ontop_fcontext
PROC
; save LR as PC
push
{
lr
}
; save hidden,V1-V8,LR
push
{
a1
,
v1
-
v8
,
lr
}
; load TIB to save/restore thread size and limit.
; we do not need preserve CPU flag and can use it's arg register
mrc
p15
,
#
0
,
v1
,
c13
,
c0
,
#
2
; save current stack base
ldr
a1
,
[
v1
,
#
0x04
]
push
{
a1
}
; save current stack limit
ldr
a1
,
[
v1
,
#
0x08
]
push
{
a1
}
; save current deallocation stack
ldr
a1
,
[
v1
,
#
0xe0c
]
push
{
a1
}
; store RSP (pointing to context-data) in A1
mov
a1
,
sp
; restore RSP (pointing to context-data) from A2
mov
sp
,
a2
; restore stack base
pop
{
a1
}
str
a1
,
[
v1
,
#
0x04
]
; restore stack limit
pop
{
a1
}
str
a1
,
[
v1
,
#
0x08
]
; restore deallocation stack
pop
{
a1
}
str
a1
,
[
v1
,
#
0xe0c
]
; store parent context in A2
mov
a2
,
a1
; restore hidden,V1-V8,LR
pop
{
a1
,
v1
-
v8
,
lr
}
; return transfer_t from jump
str
a2
,
[
a1
,
#
0
]
str
a3
,
[
a1
,
#
4
]
; pass transfer_t as first arg in context function
; A1 == hidden, A2 == FCTX, A3 == DATA
; skip PC
add
sp
,
sp
,
#
4
; jump to ontop-function
bx
a4
ENDP
END
lib/context_switcher/asm/fcontext/ontop_combined_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "ontop_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "ontop_x86_64_sysv_macho_gas.S"
#elif defined(__ppc__)
#include "ontop_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "ontop_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/ontop_i386_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
---------------------------------------------------------------------------------
*
*
|
0
h
|
04
h
|
08
h
|
0
ch
|
010
h
|
014
h
|
018
h
|
01
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
fc_strg
|
fc_deallo
|
limit
|
base
|
fc_seh
|
EDI
|
*
*
---------------------------------------------------------------------------------
*
*
---------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
---------------------------------------------------------------------------------
*
*
|
020
h
|
024
h
|
028
h
|
02
ch
|
030
h
|
034
h
|
038
h
|
03
ch
|
*
*
---------------------------------------------------------------------------------
*
*
|
ESI
|
EBX
|
EBP
|
EIP
|
to
|
data
|
EH
NXT
|
SEH
HNDLR
|
*
*
---------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"ontop_i386_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
/*
mark
as
using
no
unregistered
SEH
handlers
*/
.
globl
@
feat
.
00
.
def
@
feat
.
00
; .scl 3; .type 0; .endef
.
set
@
feat
.
00
,
1
.
globl
_ontop_fcontext
.
def
_ontop_fcontext
; .scl 2; .type 32; .endef
_ontop_fcontext
:
/*
prepare
stack
*/
leal
-
0x2c
(
%
esp
),
%
esp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
save
MMX
control
-
and
status
-
word
*/
stmxcsr
(
%
esp
)
/*
save
x87
control
-
word
*/
fnstcw
0x4
(
%
esp
)
#
endif
/*
load
NT_TIB
*/
movl
%
fs
:
(
0x18
),
%
edx
/*
load
fiber
local
storage
*/
movl
0x10
(
%
edx
),
%
eax
movl
%
eax
,
0x8
(
%
esp
)
/*
load
current
dealloction
stack
*/
movl
0xe0c
(
%
edx
),
%
eax
movl
%
eax
,
0xc
(
%
esp
)
/*
load
current
stack
limit
*/
movl
0x8
(
%
edx
),
%
eax
movl
%
eax
,
0x10
(
%
esp
)
/*
load
current
stack
base
*/
movl
0x4
(
%
edx
),
%
eax
movl
%
eax
,
0x14
(
%
esp
)
/*
load
current
SEH
exception
list
*/
movl
(
%
edx
),
%
eax
movl
%
eax
,
0x18
(
%
esp
)
movl
%
edi
,
0x1c
(
%
esp
)
/*
save
EDI
*/
movl
%
esi
,
0x20
(
%
esp
)
/*
save
ESI
*/
movl
%
ebx
,
0x24
(
%
esp
)
/*
save
EBX
*/
movl
%
ebp
,
0x28
(
%
esp
)
/*
save
EBP
*/
/*
store
ESP
(
pointing
to
context
-
data
)
in
ECX
*/
movl
%
esp
,
%
ecx
/*
first
arg
of
ontop_fcontext
()
==
fcontext
to
jump
to
*/
movl
0x30
(
%
esp
),
%
eax
/*
pass
parent
fcontext_t
*/
movl
%
ecx
,
0x30
(
%
eax
)
/*
second
arg
of
ontop_fcontext
()
==
data
to
be
transferred
*/
movl
0x34
(
%
esp
),
%
ecx
/*
pass
data
*/
movl
%
ecx
,
0x34
(
%
eax
)
/*
third
arg
of
ontop_fcontext
()
==
ontop
-
function
*/
movl
0x38
(
%
esp
),
%
ecx
/*
restore
ESP
(
pointing
to
context
-
data
)
from
EDX
*/
movl
%
eax
,
%
esp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
restore
MMX
control
-
and
status
-
word
*/
ldmxcsr
(
%
esp
)
/*
restore
x87
control
-
word
*/
fldcw
0x4
(
%
esp
)
#
endif
/*
restore
NT_TIB
into
EDX
*/
movl
%
fs
:
(
0x18
),
%
edx
/*
restore
fiber
local
storage
*/
movl
0x8
(
%
esp
),
%
eax
movl
%
eax
,
0x10
(
%
edx
)
/*
restore
current
deallocation
stack
*/
movl
0xc
(
%
esp
),
%
eax
movl
%
eax
,
0xe0c
(
%
edx
)
/*
restore
current
stack
limit
*/
movl
0x10
(
%
esp
),
%
eax
movl
%
eax
,
0x08
(
%
edx
)
/*
restore
current
stack
base
*/
movl
0x14
(
%
esp
),
%
eax
movl
%
eax
,
0x04
(
%
edx
)
/*
restore
current
SEH
exception
list
*/
movl
0x18
(
%
esp
),
%
eax
movl
%
eax
,
(
%
edx
)
movl
0x1c
(
%
esp
),
%
edi
/*
restore
EDI
*/
movl
0x20
(
%
esp
),
%
esi
/*
restore
ESI
*/
movl
0x24
(
%
esp
),
%
ebx
/*
restore
EBX
*/
movl
0x28
(
%
esp
),
%
ebp
/*
restore
EBP
*/
/*
prepare
stack
*/
leal
0x2c
(
%
esp
),
%
esp
/*
keep
return
-
address
on
stack
*/
/*
jump
to
context
*/
jmp
*
%
ecx
.
section
.
drectve
.
ascii
" -export:
\"
_ontop_fcontext
\"
"
lib/context_switcher/asm/fcontext/ontop_i386_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ---------------------------------------------------------------------------------
; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
; ---------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
; ---------------------------------------------------------------------------------
; ---------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ---------------------------------------------------------------------------------
; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
; ---------------------------------------------------------------------------------
; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
; ---------------------------------------------------------------------------------
.
386
.
XMM
.
model
flat
,
c
.
code
ontop_fcontext
PROC
BOOST_CONTEXT_EXPORT
; prepare stack
lea
esp
,
[
esp
-
02
ch
]
IFNDEF
BOOST_USE_TSX
; save MMX control- and status-word
stmxcsr
[esp]
; save x87 control-word
fnstcw
[
esp
+
04
h
]
ENDIF
assume
fs
:
nothing
; load NT_TIB into ECX
mov
edx
,
fs
:
[018h]
assume
fs
:
error
; load fiber local storage
mov
eax
,
[
edx
+
010
h
]
mov
[
esp
+
08
h
]
,
eax
; load current deallocation stack
mov
eax
,
[
edx
+
0
e0ch
]
mov
[
esp
+
0
ch
]
,
eax
; load current stack limit
mov
eax
,
[
edx
+
08
h
]
mov
[
esp
+
010
h
]
,
eax
; load current stack base
mov
eax
,
[
edx
+
04
h
]
mov
[
esp
+
014
h
]
,
eax
; load current SEH exception list
mov
eax
,
[edx]
mov
[
esp
+
018
h
]
,
eax
mov
[
esp
+
01
ch
]
,
edi
; save EDI
mov
[
esp
+
020
h
]
,
esi
; save ESI
mov
[
esp
+
024
h
]
,
ebx
; save EBX
mov
[
esp
+
028
h
]
,
ebp
; save EBP
; store ESP (pointing to context-data) in ECX
mov
ecx
,
esp
; first arg of ontop_fcontext() == fcontext to jump to
mov
eax
,
[
esp
+
030
h
]
; pass parent fcontext_t
mov
[
eax
+
030
h
]
,
ecx
; second arg of ontop_fcontext() == data to be transferred
mov
ecx
,
[
esp
+
034
h
]
; pass data
mov
[
eax
+
034
h
]
,
ecx
; third arg of ontop_fcontext() == ontop-function
mov
ecx
,
[
esp
+
038
h
]
; restore ESP (pointing to context-data) from EAX
mov
esp
,
eax
IFNDEF
BOOST_USE_TSX
; restore MMX control- and status-word
ldmxcsr
[esp]
; restore x87 control-word
fldcw
[
esp
+
04
h
]
ENDIF
assume
fs
:
nothing
; load NT_TIB into EDX
mov
edx
,
fs
:
[018h]
assume
fs
:
error
; restore fiber local storage
mov
eax
,
[
esp
+
08
h
]
mov
[
edx
+
010
h
]
,
eax
; restore current deallocation stack
mov
eax
,
[
esp
+
0
ch
]
mov
[
edx
+
0
e0ch
]
,
eax
; restore current stack limit
mov
eax
,
[
esp
+
010
h
]
mov
[
edx
+
08
h
]
,
eax
; restore current stack base
mov
eax
,
[
esp
+
014
h
]
mov
[
edx
+
04
h
]
,
eax
; restore current SEH exception list
mov
eax
,
[
esp
+
018
h
]
mov
[edx],
eax
mov
edi
,
[
esp
+
01
ch
]
; restore EDI
mov
esi
,
[
esp
+
020
h
]
; restore ESI
mov
ebx
,
[
esp
+
024
h
]
; restore EBX
mov
ebp
,
[
esp
+
028
h
]
; restore EBP
; prepare stack
lea
esp
,
[
esp
+
02
ch
]
; keep return-address on stack
; jump to context
jmp
ecx
ontop_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/ontop_i386_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | | *
* ---------------------------------------------------------------------------------- *
* | to | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "ontop_i386_sysv_elf_gas.S"
.text
.globl ontop_fcontext
.align 2
.type ontop_fcontext,@function
ontop_fcontext:
leal -0x18(%esp), %esp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%esp) /* save MMX control- and status-word */
fnstcw 0x4(%esp) /* save x87 control-word */
#endif
movl %edi, 0x8(%esp) /* save EDI */
movl %esi, 0xc(%esp) /* save ESI */
movl %ebx, 0x10(%esp) /* save EBX */
movl %ebp, 0x14(%esp) /* save EBP */
/* store ESP (pointing to context-data) in ECX */
movl %esp, %ecx
/* first arg of ontop_fcontext() == fcontext to jump to */
movl 0x20(%esp), %eax
/* pass parent fcontext_t */
movl %ecx, 0x20(%eax)
/* second arg of ontop_fcontext() == data to be transferred */
movl 0x24(%esp), %ecx
/* pass data */
movl %ecx, 0x24(%eax)
/* third arg of ontop_fcontext() == ontop-function */
movl 0x28(%esp), %ecx
/* restore ESP (pointing to context-data) from EAX */
movl %eax, %esp
/* address of returned transport_t */
movl 0x1c(%esp), %eax
/* return parent fcontext_t */
movl %ecx, (%eax)
/* return data */
movl %edx, 0x4(%eax)
#if !defined(BOOST_USE_TSX)
ldmxcsr (%esp) /* restore MMX control- and status-word */
fldcw 0x4(%esp) /* restore x87 control-word */
#endif
movl 0x8(%esp), %edi /* restore EDI */
movl 0xc(%esp), %esi /* restore ESI */
movl 0x10(%esp), %ebx /* restore EBX */
movl 0x14(%esp), %ebp /* restore EBP */
leal 0x18(%esp), %esp /* prepare stack */
/* jump to context */
jmp *%ecx
.size ontop_fcontext,.-ontop_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_i386_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | to | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | | *
* ---------------------------------------------------------------------------------- *
* | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _ontop_fcontext
.align 2
_ontop_fcontext:
leal -0x18(%esp), %esp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%esp) /* save MMX control- and status-word */
fnstcw 0x4(%esp) /* save x87 control-word */
#endif
movl %edi, 0x8(%esp) /* save EDI */
movl %esi, 0xc(%esp) /* save ESI */
movl %ebx, 0x10(%esp) /* save EBX */
movl %ebp, 0x14(%esp) /* save EBP */
/* store ESP (pointing to context-data) in ECX */
movl %esp, %ecx
/* first arg of ontop_fcontext() == fcontext to jump to */
movl 0x1c(%esp), %eax
/* pass parent fcontext_t */
movl %ecx, 0x1c(%eax)
/* second arg of ontop_fcontext() == data to be transferred */
movl 0x20(%esp), %ecx
/* pass data */
movl %ecx, 0x20(%eax)
/* third arg of ontop_fcontext() == ontop-function */
movl 0x24(%esp), %ecx
/* restore ESP (pointing to context-data) from EAX */
movl %eax, %esp
/* return parent fcontext_t */
movl %ecx, %eax
/* returned data is stored in EDX */
#if !defined(BOOST_USE_TSX)
ldmxcsr (%esp) /* restore MMX control- and status-word */
fldcw 0x4(%esp) /* restore x87 control-word */
#endif
movl 0x8(%esp), %edi /* restore EDI */
movl 0xc(%esp), %esi /* restore ESI */
movl 0x10(%esp), %ebx /* restore EBX */
movl 0x14(%esp), %ebp /* restore EBP */
leal 0x18(%esp), %esp /* prepare stack */
/* jump to context */
jmp *%ecx
lib/context_switcher/asm/fcontext/ontop_i386_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__i386__)
#include "ontop_i386_sysv_macho_gas.S"
#elif defined(__x86_64__)
#include "ontop_x86_64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/ontop_mips32_o32_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F20 | F22 | F24 | F26 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F28 | F30 | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | ABI ARGS | GP | FCTX| DATA| | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "ontop_mips32_o32_elf_gas.S"
.text
.globl ontop_fcontext
.align 2
.type ontop_fcontext,@function
.ent ontop_fcontext
ontop_fcontext:
# reserve space on stack
addiu $sp, $sp, -96
sw $s0, 48($sp) # save S0
sw $s1, 52($sp) # save S1
sw $s2, 56($sp) # save S2
sw $s3, 60($sp) # save S3
sw $s4, 64($sp) # save S4
sw $s5, 68($sp) # save S5
sw $s6, 72($sp) # save S6
sw $s7, 76($sp) # save S7
sw $fp, 80($sp) # save FP
sw $a0, 84($sp) # save hidden, address of returned transfer_t
sw $ra, 88($sp) # save RA
sw $ra, 92($sp) # save RA as PC
#if defined(__mips_hard_float)
s.d $f20, ($sp) # save F20
s.d $f22, 8($sp) # save F22
s.d $f24, 16($sp) # save F24
s.d $f26, 24($sp) # save F26
s.d $f28, 32($sp) # save F28
s.d $f30, 40($sp) # save F30
#endif
# store SP (pointing to context-data) in A0
move $a0, $sp
# restore SP (pointing to context-data) from A1
move $sp, $a1
#if defined(__mips_hard_float)
l.d $f20, ($sp) # restore F20
l.d $f22, 8($sp) # restore F22
l.d $f24, 16($sp) # restore F24
l.d $f26, 24($sp) # restore F26
l.d $f28, 32($sp) # restore F28
l.d $f30, 40($sp) # restore F30
#endif
lw $s0, 48($sp) # restore S0
lw $s1, 52($sp) # restore S1
lw $s2, 56($sp) # restore S2
lw $s3, 60($sp) # restore S3
lw $s4, 64($sp) # restore S4
lw $s5, 68($sp) # restore S5
lw $s6, 72($sp) # restore S6
lw $s7, 76($sp) # restore S7
lw $fp, 80($sp) # restore FP
lw $v0, 84($sp) # restore hidden, address of returned transfer_t
lw $ra, 88($sp) # restore RA
# load PC
move $t9, $a3
# adjust stack
addiu $sp, $sp, 96
# return transfer_t from jump
sw $a0, ($v0) # fctx of transfer_t
sw $a2, 4($v0) # data of transfer_t
# pass transfer_t as first arg in context function
# A0 == hidden, A1 == fctx, A2 == data
move $a1, $a0
move $a0, $v0
# jump to context
jr $t9
.end ontop_fcontext
.size ontop_fcontext, .-ontop_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_mips64_n64_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Jiaxun Yang 2018.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE
*/
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | F24 | F25 | F26 | F27 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | F28 | F29 | F30 | F31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | S0 | S1 | S2 | S3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | S4 | S5 | S6 | S7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | FP | GP | RA | PC | *
* ------------------------------------------------- *
* *
* *****************************************************/
.file "ontop_mips64_n64_elf_gas.S"
.text
.globl ontop_fcontext
.align 3
.type ontop_fcontext,@function
.ent ontop_fcontext
ontop_fcontext:
# reserve space on stack
daddiu $sp, $sp, -160
sd $s0, 64($sp) # save S0
sd $s1, 72($sp) # save S1
sd $s2, 80($sp) # save S2
sd $s3, 88($sp) # save S3
sd $s4, 96($sp) # save S4
sd $s5, 104($sp) # save S5
sd $s6, 112($sp) # save S6
sd $s7, 120($sp) # save S7
sd $fp, 128($sp) # save FP
sd $ra, 144($sp) # save RA
sd $ra, 152($sp) # save RA as PC
s.d $f24, 0($sp) # save F24
s.d $f25, 8($sp) # save F25
s.d $f26, 16($sp) # save F26
s.d $f27, 24($sp) # save F27
s.d $f28, 32($sp) # save F28
s.d $f29, 40($sp) # save F29
s.d $f30, 48($sp) # save F30
s.d $f31, 56($sp) # save F31
# store SP (pointing to context-data) in t0
move $t0, $sp
# restore SP (pointing to context-data) from a0
move $sp, $a0
l.d $f24, 0($sp) # restore F24
l.d $f25, 8($sp) # restore F25
l.d $f26, 16($sp) # restore F26
l.d $f27, 24($sp) # restore F27
l.d $f28, 32($sp) # restore F28
l.d $f29, 40($sp) # restore F29
l.d $f30, 48($sp) # restore F30
l.d $f31, 56($sp) # restore F31
ld $s0, 64($sp) # restore S0
ld $s1, 72($sp) # restore S1
ld $s2, 80($sp) # restore S2
ld $s3, 88($sp) # restore S3
ld $s4, 96($sp) # restore S4
ld $s5, 104($sp) # restore S5
ld $s6, 112($sp) # restore S6
ld $s7, 120($sp) # restore S7
ld $fp, 128($sp) # restore FP
ld $ra, 144($sp) # restore RA
# load PC
move $t9, $a2
# adjust stack
daddiu $sp, $sp, 160
move $a0, $t0 # move param from t0 to a0 as param
# jump to context
jr $t9
.end ontop_fcontext
.size ontop_fcontext, .-ontop_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_ppc32_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Sergue E. Leontiev 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)
*/
// Stub file for universal binary
#if defined(__ppc__)
#include "ontop_ppc32_sysv_macho_gas.S"
#elif defined(__ppc64__)
#include "ontop_ppc64_sysv_macho_gas.S"
#else
#error "No arch's"
#endif
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------|------------ *
* | 224 | 228 | 232 | 236 | 240 | 244 | *
* ------------------------|------------ *
* | F30 | F31 |bchai| LR | *
* ------------------------|------------ *
* *
*******************************************************/
.file "ontop_ppc32_sysv_elf_gas.S"
.text
.globl ontop_fcontext
.align 2
.type ontop_fcontext,@function
ontop_fcontext:
# Linux: ontop_fcontext( hidden transfer_t * R3, R4, R5, R6)
# Other: transfer_t R3:R4 = jump_fcontext( R3, R4, R5)
mflr %r0 # return address from LR
mffs %f0 # FPSCR
mfcr %r8 # condition register
stwu %r1, -240(%r1) # allocate stack space, R1 % 16 == 0
stw %r0, 244(%r1) # save LR in caller's frame
#ifdef __linux__
stw %r3, 4(%r1) # hidden pointer
#endif
stfd %f0, 8(%r1) # FPSCR
stw %r0, 16(%r1) # LR as PC
stw %r8, 20(%r1) # CR
# Save registers R14 to R31.
# Don't change R2, the thread-local storage pointer.
# Don't change R13, the small data pointer.
stw %r14, 24(%r1)
stw %r15, 28(%r1)
stw %r16, 32(%r1)
stw %r17, 36(%r1)
stw %r18, 40(%r1)
stw %r19, 44(%r1)
stw %r20, 48(%r1)
stw %r21, 52(%r1)
stw %r22, 56(%r1)
stw %r23, 60(%r1)
stw %r24, 64(%r1)
stw %r25, 68(%r1)
stw %r26, 72(%r1)
stw %r27, 76(%r1)
stw %r28, 80(%r1)
stw %r29, 84(%r1)
stw %r30, 88(%r1)
stw %r31, 92(%r1)
# Save registers F14 to F31 in slots with 8-byte alignment.
# 4-byte alignment may stall the pipeline of some processors.
# Less than 4 may cause alignment traps.
stfd %f14, 96(%r1)
stfd %f15, 104(%r1)
stfd %f16, 112(%r1)
stfd %f17, 120(%r1)
stfd %f18, 128(%r1)
stfd %f19, 136(%r1)
stfd %f20, 144(%r1)
stfd %f21, 152(%r1)
stfd %f22, 160(%r1)
stfd %f23, 168(%r1)
stfd %f24, 176(%r1)
stfd %f25, 184(%r1)
stfd %f26, 192(%r1)
stfd %f27, 200(%r1)
stfd %f28, 208(%r1)
stfd %f29, 216(%r1)
stfd %f30, 224(%r1)
stfd %f31, 232(%r1)
# store RSP (pointing to context-data) in R7/R6
# restore RSP (pointing to context-data) from R4/R3
#ifdef __linux__
mr %r7, %r1
mr %r1, %r4
lwz %r3, 4(%r1) # hidden pointer
#else
mr %r6, %r1
mr %r1, %r3
#endif
# ignore PC at 16(%r1)
lfd %f0, 8(%r1) # FPSCR
lwz %r8, 20(%r1) # CR
mtfsf 0xff, %f0 # restore FPSCR
mtcr %r8 # restore CR
# restore R14 to R31
lwz %r14, 24(%r1)
lwz %r15, 28(%r1)
lwz %r16, 32(%r1)
lwz %r17, 36(%r1)
lwz %r18, 40(%r1)
lwz %r19, 44(%r1)
lwz %r20, 48(%r1)
lwz %r21, 52(%r1)
lwz %r22, 56(%r1)
lwz %r23, 60(%r1)
lwz %r24, 64(%r1)
lwz %r25, 68(%r1)
lwz %r26, 72(%r1)
lwz %r27, 76(%r1)
lwz %r28, 80(%r1)
lwz %r29, 84(%r1)
lwz %r30, 88(%r1)
lwz %r31, 92(%r1)
# restore F14 to F31
lfd %f14, 96(%r1)
lfd %f15, 104(%r1)
lfd %f16, 112(%r1)
lfd %f17, 120(%r1)
lfd %f18, 128(%r1)
lfd %f19, 136(%r1)
lfd %f20, 144(%r1)
lfd %f21, 152(%r1)
lfd %f22, 160(%r1)
lfd %f23, 168(%r1)
lfd %f24, 176(%r1)
lfd %f25, 184(%r1)
lfd %f26, 192(%r1)
lfd %f27, 200(%r1)
lfd %f28, 208(%r1)
lfd %f29, 216(%r1)
lfd %f30, 224(%r1)
lfd %f31, 232(%r1)
# restore LR from caller's frame
lwz %r0, 244(%r1)
mtlr %r0
# adjust stack
addi %r1, %r1, 240
# see tail_ppc32_sysv_elf_gas.cpp
# Linux: fcontext_ontop_tail( hidden transfer_t * R3, R4, R5, R6, R7)
# Other: transfer_t R3:R4 = fcontext_ontop_tail( R3, R4, R5, R6)
b ontop_fcontext_tail
.size ontop_fcontext, .-ontop_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.globl _ontop_fcontext
.align 2
_ontop_fcontext:
# reserve space on stack
subi r1, r1, 244
stfd f14, 0(r1) # save F14
stfd f15, 8(r1) # save F15
stfd f16, 16(r1) # save F16
stfd f17, 24(r1) # save F17
stfd f18, 32(r1) # save F18
stfd f19, 40(r1) # save F19
stfd f20, 48(r1) # save F20
stfd f21, 56(r1) # save F21
stfd f22, 64(r1) # save F22
stfd f23, 72(r1) # save F23
stfd f24, 80(r1) # save F24
stfd f25, 88(r1) # save F25
stfd f26, 96(r1) # save F26
stfd f27, 104(r1) # save F27
stfd f28, 112(r1) # save F28
stfd f29, 120(r1) # save F29
stfd f30, 128(r1) # save F30
stfd f31, 136(r1) # save F31
mffs f0 # load FPSCR
stfd f0, 144(r1) # save FPSCR
stw r13, 152(r1) # save R13
stw r14, 156(r1) # save R14
stw r15, 160(r1) # save R15
stw r16, 164(r1) # save R16
stw r17, 168(r1) # save R17
stw r18, 172(r1) # save R18
stw r19, 176(r1) # save R19
stw r20, 180(r1) # save R20
stw r21, 184(r1) # save R21
stw r22, 188(r1) # save R22
stw r23, 192(r1) # save R23
stw r24, 196(r1) # save R24
stw r25, 200(r1) # save R25
stw r26, 204(r1) # save R26
stw r27, 208(r1) # save R27
stw r28, 212(r1) # save R28
stw r29, 216(r1) # save R29
stw r30, 220(r1) # save R30
stw r31, 224(r1) # save R31
stw r3, 228(r1) # save hidden
# save CR
mfcr r0
stw r0, 232(r1)
# save LR
mflr r0
stw r0, 236(r1)
# save LR as PC
stw r0, 240(r1)
# store RSP (pointing to context-data) in R7
mr r7, r1
# restore RSP (pointing to context-data) from R4
mr r1, r4
lfd f14, 0(r1) # restore F14
lfd f15, 8(r1) # restore F15
lfd f16, 16(r1) # restore F16
lfd f17, 24(r1) # restore F17
lfd f18, 32(r1) # restore F18
lfd f19, 40(r1) # restore F19
lfd f20, 48(r1) # restore F20
lfd f21, 56(r1) # restore F21
lfd f22, 64(r1) # restore F22
lfd f23, 72(r1) # restore F23
lfd f24, 80(r1) # restore F24
lfd f25, 88(r1) # restore F25
lfd f26, 96(r1) # restore F26
lfd f27, 104(r1) # restore F27
lfd f28, 112(r1) # restore F28
lfd f29, 120(r1) # restore F29
lfd f30, 128(r1) # restore F30
lfd f31, 136(r1) # restore F31
lfd f0, 144(r1) # load FPSCR
mtfsf 0xff, f0 # restore FPSCR
lwz r13, 152(r1) # restore R13
lwz r14, 156(r1) # restore R14
lwz r15, 160(r1) # restore R15
lwz r16, 164(r1) # restore R16
lwz r17, 168(r1) # restore R17
lwz r18, 172(r1) # restore R18
lwz r19, 176(r1) # restore R19
lwz r20, 180(r1) # restore R20
lwz r21, 184(r1) # restore R21
lwz r22, 188(r1) # restore R22
lwz r23, 192(r1) # restore R23
lwz r24, 196(r1) # restore R24
lwz r25, 200(r1) # restore R25
lwz r26, 204(r1) # restore R26
lwz r27, 208(r1) # restore R27
lwz r28, 212(r1) # restore R28
lwz r29, 216(r1) # restore R29
lwz r30, 220(r1) # restore R30
lwz r31, 224(r1) # restore R31
lwz r4, 228(r1) # restore hidden
# restore CR
lwz r0, 232(r1)
mtcr r0
# restore LR
lwz r0, 236(r1)
mtlr r0
# ignore PC
# adjust stack
addi r1, r1, 244
# return transfer_t
stw r7, 0(r4)
stw r5, 4(r4)
# restore CTR
mtctr r6
# jump to ontop-function
bctr
lib/context_switcher/asm/fcontext/ontop_ppc32_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | F14 | F15 | F16 | F17 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | F18 | F19 | F20 | F21 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | F22 | F23 | F24 | F25 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | F26 | F27 | F28 | F29 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | F30 | F31 | fpscr | R13 | R14 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 64 | | *
* ------------------------------------------------- *
* | 256 | | *
* ------------------------------------------------- *
* | DATA| | *
* ------------------------------------------------- *
* *
*******************************************************/
.globl .ontop_fcontext
.globl ontop_fcontext[DS]
.align 2
.csect ontop_fcontext[DS]
ontop_fcontext:
.long .ontop_fcontext
.ontop_fcontext:
# reserve space on stack
subi r1, r1, 244
stfd f14, 0(r1) # save F14
stfd f15, 8(r1) # save F15
stfd f16, 16(r1) # save F16
stfd f17, 24(r1) # save F17
stfd f18, 32(r1) # save F18
stfd f19, 40(r1) # save F19
stfd f20, 48(r1) # save F20
stfd f21, 56(r1) # save F21
stfd f22, 64(r1) # save F22
stfd f23, 72(r1) # save F23
stfd f24, 80(r1) # save F24
stfd f25, 88(r1) # save F25
stfd f26, 96(r1) # save F26
stfd f27, 104(r1) # save F27
stfd f28, 112(r1) # save F28
stfd f29, 120(r1) # save F29
stfd f30, 128(r1) # save F30
stfd f31, 136(r1) # save F31
mffs f0 # load FPSCR
stfd f0, 144(r1) # save FPSCR
stw r13, 152(r1) # save R13
stw r14, 156(r1) # save R14
stw r15, 160(r1) # save R15
stw r16, 164(r1) # save R16
stw r17, 168(r1) # save R17
stw r18, 172(r1) # save R18
stw r19, 176(r1) # save R19
stw r20, 180(r1) # save R20
stw r21, 184(r1) # save R21
stw r22, 188(r1) # save R22
stw r23, 192(r1) # save R23
stw r24, 196(r1) # save R24
stw r25, 200(r1) # save R25
stw r26, 204(r1) # save R26
stw r27, 208(r1) # save R27
stw r28, 212(r1) # save R28
stw r29, 216(r1) # save R29
stw r30, 220(r1) # save R30
stw r31, 224(r1) # save R31
stw r3, 228(r1) # save hidden
# save CR
mfcr r0
stw r0, 232(r1)
# save LR
mflr r0
stw r0, 236(r1)
# save LR as PC
stw r0, 240(r1)
# store RSP (pointing to context-data) in R7
mr r7, r1
# restore RSP (pointing to context-data) from R4
mr r1, r4
lfd f14, 0(r1) # restore F14
lfd f15, 8(r1) # restore F15
lfd f16, 16(r1) # restore F16
lfd f17, 24(r1) # restore F17
lfd f18, 32(r1) # restore F18
lfd f19, 40(r1) # restore F19
lfd f20, 48(r1) # restore F20
lfd f21, 56(r1) # restore F21
lfd f22, 64(r1) # restore F22
lfd f23, 72(r1) # restore F23
lfd f24, 80(r1) # restore F24
lfd f25, 88(r1) # restore F25
lfd f26, 96(r1) # restore F26
lfd f27, 104(r1) # restore F27
lfd f28, 112(r1) # restore F28
lfd f29, 120(r1) # restore F29
lfd f30, 128(r1) # restore F30
lfd f31, 136(r1) # restore F31
lfd f0, 144(r1) # load FPSCR
mtfsf 0xff, f0 # restore FPSCR
lwz r13, 152(r1) # restore R13
lwz r14, 156(r1) # restore R14
lwz r15, 160(r1) # restore R15
lwz r16, 164(r1) # restore R16
lwz r17, 168(r1) # restore R17
lwz r18, 172(r1) # restore R18
lwz r19, 176(r1) # restore R19
lwz r20, 180(r1) # restore R20
lwz r21, 184(r1) # restore R21
lwz r22, 188(r1) # restore R22
lwz r23, 192(r1) # restore R23
lwz r24, 196(r1) # restore R24
lwz r25, 200(r1) # restore R25
lwz r26, 204(r1) # restore R26
lwz r27, 208(r1) # restore R27
lwz r28, 212(r1) # restore R28
lwz r29, 216(r1) # restore R29
lwz r30, 220(r1) # restore R30
lwz r31, 224(r1) # restore R31
lwz r4, 228(r1) # restore hidden
# restore CR
lwz r0, 232(r1)
mtcr r0
# restore LR
lwz r0, 236(r1)
mtlr r0
# ignore PC
# adjust stack
addi r1, r1, 244
# return transfer_t
stw r7, 0(r4)
stw r5, 4(r4)
# restore CTR
mtctr r6
# jump to ontop-function
bctr
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "ontop_ppc64_sysv_elf_gas.S"
.globl ontop_fcontext
#if _CALL_ELF == 2
.text
.align 2
ontop_fcontext:
addis %r2, %r12, .TOC.-ontop_fcontext@ha
addi %r2, %r2, .TOC.-ontop_fcontext@l
.localentry ontop_fcontext, . - ontop_fcontext
#else
.section ".opd","aw"
.align 3
ontop_fcontext:
# ifdef _CALL_LINUX
.quad .L.ontop_fcontext,.TOC.@tocbase,0
.type ontop_fcontext,@function
.text
.align 2
.L.ontop_fcontext:
# else
.hidden .ontop_fcontext
.globl .ontop_fcontext
.quad .ontop_fcontext,.TOC.@tocbase,0
.size ontop_fcontext,24
.type .ontop_fcontext,@function
.text
.align 2
.ontop_fcontext:
# endif
#endif
# reserve space on stack
subi %r1, %r1, 184
#if _CALL_ELF != 2
std %r2, 0(%r1) # save TOC
#endif
std %r14, 8(%r1) # save R14
std %r15, 16(%r1) # save R15
std %r16, 24(%r1) # save R16
std %r17, 32(%r1) # save R17
std %r18, 40(%r1) # save R18
std %r19, 48(%r1) # save R19
std %r20, 56(%r1) # save R20
std %r21, 64(%r1) # save R21
std %r22, 72(%r1) # save R22
std %r23, 80(%r1) # save R23
std %r24, 88(%r1) # save R24
std %r25, 96(%r1) # save R25
std %r26, 104(%r1) # save R26
std %r27, 112(%r1) # save R27
std %r28, 120(%r1) # save R28
std %r29, 128(%r1) # save R29
std %r30, 136(%r1) # save R30
std %r31, 144(%r1) # save R31
#if _CALL_ELF != 2
std %r3, 152(%r1) # save hidden
#endif
# save CR
mfcr %r0
std %r0, 160(%r1)
# save LR
mflr %r0
std %r0, 168(%r1)
# save LR as PC
std %r0, 176(%r1)
# store RSP (pointing to context-data) in R7
mr %r7, %r1
#if _CALL_ELF == 2
# restore RSP (pointing to context-data) from R3
mr %r1, %r3
#else
# restore RSP (pointing to context-data) from R4
mr %r1, %r4
#endif
ld %r14, 8(%r1) # restore R14
ld %r15, 16(%r1) # restore R15
ld %r16, 24(%r1) # restore R16
ld %r17, 32(%r1) # restore R17
ld %r18, 40(%r1) # restore R18
ld %r19, 48(%r1) # restore R19
ld %r20, 56(%r1) # restore R20
ld %r21, 64(%r1) # restore R21
ld %r22, 72(%r1) # restore R22
ld %r23, 80(%r1) # restore R23
ld %r24, 88(%r1) # restore R24
ld %r25, 96(%r1) # restore R25
ld %r26, 104(%r1) # restore R26
ld %r27, 112(%r1) # restore R27
ld %r28, 120(%r1) # restore R28
ld %r29, 128(%r1) # restore R29
ld %r30, 136(%r1) # restore R30
ld %r31, 144(%r1) # restore R31
#if _CALL_ELF != 2
ld %r3, 152(%r1) # restore hidden
#endif
# restore CR
ld %r0, 160(%r1)
mtcr %r0
#if _CALL_ELF == 2
# restore CTR
mtctr %r5
# store cb entrypoint in %r12, used for TOC calculation
mr %r12, %r5
# copy transfer_t into ontop_fn arg registers
mr %r3, %r7
# arg pointer already in %r4
#else
# copy transfer_t into ontop_fn arg registers
mr %r4, %r7
# arg pointer already in %r5
# hidden arg already in %r3
# restore CTR
ld %r7, 0(%r6)
mtctr %r7
# restore TOC
ld %r2, 8(%r6)
# zero in r3 indicates first jump to context-function
cmpdi %r3, 0
beq use_entry_arg
#endif
return_to_ctx:
# restore LR
ld %r0, 168(%r1)
mtlr %r0
# adjust stack
addi %r1, %r1, 184
# jump to context
bctr
#if _CALL_ELF == 2
.size ontop_fcontext, .-ontop_fcontext
#else
use_entry_arg:
# compute return-value struct address
# (passed has hidden arg to ontop_fn)
addi %r3, %r1, 8
# jump to context and update LR
bctrl
# restore CTR
ld %r7, 176(%r1)
mtctr %r7
#if _CALL_ELF != 2
# restore TOC
ld %r2, 0(%r1)
#endif
# copy returned transfer_t into entry_fn arg registers
ld %r3, 8(%r1)
ld %r4, 16(%r1)
b return_to_ctx
# ifdef _CALL_LINUX
.size .ontop_fcontext, .-.L.ontop_fcontext
# else
.size .ontop_fcontext, .-.ontop_fcontext
# endif
#endif
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
* ------------------------------------------------- *
* | R17 | R18 | R19 | R20 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
* ------------------------------------------------- *
* | R21 | R22 | R23 | R24 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
* ------------------------------------------------- *
* | R25 | R26 | R27 | R28 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
* ------------------------------------------------- *
* | R29 | R30 | R31 | hidden | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
* ------------------------------------------------- *
* | CR | LR | PC | back-chain| *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
* ------------------------------------------------- *
* | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
* ------------------------------------------------- *
* | cr saved | lr saved | compiler | linker | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* ------------------------------------------------- *
* *
*******************************************************/
.text
.align 2
.globl _ontop_fcontext
_ontop_fcontext:
; reserve space on stack
subi r1, r1, 184
std r14, 8(r1) ; save R14
std r15, 16(r1) ; save R15
std r16, 24(r1) ; save R16
std r17, 32(r1) ; save R17
std r18, 40(r1) ; save R18
std r19, 48(r1) ; save R19
std r20, 56(r1) ; save R20
std r21, 64(r1) ; save R21
std r22, 72(r1) ; save R22
std r23, 80(r1) ; save R23
std r24, 88(r1) ; save R24
std r25, 96(r1) ; save R25
std r26, 104(r1) ; save R26
std r27, 112(r1) ; save R27
std r28, 120(r1) ; save R28
std r29, 128(r1) ; save R29
std r30, 136(r1) ; save R30
std r31, 144(r1) ; save R31
std r3, 152(r1) ; save hidden
; save CR
mfcr r0
std r0, 160(r1)
; save LR
mflr r0
std r0, 168(r1)
; save LR as PC
std r0, 176(r1)
; store RSP (pointing to context-data) in R7
mr r7, r1
; restore RSP (pointing to context-data) from R4
mr r1, r4
ld r14, 8(r1) ; restore R14
ld r15, 16(r1) ; restore R15
ld r16, 24(r1) ; restore R16
ld r17, 32(r1) ; restore R17
ld r18, 40(r1) ; restore R18
ld r19, 48(r1) ; restore R19
ld r20, 56(r1) ; restore R20
ld r21, 64(r1) ; restore R21
ld r22, 72(r1) ; restore R22
ld r23, 80(r1) ; restore R23
ld r24, 88(r1) ; restore R24
ld r25, 96(r1) ; restore R25
ld r26, 104(r1) ; restore R26
ld r27, 112(r1) ; restore R27
ld r28, 120(r1) ; restore R28
ld r29, 128(r1) ; restore R29
ld r30, 136(r1) ; restore R30
ld r31, 144(r1) ; restore R31
ld r4, 152(r1) ; restore hidden
; restore CR
ld r0, 160(r1)
mtcr r0
; restore LR
ld r0, 168(r1)
mtlr r0
; ignore PC
; adjust stack
addi r1, r1, 184
; return transfer_t
std r7, 0(r4)
std r5, 8(r4)
; restore CTR
mtctr r6
; jump to context
bctr
lib/context_switcher/asm/fcontext/ontop_ppc64_sysv_xcoff_gas.S
0 → 100644
View file @
c25e6134
.align 2
.globl .ontop_fcontext
.ontop_fcontext:
# reserve space on stack
subi 1, 1, 184
std 13, 0(1) # save R13
std 14, 8(1) # save R14
std 15, 16(1) # save R15
std 16, 24(1) # save R16
std 17, 32(1) # save R17
std 18, 40(1) # save R18
std 19, 48(1) # save R19
std 20, 56(1) # save R20
std 21, 64(1) # save R21
std 22, 72(1) # save R22
std 23, 80(1) # save R23
std 24, 88(1) # save R24
std 25, 96(1) # save R25
std 26, 104(1) # save R26
std 27, 112(1) # save R27
std 29, 120(1) # save R28
std 29, 128(1) # save R29
std 30, 136(1) # save R30
std 31, 144(1) # save R31
std 3, 152(1) # save hidden
# save CR
mfcr 0
std 0, 160(1)
# save LR
mflr 0
std 0, 168(1)
# save LR as PC
std 0, 176(1)
# store RSP (pointing to context-data) in R7
mr 7, 1
# restore RSP (pointing to context-data) from R4
mr 1, 4
ld 13, 0(1) # restore R13
ld 14, 8(1) # restore R14
ld 15, 16(1) # restore R15
ld 16, 24(1) # restore R16
ld 17, 32(1) # restore R17
ld 18, 40(1) # restore R18
ld 19, 48(1) # restore R19
ld 20, 56(1) # restore R20
ld 21, 64(1) # restore R21
ld 22, 72(1) # restore R22
ld 23, 80(1) # restore R23
ld 24, 88(1) # restore R24
ld 25, 96(1) # restore R25
ld 26, 104(1) # restore R26
ld 27, 112(1) # restore R27
ld 28, 120(1) # restore R28
ld 29, 128(1) # restore R29
ld 30, 136(1) # restore R30
ld 31, 144(1) # restore R31
ld 4, 152(1) # restore hidden
# restore CR
ld 0, 160(1)
mtcr 0
# restore LR
ld 0, 168(1)
mtlr 0
# ignore PC
# adjust stack
addi 1, 1, 184
# return transfer_t
std 7, 0(4)
std 5, 8(4)
# restore CTR
mtctr 6
# jump to context
bctr
lib/context_switcher/asm/fcontext/ontop_riscv64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
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| *
* ------------------------------------------------- *
* | fs0 | fs1 | fs2 | fs3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
* ------------------------------------------------- *
* | fs4 | fs5 | fs6 | fs7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
* ------------------------------------------------- *
* | fs8 | fs9 | fs10 | fs11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
* ------------------------------------------------- *
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
* ------------------------------------------------- *
* | s0 | s1 | s2 | s3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
* ------------------------------------------------- *
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
* ------------------------------------------------- *
* | s4 | s5 | s6 | s7 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
* ------------------------------------------------- *
* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
* ------------------------------------------------- *
* | s8 | s9 | s10 | s11 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 48 | 49 | 50 | 51 | | | | | *
* ------------------------------------------------- *
* | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
* ------------------------------------------------- *
* | ra | pc | | | *
* ------------------------------------------------- *
* *
*******************************************************/
.file "ontop_riscv64_sysv_elf_gas.S"
.text
.align 1
.global ontop_fcontext
.type ontop_fcontext, %function
ontop_fcontext:
# prepare stack for GP + FPU
addi sp, sp, -0xd0
# save fs0 - fs11
fsd fs0, 0x00(sp)
fsd fs1, 0x08(sp)
fsd fs2, 0x10(sp)
fsd fs3, 0x18(sp)
fsd fs4, 0x20(sp)
fsd fs5, 0x28(sp)
fsd fs6, 0x30(sp)
fsd fs7, 0x38(sp)
fsd fs8, 0x40(sp)
fsd fs9, 0x48(sp)
fsd fs10, 0x50(sp)
fsd fs11, 0x58(sp)
# save s0-s11, ra
sd s0, 0x60(sp)
sd s1, 0x68(sp)
sd s2, 0x70(sp)
sd s3, 0x78(sp)
sd s4, 0x80(sp)
sd s5, 0x88(sp)
sd s6, 0x90(sp)
sd s7, 0x98(sp)
sd s8, 0xa0(sp)
sd s9, 0xa8(sp)
sd s10, 0xb0(sp)
sd s11, 0xb8(sp)
sd ra, 0xc0(sp)
# save RA as PC
sd ra, 0xc8(sp)
# store SP (pointing to context-data) in A3
mv a3, sp
# restore SP (pointing to context-data) from A0
mv sp, a0
# load fs0 - fs11
fld fs0, 0x00(sp)
fld fs1, 0x08(sp)
fld fs2, 0x10(sp)
fld fs3, 0x18(sp)
fld fs4, 0x20(sp)
fld fs5, 0x28(sp)
fld fs6, 0x30(sp)
fld fs7, 0x38(sp)
fld fs8, 0x40(sp)
fld fs9, 0x48(sp)
fld fs10, 0x50(sp)
fld fs11, 0x58(sp)
# load s0-s11,ra
ld s0, 0x60(sp)
ld s1, 0x68(sp)
ld s2, 0x70(sp)
ld s3, 0x78(sp)
ld s4, 0x80(sp)
ld s5, 0x88(sp)
ld s6, 0x90(sp)
ld s7, 0x98(sp)
ld s8, 0xa0(sp)
ld s9, 0xa8(sp)
ld s10, 0xb0(sp)
ld s11, 0xb8(sp)
ld ra, 0xc0(sp)
# return transfer_t from jump
# pass transfer_t as first arg in context function
# a0 == FCTX, a1 == DATA
mv a0, a3
# skip pc
# restore stack from GP + FPU
addi sp, sp, 0xd0
# jump to ontop-function
jr a2
.size ontop_fcontext,.-ontop_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_s390x_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*******************************************************
* *
* ------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
* ------------------------------------------------- *
* | 0 | 8 | 16 | 24 | *
* ------------------------------------------------- *
* | R6 | R7 | R8 | R9 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ------------------------------------------------- *
* | 32 | 40 | 48 | 56 | *
* ------------------------------------------------- *
* | R10 | R11 | R12 | R13 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
* ------------------------------------------------- *
* | 64 | 72 | 80 | 88 | *
* ------------------------------------------------- *
* | R14/LR | R15 | F1 | F3 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 24 | 25 | 26 | 27 | 28 | 29 | | *
* ------------------------------------------------- *
* | 96 | 104 | 112 | 120 | *
* ------------------------------------------------- *
* | F5 | F7 | PC | | *
* ------------------------------------------------- *
* *****************************************************/
.file "ontop_s390x_sysv_elf_gas.S"
.text
.align 4 # According to the sample code in the ELF ABI docs
.global ontop_fcontext
.type ontop_fcontext, @function
#define GR_OFFSET 0
#define LR_OFFSET 64
#define SP_OFFSET 72
#define FP_OFFSET 80
#define PC_OFFSET 112
#define L_CTX 120
ontop_fcontext:
# Reserved the space for stack to store the data of current context
# before we jump to the new context.
aghi %r15,-L_CTX
# save the registers to the stack
stmg %r6, %r15, GR_OFFSET(%r15)
# save the floating point registers
std %f0,FP_OFFSET(%r15)
std %f3,FP_OFFSET+8(%r15)
std %f5,FP_OFFSET+16(%r15)
std %f7,FP_OFFSET+24(%r15)
# Save LR as PC
stg %r14,PC_OFFSET(%r15)
# Store the SP pointing to the old context-data into R0
lgr %r0,%r15
# Get the SP pointing to the new context-data
# Note: Since the return type of the jump_fcontext is struct whose
# size is more than 8. The compiler automatically passes the
# address of the transfer_t where the data needs to store into R2.
# Hence the first param passed to the jump_fcontext which represent
# the fctx we want to switch to is present in R3
# R2 --> Address of the return transfer_t struct
# R3 --> Context we want to switch to
# R4 --> Data
lgr %r15,%r3
# Load the registers with the data present in context-data of the
# context we are going to switch to
lmg %r6,%r15,GR_OFFSET(%r15)
# Restore Floating point registers
ld %f1,FP_OFFSET(%r15)
ld %f3,FP_OFFSET+8(%r15)
ld %f5,FP_OFFSET+16(%r15)
ld %f7,FP_OFFSET+24(%r15)
# Skip PC
# Adjust the stack
aghi %r15,L_CTX
# R2 --> Address where the return transfer_t is stored
# R0 --> FCTX
# R4 --> DATA
# R5 --> Context function
# Store the elements to return transfer_t
stg %r15, 0(%r2)
stg %r4, 8(%r2)
# Note: The address in R2 points to the place where the return
# transfer_t is stored. Since context_function take transfer_t
# as first parameter. And R2 is the register which holds the
# first parameter value.
#jump to context function
br %r5
.size ontop_fcontext,.-ontop_fcontext
# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_x86_64_ms_pe_gas.asm
0 → 100644
View file @
c25e6134
/*
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
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x20
|
0x24
|
0x28
|
0x2c
|
0x30
|
0x34
|
0x38
|
0x3c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe40
|
0x44
|
0x48
|
0x4c
|
0x50
|
0x54
|
0x58
|
0x5c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x60
|
0x64
|
0x68
|
0x6c
|
0x70
|
0x74
|
0x78
|
0x7c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
32
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x80
|
0x84
|
0x88
|
0x8c
|
0x90
|
0x94
|
0x98
|
0x9c
|
*
*
----------------------------------------------------------------------------------
*
*
|
SEE
registers
(
XMM6
-
XMM15
)
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xa0
|
0xa4
|
0xa8
|
0xac
|
0xb0
|
0xb4
|
0xb8
|
0xbc
|
*
*
----------------------------------------------------------------------------------
*
*
|
fc_mxcsr
|
fc_x87_cw
|
<
alignment
>
|
fbr_strg
|
fc_dealloc
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xc0
|
0xc4
|
0xc8
|
0xcc
|
0xd0
|
0xd4
|
0xd8
|
0xdc
|
*
*
----------------------------------------------------------------------------------
*
*
|
limit
|
base
|
R12
|
R13
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
*
*
----------------------------------------------------------------------------------
*
*
|
0xe0
|
0xe4
|
0xe8
|
0xec
|
0xf0
|
0xf4
|
0xf8
|
0xfc
|
*
*
----------------------------------------------------------------------------------
*
*
|
R14
|
R15
|
RDI
|
RSI
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x100
|
0x104
|
0x108
|
0x10c
|
0x110
|
0x114
|
0x118
|
0x11c
|
*
*
----------------------------------------------------------------------------------
*
*
|
RBX
|
RBP
|
hidden
|
RIP
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x120
|
0x124
|
0x128
|
0x12c
|
0x130
|
0x134
|
0x138
|
0x13c
|
*
*
----------------------------------------------------------------------------------
*
*
|
parameter
area
|
*
*
----------------------------------------------------------------------------------
*
*
----------------------------------------------------------------------------------
*
*
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
*
*
----------------------------------------------------------------------------------
*
*
|
0x140
|
0x144
|
0x148
|
0x14c
|
0x150
|
0x154
|
0x158
|
0x15c
|
*
*
----------------------------------------------------------------------------------
*
*
|
FCTX
|
DATA
|
|
*
*
----------------------------------------------------------------------------------
*
*************************************************************************************
*/
.
file
"ontop_x86_64_ms_pe_gas.asm"
.
text
.
p2align
4
,,
15
.
globl
ontop_fcontext
.
def
ontop_fcontext
; .scl 2; .type 32; .endef
.
seh_proc
ontop_fcontext
ontop_fcontext
:
.
seh_endprologue
leaq
-
0x118
(
%
rsp
),
%
rsp
/*
prepare
stack
*/
#
if
!
defined
(
BOOST_USE_TSX
)
/*
save
XMM
storage
*/
movaps
%
xmm6
,
0x0
(
%
rsp
)
movaps
%
xmm7
,
0x10
(
%
rsp
)
movaps
%
xmm8
,
0x20
(
%
rsp
)
movaps
%
xmm9
,
0x30
(
%
rsp
)
movaps
%
xmm10
,
0x40
(
%
rsp
)
movaps
%
xmm11
,
0x50
(
%
rsp
)
movaps
%
xmm12
,
0x60
(
%
rsp
)
movaps
%
xmm13
,
0x70
(
%
rsp
)
movaps
%
xmm14
,
0x80
(
%
rsp
)
movaps
%
xmm15
,
0x90
(
%
rsp
)
stmxcsr
0xa0
(
%
rsp
)
/*
save
MMX
control
-
and
status
-
word
*/
fnstcw
0xa4
(
%
rsp
)
/*
save
x87
control
-
word
*/
#
endif
/*
load
NT_TIB
*/
movq
%
gs
:
(
0x30
),
%
r10
/*
save
fiber
local
storage
*/
movq
0x20
(
%
r10
),
%
rax
movq
%
rax
,
0xb0
(
%
rsp
)
/*
save
current
deallocation
stack
*/
movq
0x1478
(
%
r10
),
%
rax
movq
%
rax
,
0xb8
(
%
rsp
)
/*
save
current
stack
limit
*/
movq
0x10
(
%
r10
),
%
rax
movq
%
rax
,
0xc0
(
%
rsp
)
/*
save
current
stack
base
*/
movq
0x08
(
%
r10
),
%
rax
movq
%
rax
,
0xc8
(
%
rsp
)
movq
%
r12
,
0xd0
(
%
rsp
)
/*
save
R12
*/
movq
%
r13
,
0xd8
(
%
rsp
)
/*
save
R13
*/
movq
%
r14
,
0xe0
(
%
rsp
)
/*
save
R14
*/
movq
%
r15
,
0xe8
(
%
rsp
)
/*
save
R15
*/
movq
%
rdi
,
0xf0
(
%
rsp
)
/*
save
RDI
*/
movq
%
rsi
,
0xf8
(
%
rsp
)
/*
save
RSI
*/
movq
%
rbx
,
0x100
(
%
rsp
)
/*
save
RBX
*/
movq
%
rbp
,
0x108
(
%
rsp
)
/*
save
RBP
*/
movq
%
rcx
,
0x110
(
%
rsp
)
/*
save
hidden
address
of
transport_t
*/
/*
preserve
RSP
(
pointing
to
context
-
data
)
in
RCX
*/
movq
%
rsp
,
%
rcx
/*
restore
RSP
(
pointing
to
context
-
data
)
from
RDX
*/
movq
%
rdx
,
%
rsp
#
if
!
defined
(
BOOST_USE_TSX
)
/*
restore
XMM
storage
*/
movaps
0x0
(
%
rsp
),
%
xmm6
movaps
0x10
(
%
rsp
),
%
xmm7
movaps
0x20
(
%
rsp
),
%
xmm8
movaps
0x30
(
%
rsp
),
%
xmm9
movaps
0x40
(
%
rsp
),
%
xmm10
movaps
0x50
(
%
rsp
),
%
xmm11
movaps
0x60
(
%
rsp
),
%
xmm12
movaps
0x70
(
%
rsp
),
%
xmm13
movaps
0x80
(
%
rsp
),
%
xmm14
movaps
0x90
(
%
rsp
),
%
xmm15
ldmxcsr
0xa0
(
%
rsp
)
/*
restore
MMX
control
-
and
status
-
word
*/
fldcw
0xa4
(
%
rsp
)
/*
restore
x87
control
-
word
*/
#
endif
/*
load
NT_TIB
*/
movq
%
gs
:
(
0x30
),
%
r10
/*
restore
fiber
local
storage
*/
movq
0xb0
(
%
rsp
),
%
rax
movq
%
rax
,
0x20
(
%
r10
)
/*
restore
current
deallocation
stack
*/
movq
0xb8
(
%
rsp
),
%
rax
movq
%
rax
,
0x1478
(
%
r10
)
/*
restore
current
stack
limit
*/
movq
0xc0
(
%
rsp
),
%
rax
movq
%
rax
,
0x10
(
%
r10
)
/*
restore
current
stack
base
*/
movq
0xc8
(
%
rsp
),
%
rax
movq
%
rax
,
0x08
(
%
r10
)
movq
0xd0
(
%
rsp
),
%
r12
/*
restore
R12
*/
movq
0xd8
(
%
rsp
),
%
r13
/*
restore
R13
*/
movq
0xe0
(
%
rsp
),
%
r14
/*
restore
R14
*/
movq
0xe8
(
%
rsp
),
%
r15
/*
restore
R15
*/
movq
0xf0
(
%
rsp
),
%
rdi
/*
restore
RDI
*/
movq
0xf8
(
%
rsp
),
%
rsi
/*
restore
RSI
*/
movq
0x100
(
%
rsp
),
%
rbx
/*
restore
RBX
*/
movq
0x108
(
%
rsp
),
%
rbp
/*
restore
RBP
*/
movq
0x110
(
%
rsp
),
%
rax
/*
restore
hidden
address
of
transport_t
*/
leaq
0x118
(
%
rsp
),
%
rsp
/*
prepare
stack
*/
/*
keep
return
-
address
on
stack
*/
/*
transport_t
returned
in
RAX
*/
/*
return
parent
fcontext_t
*/
movq
%
rcx
,
0x0
(
%
rax
)
/*
return
data
*/
movq
%
r8
,
0x8
(
%
rax
)
/*
transport_t
as
1
.
arg
of
context
-
function
*/
/*
RCX
contains
address
of
returned
(
hidden
)
transfer_t
*/
movq
%
rax
,
%
rcx
/*
RDX
contains
address
of
passed
transfer_t
*/
movq
%
rax
,
%
rdx
/*
indirect
jump
to
context
*/
jmp
*
%
r9
.
seh_endproc
.
section
.
drectve
.
ascii
" -export:
\"
ontop_fcontext
\"
"
lib/context_switcher/asm/fcontext/ontop_x86_64_ms_pe_masm.asm
0 → 100644
View file @
c25e6134
; Copyright Oliver Kowalke 2009.
; 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 |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
; ----------------------------------------------------------------------------------
; | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
; ----------------------------------------------------------------------------------
; | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
; ----------------------------------------------------------------------------------
; | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
; ----------------------------------------------------------------------------------
; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
; ----------------------------------------------------------------------------------
; | SEE registers (XMM6-XMM15) |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
; ----------------------------------------------------------------------------------
; | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc |
; ----------------------------------------------------------------------------------
; | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
; ----------------------------------------------------------------------------------
; | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc |
; ----------------------------------------------------------------------------------
; | limit | base | R12 | R13 |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
; ----------------------------------------------------------------------------------
; | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc |
; ----------------------------------------------------------------------------------
; | R14 | R15 | RDI | RSI |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
; ----------------------------------------------------------------------------------
; | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c |
; ----------------------------------------------------------------------------------
; | RBX | RBP | hidden | RIP |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
; ----------------------------------------------------------------------------------
; | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c |
; ----------------------------------------------------------------------------------
; | parameter area |
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
; ----------------------------------------------------------------------------------
; | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c |
; ----------------------------------------------------------------------------------
; | FCTX | DATA | |
; ----------------------------------------------------------------------------------
.
code
ontop_fcontext
PROC
BOOST_CONTEXT_EXPORT
FRAME
.
endprolog
; prepare stack
lea
rsp
,
[
rsp
-
0118
h
]
IFNDEF
BOOST_USE_TSX
; save XMM storage
movaps
[rsp],
xmm6
movaps
[
rsp
+
010
h
]
,
xmm7
movaps
[
rsp
+
020
h
]
,
xmm8
movaps
[
rsp
+
030
h
]
,
xmm9
movaps
[
rsp
+
040
h
]
,
xmm10
movaps
[
rsp
+
050
h
]
,
xmm11
movaps
[
rsp
+
060
h
]
,
xmm12
movaps
[
rsp
+
070
h
]
,
xmm13
movaps
[
rsp
+
080
h
]
,
xmm14
movaps
[
rsp
+
090
h
]
,
xmm15
; save MMX control- and status-word
stmxcsr
[
rsp
+
0
a0h
]
; save x87 control-word
fnstcw
[
rsp
+
0
a4h
]
ENDIF
; load NT_TIB
mov
r10
,
gs
:
[030h]
; save fiber local storage
mov
rax
,
[
r10
+
020
h
]
mov
[
rsp
+
0
b0h
]
,
rax
; save current deallocation stack
mov
rax
,
[
r10
+
01478
h
]
mov
[
rsp
+
0
b8h
]
,
rax
; save current stack limit
mov
rax
,
[
r10
+
010
h
]
mov
[
rsp
+
0
c0h
]
,
rax
; save current stack base
mov
rax
,
[
r10
+
08
h
]
mov
[
rsp
+
0
c8h
]
,
rax
mov
[
rsp
+
0
d0h
]
,
r12
; save R12
mov
[
rsp
+
0
d8h
]
,
r13
; save R13
mov
[
rsp
+
0
e0h
]
,
r14
; save R14
mov
[
rsp
+
0
e8h
]
,
r15
; save R15
mov
[
rsp
+
0
f0h
]
,
rdi
; save RDI
mov
[
rsp
+
0
f8h
]
,
rsi
; save RSI
mov
[
rsp
+
0100
h
]
,
rbx
; save RBX
mov
[
rsp
+
0108
h
]
,
rbp
; save RBP
mov
[
rsp
+
0110
h
]
,
rcx
; save hidden address of transport_t
; preserve RSP (pointing to context-data) in RCX
mov
rcx
,
rsp
; restore RSP (pointing to context-data) from RDX
mov
rsp
,
rdx
IFNDEF
BOOST_USE_TSX
; restore XMM storage
movaps
xmm6
,
[rsp]
movaps
xmm7
,
[
rsp
+
010
h
]
movaps
xmm8
,
[
rsp
+
020
h
]
movaps
xmm9
,
[
rsp
+
030
h
]
movaps
xmm10
,
[
rsp
+
040
h
]
movaps
xmm11
,
[
rsp
+
050
h
]
movaps
xmm12
,
[
rsp
+
060
h
]
movaps
xmm13
,
[
rsp
+
070
h
]
movaps
xmm14
,
[
rsp
+
080
h
]
movaps
xmm15
,
[
rsp
+
090
h
]
; restore MMX control- and status-word
ldmxcsr
[
rsp
+
0
a0h
]
; save x87 control-word
fldcw
[
rsp
+
0
a4h
]
ENDIF
; load NT_TIB
mov
r10
,
gs
:
[030h]
; restore fiber local storage
mov
rax
,
[
rsp
+
0
b0h
]
mov
[
r10
+
020
h
]
,
rax
; restore current deallocation stack
mov
rax
,
[
rsp
+
0
b8h
]
mov
[
r10
+
01478
h
]
,
rax
; restore current stack limit
mov
rax
,
[
rsp
+
0
c0h
]
mov
[
r10
+
010
h
]
,
rax
; restore current stack base
mov
rax
,
[
rsp
+
0
c8h
]
mov
[
r10
+
08
h
]
,
rax
mov
r12
,
[
rsp
+
0
d0h
]
; restore R12
mov
r13
,
[
rsp
+
0
d8h
]
; restore R13
mov
r14
,
[
rsp
+
0
e0h
]
; restore R14
mov
r15
,
[
rsp
+
0
e8h
]
; restore R15
mov
rdi
,
[
rsp
+
0
f0h
]
; restore RDI
mov
rsi
,
[
rsp
+
0
f8h
]
; restore RSI
mov
rbx
,
[
rsp
+
0100
h
]
; restore RBX
mov
rbp
,
[
rsp
+
0108
h
]
; restore RBP
mov
rax
,
[
rsp
+
0110
h
]
; restore hidden address of transport_t
; prepare stack
lea
rsp
,
[
rsp
+
0118
h
]
; keep return-address on stack
; transport_t returned in RAX
; return parent fcontext_t
mov
[rax],
rcx
; return data
mov
[
rax
+
08
h
]
,
r8
; transport_t as 1.arg of context-function
; RCX contains address of returned (hidden) transfer_t
mov
rcx
,
rax
; RDX contains address of passed transfer_t
mov
rdx
,
rax
; indirect jump to context
jmp
r9
ontop_fcontext
ENDP
END
lib/context_switcher/asm/fcontext/ontop_x86_64_sysv_elf_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.file "ontop_x86_64_sysv_elf_gas.S"
.text
.globl ontop_fcontext
.type ontop_fcontext,@function
.align 16
ontop_fcontext:
/* preserve ontop-function in R8 */
movq %rdx, %r8
leaq -0x38(%rsp), %rsp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%rsp) /* save MMX control- and status-word */
fnstcw 0x4(%rsp) /* save x87 control-word */
#endif
movq %r12, 0x8(%rsp) /* save R12 */
movq %r13, 0x10(%rsp) /* save R13 */
movq %r14, 0x18(%rsp) /* save R14 */
movq %r15, 0x20(%rsp) /* save R15 */
movq %rbx, 0x28(%rsp) /* save RBX */
movq %rbp, 0x30(%rsp) /* save RBP */
/* store RSP (pointing to context-data) in RAX */
movq %rsp, %rax
/* restore RSP (pointing to context-data) from RDI */
movq %rdi, %rsp
#if !defined(BOOST_USE_TSX)
ldmxcsr (%rsp) /* restore MMX control- and status-word */
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
movq 0x8(%rsp), %r12 /* restore R12 */
movq 0x10(%rsp), %r13 /* restore R13 */
movq 0x18(%rsp), %r14 /* restore R14 */
movq 0x20(%rsp), %r15 /* restore R15 */
movq 0x28(%rsp), %rbx /* restore RBX */
movq 0x30(%rsp), %rbp /* restore RBP */
leaq 0x38(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
/* pass transfer_t as first arg in context function */
/* RDI == fctx, RSI == data */
movq %rax, %rdi
/* keep return-address on stack */
/* indirect jump to context */
jmp *%r8
.size ontop_fcontext,.-ontop_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
lib/context_switcher/asm/fcontext/ontop_x86_64_sysv_macho_gas.S
0 → 100644
View file @
c25e6134
/*
Copyright Oliver Kowalke 2009.
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 | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
* ---------------------------------------------------------------------------------- *
* | R15 | RBX | RBP | RIP | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
.text
.globl _ontop_fcontext
.align 8
_ontop_fcontext:
/* preserve ontop-function in R8 */
movq %rdx, %r8
leaq -0x38(%rsp), %rsp /* prepare stack */
#if !defined(BOOST_USE_TSX)
stmxcsr (%rsp) /* save MMX control- and status-word */
fnstcw 0x4(%rsp) /* save x87 control-word */
#endif
movq %r12, 0x8(%rsp) /* save R12 */
movq %r13, 0x10(%rsp) /* save R13 */
movq %r14, 0x18(%rsp) /* save R14 */
movq %r15, 0x20(%rsp) /* save R15 */
movq %rbx, 0x28(%rsp) /* save RBX */
movq %rbp, 0x30(%rsp) /* save RBP */
/* store RSP (pointing to context-data) in RAX */
movq %rsp, %rax
/* restore RSP (pointing to context-data) from RDI */
movq %rdi, %rsp
#if !defined(BOOST_USE_TSX)
ldmxcsr (%rsp) /* restore MMX control- and status-word */
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
movq 0x8(%rsp), %r12 /* restore R12 */
movq 0x10(%rsp), %r13 /* restore R13 */
movq 0x18(%rsp), %r14 /* restore R14 */
movq 0x20(%rsp), %r15 /* restore R15 */
movq 0x28(%rsp), %rbx /* restore RBX */
movq 0x30(%rsp), %rbp /* restore RBP */
leaq 0x38(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
/* pass transfer_t as first arg in context function */
/* RDI == fctx, RSI == data */
movq %rax, %rdi
/* keep return-address on stack */
/* indirect jump to context */
jmp *%r8
lib/context_switcher/asm/fcontext/tail_ppc32_sysv_elf_gas.cpp
0 → 100644
View file @
c25e6134
// Copyright Oliver Kowalke 2009.
// 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)
#include <boost/context/detail/fcontext.hpp>
using
boost
::
context
::
detail
::
fcontext_t
;
using
boost
::
context
::
detail
::
transfer_t
;
// This C++ tail of ontop_fcontext() allocates transfer_t{ from, vp }
// on the stack. If fn() throws a C++ exception, then the C++ runtime
// must remove this tail's stack frame.
extern
"C"
transfer_t
ontop_fcontext_tail
(
int
ignore
,
void
*
vp
,
transfer_t
(
*
fn
)(
transfer_t
),
fcontext_t
const
from
)
{
return
fn
(
transfer_t
{
from
,
vp
});
}
lib/context_switcher/asm/switch_context_arm32.s
deleted
100644 → 0
View file @
4a44ad9f
.arm
.text
.global __cs_switch_context
.type __cs_switch_context, %function
__cs_switch_context:
/* Parameter List (in order)
* r0 = pointer to continuation (should hold value of target stack will be filled with this continuation)
*
* Return
* r0 = continuation that returned control back to the caller (null if fallthrough)
*
* Variables
* r1 = temporary for the old stack pointer */
/* ========== Save State ========== */
/* store programm counter for later return */
push {lr}
/* store callee saved registers */
push {r4-r12,lr}
/* ========== Save State ========== */
/* Perform change to new stack */
/* Keep old stack as result from this function. */
mov r1, sp
/* Switch to new stack pointer. */
mov sp, r0
/* ========== Restore State ========== */
/* restore callee saved registers */
pop {r4-r12,lr}
/* ========== Restore State ========== */
/* Just return back from the call. */
/* This is the end of a fiber, so we have no continuation. */
mov r0, r1
pop {pc}
lib/context_switcher/include/context_switcher/context.h
0 → 100644
View file @
c25e6134
#ifndef CONTEXT_SWITCHER_CONTEXT_H_
#define CONTEXT_SWITCHER_CONTEXT_H_
#ifdef CS_USE_CSCONTEXT
#include "cscontext.h"
#else
#include "fcontext.h"
#endif
namespace
context_switcher
{
#ifdef CS_USE_CSCONTEXT
using
continuation_t
=
cscontext
::
continuation_t
;
using
stack_pointer_t
=
cscontext
::
stack_pointer_t
;
using
callback_t
=
cscontext
::
callback_t
;
#else
using
continuation_t
=
fcontext
::
continuation_t
;
using
stack_pointer_t
=
fcontext
::
stack_pointer_t
;
using
callback_t
=
fcontext
::
callback_t
;
#endif
}
#endif //CONTEXT_SWITCHER_CONTEXT_H_
lib/context_switcher/include/context_switcher/context_switcher.h
View file @
c25e6134
...
@@ -6,26 +6,58 @@
...
@@ -6,26 +6,58 @@
#include <cstdint>
#include <cstdint>
#include <new>
#include <new>
#include "assembly_bindings.h"
#include "context.h"
#include "continuation.h"
#include "continuation.h"
#include "lambda_capture.h"
#include "lambda_capture.h"
#ifdef THREAD_SANITIZER
#include "tsan_fiber_api.h"
#endif
namespace
context_switcher
{
namespace
context_switcher
{
continuation
switch_context
(
continuation
&&
cont
);
template
<
typename
F
>
template
<
typename
F
>
continuation
enter_context
(
assembly_bindings
::
stack_pointer_t
stack_memory
,
size_t
stack_size
,
F
&&
lambda
)
{
continuation
enter_context
(
stack_pointer_t
stack_memory
,
size_t
stack_size
,
F
&&
lambda
)
{
assembly_bindings
::
stack_pointer_t
lambda_memory
=
stack_memory
+
stack_size
-
sizeof
(
lambda_capture
<
F
>
);
stack_pointer_t
lambda_memory
=
stack_memory
+
stack_size
-
sizeof
(
lambda_capture
<
F
>
);
auto
*
captured_lambda
=
place_lambda_capture
(
std
::
forward
<
F
>
(
lambda
),
lambda_memory
);
auto
*
captured_lambda
=
place_lambda_capture
(
std
::
forward
<
F
>
(
lambda
),
lambda_memory
);
assembly_bindings
::
stack_pointer_t
stack_base
=
lambda_memory
;
stack_pointer_t
stack_base
=
lambda_memory
-
64
;
assembly_bindings
::
stack_pointer_t
stack_limit
=
stack_memory
;
stack_pointer_t
stack_limit
=
stack_memory
;
assembly_bindings
::
callback_t
callback
=
lambda_capture_callback
<
lambda_capture
<
F
>>
;
#ifdef CS_USE_CSCONTEXT
return
continuation
{
assembly_bindings
::
__cs_enter_context
(
stack_base
,
captured_lambda
,
callback
,
stack_limit
)};
cscontext
::
callback_t
callback
=
lambda_capture_callback
<
lambda_capture
<
F
>>
;
void
*
result
=
cscontext
::
__cs_enter_context
(
stack_base
,
captured_lambda
,
callback
,
stack_limit
);
return
continuation
{
result
};
#else // CS_USE_CSCONTEXT
fcontext
::
callback_t
callback
=
lambda_capture_callback
<
lambda_capture
<
F
>>
;
fcontext
::
continuation_t
new_context
=
fcontext
::
make_fcontext
(
stack_base
,
stack_base
-
stack_limit
,
callback
);
#ifdef THREAD_SANITIZER
void
*
new_fiber
=
__tsan_create_fiber
(
0
);
void
*
old_fiber
=
__tsan_get_current_fiber
();
captured_lambda
->
my_tsan_fiber_
=
new_fiber
;
captured_lambda
->
previous_tsan_fiber_
=
old_fiber
;
__tsan_switch_to_fiber
(
new_fiber
,
0
);
fcontext
::
transfer_t
transfer
=
fcontext
::
jump_fcontext
(
new_context
,
captured_lambda
);
if
(
transfer
.
data
)
{
return
continuation
{
transfer
.
continuation
,
transfer
.
data
};
}
else
{
return
continuation
{
nullptr
,
nullptr
};
}
#else
fcontext
::
transfer_t
transfer
=
fcontext
::
jump_fcontext
(
new_context
,
captured_lambda
);
if
(
transfer
.
data
)
{
return
continuation
{
transfer
.
continuation
};
}
else
{
return
continuation
{
nullptr
};
}
#endif // THREAD_SANITIZER
#endif // CS_USE_CSCONTEXT
}
}
continuation
switch_context
(
continuation
&&
cont
);
}
}
#endif //CONTEXT_SWITCHER_CONTEXT_SWITCHER_H_
#endif //CONTEXT_SWITCHER_CONTEXT_SWITCHER_H_
lib/context_switcher/include/context_switcher/continuation.h
View file @
c25e6134
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
#ifndef CONTEXT_SWITCHER_CONTINUATION_H_
#ifndef CONTEXT_SWITCHER_CONTINUATION_H_
#define CONTEXT_SWITCHER_CONTINUATION_H_
#define CONTEXT_SWITCHER_CONTINUATION_H_
#include "
assembly_bindings
.h"
#include "
context
.h"
#include <cstdlib>
#include <cstdlib>
#include <cstdio>
#include <cstdio>
...
@@ -17,21 +17,30 @@ namespace context_switcher {
...
@@ -17,21 +17,30 @@ namespace context_switcher {
*/
*/
struct
continuation
{
struct
continuation
{
public
:
public
:
continuation
()
:
cont_pointer_
{
nullptr
}
{};
continuation
()
=
default
;
explicit
continuation
(
assembly_bindings
::
continuation_t
cont_pointer
)
:
cont_pointer_
{
cont_pointer
}
{};
#ifdef THREAD_SANITIZER
continuation
(
continuation_t
cont_pointer
,
void
*
tsan_fiber
)
:
cont_pointer_
{
cont_pointer
},
tsan_fiber_
{
tsan_fiber
}
{};
#else
explicit
continuation
(
continuation_t
cont_pointer
)
:
cont_pointer_
{
cont_pointer
}
{};
#endif
// Move-Only Semantics
// Move-Only Semantics
continuation
(
const
continuation
&
other
)
=
delete
;
continuation
(
const
continuation
&
other
)
=
delete
;
continuation
(
continuation
&&
other
)
noexcept
{
continuation
(
continuation
&&
other
)
noexcept
{
cont_pointer_
=
other
.
cont_pointer_
;
cont_pointer_
=
other
.
cont_pointer_
;
other
.
cont_pointer_
=
nullptr
;
other
.
cont_pointer_
=
nullptr
;
#ifdef THREAD_SANITIZER
tsan_fiber_
=
other
.
tsan_fiber_
;
#endif
}
}
continuation
&
operator
=
(
const
continuation
&
other
)
=
delete
;
continuation
&
operator
=
(
const
continuation
&
other
)
=
delete
;
continuation
&
operator
=
(
continuation
&&
other
)
noexcept
{
continuation
&
operator
=
(
continuation
&&
other
)
noexcept
{
cont_pointer_
=
other
.
cont_pointer_
;
cont_pointer_
=
other
.
cont_pointer_
;
other
.
cont_pointer_
=
nullptr
;
other
.
cont_pointer_
=
nullptr
;
#ifdef THREAD_SANITIZER
tsan_fiber_
=
other
.
tsan_fiber_
;
#endif
return
*
this
;
return
*
this
;
}
}
...
@@ -40,7 +49,7 @@ struct continuation {
...
@@ -40,7 +49,7 @@ struct continuation {
return
cont_pointer_
!=
nullptr
;
return
cont_pointer_
!=
nullptr
;
}
}
assembly_bindings
::
continuation_t
consume
()
{
continuation_t
consume
()
{
if
(
cont_pointer_
==
nullptr
)
{
if
(
cont_pointer_
==
nullptr
)
{
printf
(
"Error!
\n
"
);
printf
(
"Error!
\n
"
);
}
}
...
@@ -50,8 +59,17 @@ struct continuation {
...
@@ -50,8 +59,17 @@ struct continuation {
return
tmp
;
return
tmp
;
}
}
#ifdef THREAD_SANITIZER
void
*
get_tsan_fiber
()
{
return
tsan_fiber_
;
}
#endif
private
:
private
:
assembly_bindings
::
continuation_t
cont_pointer_
;
continuation_t
cont_pointer_
{
nullptr
};
#ifdef THREAD_SANITIZER
void
*
tsan_fiber_
{
nullptr
};
#endif
};
};
}
}
...
...
lib/context_switcher/include/context_switcher/
assembly_bindings
.h
→
lib/context_switcher/include/context_switcher/
cscontext
.h
View file @
c25e6134
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
/**
/**
* Low level bindings to the two assembly functions used to switch context.
* Low level bindings to the two assembly functions used to switch context.
* Can be used standalone to build new control structures, but should be handled with care.
* Can be used standalone to build new control structures, but should be handled with care.
* This is the API to the cscontext version (favoring fast creating of coroutines/short running contexts).
*
*
* Basic usage:
* Basic usage:
* // Switch control to a new stack.
* // Switch control to a new stack.
...
@@ -16,7 +17,7 @@
...
@@ -16,7 +17,7 @@
*/
*/
namespace
context_switcher
{
namespace
context_switcher
{
namespace
assembly_bindings
{
namespace
cscontext
{
using
continuation_t
=
void
*
;
using
continuation_t
=
void
*
;
using
stack_pointer_t
=
char
*
;
using
stack_pointer_t
=
char
*
;
...
...
lib/context_switcher/include/context_switcher/fcontext.h
0 → 100644
View file @
c25e6134
#ifndef CONTEXT_SWITCHER_FCONTEXT_H_
#define CONTEXT_SWITCHER_FCONTEXT_H_
#include <cstdint>
#include <cstddef>
/**
* Low level bindings to the two assembly functions used to switch context.
* Can be used standalone to build new control structures, but should be handled with care.
* This is the API to the fcontext (boost.context assembly).
*/
namespace
context_switcher
{
namespace
fcontext
{
using
continuation_t
=
void
*
;
using
stack_pointer_t
=
char
*
;
struct
transfer_t
{
continuation_t
continuation
;
void
*
data
;
};
using
callback_t
=
void
(
*
)(
transfer_t
);
extern
"C"
{
transfer_t
jump_fcontext
(
continuation_t
cont
,
void
*
data
);
continuation_t
make_fcontext
(
stack_pointer_t
sp
,
size_t
size
,
callback_t
corofn
);
transfer_t
ontop_fcontext
(
continuation_t
cont
,
void
*
data
,
transfer_t
(
*
fn
)(
transfer_t
));
}
}
}
#endif //CONTEXT_SWITCHER_FCONTEXT_H_
lib/context_switcher/include/context_switcher/lambda_capture.h
View file @
c25e6134
...
@@ -6,9 +6,11 @@
...
@@ -6,9 +6,11 @@
#include <new>
#include <new>
#include <type_traits>
#include <type_traits>
#include "
assembly_bindings
.h"
#include "
context
.h"
#include "continuation.h"
#include "continuation.h"
#include "tsan_fiber_api.h"
/**
/**
* Helpers to more easily use a lambda expression as the code run on a context switch.
* Helpers to more easily use a lambda expression as the code run on a context switch.
* Captures lambdas by placing them in a memory region and offering a conversion form
* Captures lambdas by placing them in a memory region and offering a conversion form
...
@@ -22,26 +24,57 @@ struct lambda_capture {
...
@@ -22,26 +24,57 @@ struct lambda_capture {
template
<
typename
FARG
>
template
<
typename
FARG
>
explicit
lambda_capture
(
FARG
&&
lambda
)
:
lambda_
{
std
::
forward
<
FARG
>
(
lambda
)}
{}
explicit
lambda_capture
(
FARG
&&
lambda
)
:
lambda_
{
std
::
forward
<
FARG
>
(
lambda
)}
{}
assembly_bindings
::
continuation_t
operator
()(
assembly_bindings
::
continuation_t
continuation_pointer
)
{
#ifdef THREAD_SANITIZER
continuation
cont
=
lambda_
(
continuation
{
continuation_pointer
});
continuation
operator
()(
continuation_t
cont
)
{
return
cont
.
consume
();
return
lambda_
(
continuation
{
cont
,
previous_tsan_fiber_
});
}
void
*
previous_tsan_fiber_
;
void
*
my_tsan_fiber_
;
#else
continuation
operator
()(
continuation_t
cont
)
{
return
lambda_
(
continuation
{
cont
});
}
}
#endif
private
:
private
:
F
lambda_
;
F
lambda_
;
};
};
#ifdef CS_USE_CSCONTEXT
template
<
typename
T
>
template
<
typename
T
>
assembly_bindings
::
continuation_t
lambda_capture_callback
(
assembly_bindings
::
continuation_t
continuation_pointer
,
cscontext
::
continuation_t
lambda_capture_callback
(
cscontext
::
continuation_t
continuation_pointer
,
void
*
lambda_capture_param
)
{
void
*
lambda_capture_param
)
{
// Perform Call
// Perform Call
T
*
lambda_capture
=
reinterpret_cast
<
T
*>
(
lambda_capture_param
);
T
*
lambda_capture
=
reinterpret_cast
<
T
*>
(
lambda_capture_param
);
auto
result_continuation
=
(
*
lambda_capture
)(
continuation_pointer
);
continuation
cont
=
(
*
lambda_capture
)(
continuation_pointer
);
// Free resources and switch to result_continuation (this execution thread is finished with the return)
// Free resources and switch to result_continuation (this execution thread is finished with the return)
lambda_capture
->~
T
();
lambda_capture
->~
T
();
return
result_continuation
;
return
cont
.
consume
();
}
#else // CS_USE_CSCONTEXT
continuation
switch_context
(
continuation
&&
cont
);
template
<
typename
T
>
void
lambda_capture_callback
(
fcontext
::
transfer_t
transfer
)
{
// Perform Call
T
*
lambda_capture
=
reinterpret_cast
<
T
*>
(
transfer
.
data
);
continuation
cont
=
(
*
lambda_capture
)(
transfer
.
continuation
);
// Free resources and switch to result_continuation (this execution thread is finished with the return)
lambda_capture
->~
T
();
#ifdef THREAD_SANITIZER
continuation_t
cont_pointer
=
cont
.
consume
();
void
*
next_fiber
=
cont
.
get_tsan_fiber
();
__tsan_switch_to_fiber
(
next_fiber
,
0
);
__tsan_destroy_fiber
(
lambda_capture
->
my_tsan_fiber_
);
fcontext
::
jump_fcontext
(
cont_pointer
,
(
void
*
)
0
);
#else // THREAD_SANITIZER
continuation_t
cont_pointer
=
cont
.
consume
();
fcontext
::
jump_fcontext
(
cont_pointer
,
(
void
*
)
0
);
#endif // THREAD_SANITIZER
}
}
#endif // CS_USE_CSCONTEXT
template
<
typename
F
>
template
<
typename
F
>
static
lambda_capture
<
typename
std
::
remove_reference
<
F
>::
type
>
*
place_lambda_capture
(
F
&&
lambda
,
char
*
memory
)
{
static
lambda_capture
<
typename
std
::
remove_reference
<
F
>::
type
>
*
place_lambda_capture
(
F
&&
lambda
,
char
*
memory
)
{
...
...
lib/context_switcher/include/context_switcher/tsan_fiber_api.h
0 → 100644
View file @
c25e6134
#ifndef PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
#define PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
extern
"C"
{
// Fiber switching API.
// - TSAN context for fiber can be created by __tsan_create_fiber
// and freed by __tsan_destroy_fiber.
// - TSAN context of current fiber or thread can be obtained
// by calling __tsan_get_current_fiber.
// - __tsan_switch_to_fiber should be called immediatly before switch
// to fiber, such as call of swapcontext.
// - Fiber name can be set by __tsan_set_fiber_name.
void
*
__tsan_get_current_fiber
(
void
);
void
*
__tsan_create_fiber
(
unsigned
flags
);
void
__tsan_destroy_fiber
(
void
*
fiber
);
void
__tsan_switch_to_fiber
(
void
*
fiber
,
unsigned
flags
);
void
__tsan_set_fiber_name
(
void
*
fiber
,
const
char
*
name
);
};
#endif //PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
lib/context_switcher/src/context_switcher.cpp
View file @
c25e6134
#include "context_switcher/context_switcher.h"
#include "context_switcher/context_switcher.h"
#ifdef THREAD_SANITIZER
#include "context_switcher/tsan_fiber_api.h"
#endif
namespace
context_switcher
{
namespace
context_switcher
{
#ifdef CS_USE_CSCONTEXT
continuation
switch_context
(
continuation
&&
cont
)
{
continuation
switch_context
(
continuation
&&
cont
)
{
assembly_bindings
::
continuation_t
cont_pointer
=
cont
.
consume
();
continuation_t
cont_pointer
=
cont
.
consume
();
continuation_t
result
=
cscontext
::
__cs_switch_context
(
cont_pointer
);
return
continuation
{
assembly_bindings
::
__cs_switch_context
(
cont_pointer
)};
return
continuation
{
result
};
}
#else
#ifdef THREAD_SANITIZER
continuation
switch_context
(
continuation
&&
cont
)
{
continuation_t
cont_pointer
=
cont
.
consume
();
void
*
next_fiber
=
cont
.
get_tsan_fiber
();
void
*
old_fiber
=
__tsan_get_current_fiber
();
__tsan_switch_to_fiber
(
next_fiber
,
0
);
fcontext
::
transfer_t
transfer
=
fcontext
::
jump_fcontext
(
cont_pointer
,
old_fiber
);
if
(
transfer
.
data
)
{
return
continuation
{
transfer
.
continuation
,
transfer
.
data
};
}
else
{
return
continuation
{
nullptr
,
0
};
}
}
#else
continuation
switch_context
(
continuation
&&
cont
)
{
continuation_t
cont_pointer
=
cont
.
consume
();
fcontext
::
transfer_t
transfer
=
fcontext
::
jump_fcontext
(
cont_pointer
,
(
void
*
)
1
);
if
(
transfer
.
data
)
{
return
continuation
{
transfer
.
continuation
};
}
else
{
return
continuation
{
nullptr
};
}
}
}
#endif
#endif
}
}
lib/pls/include/pls/internal/base/error_handling.h
View file @
c25e6134
...
@@ -16,6 +16,6 @@
...
@@ -16,6 +16,6 @@
void
pls_error
(
const
char
*
msg
);
void
pls_error
(
const
char
*
msg
);
// TODO: Distinguish between debug/internal asserts and production asserts.
// TODO: Distinguish between debug/internal asserts and production asserts.
#define PLS_ASSERT(cond, msg)
//
if (!(cond)) { pls_error(msg); }
#define PLS_ASSERT(cond, msg) if (!(cond)) { pls_error(msg); }
#endif //PLS_ERROR_HANDLING_H
#endif //PLS_ERROR_HANDLING_H
lib/pls/include/pls/internal/helpers/tsan_fiber_api.h
0 → 100644
View file @
c25e6134
#ifndef PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
#define PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
extern
"C"
{
// Fiber switching API.
// - TSAN context for fiber can be created by __tsan_create_fiber
// and freed by __tsan_destroy_fiber.
// - TSAN context of current fiber or thread can be obtained
// by calling __tsan_get_current_fiber.
// - __tsan_switch_to_fiber should be called immediatly before switch
// to fiber, such as call of swapcontext.
// - Fiber name can be set by __tsan_set_fiber_name.
void
*
__tsan_get_current_fiber
(
void
);
void
*
__tsan_create_fiber
(
unsigned
flags
);
void
__tsan_destroy_fiber
(
void
*
fiber
);
void
__tsan_switch_to_fiber
(
void
*
fiber
,
unsigned
flags
);
void
__tsan_set_fiber_name
(
void
*
fiber
,
const
char
*
name
);
};
#endif //PREDICTABLE_PARALLEL_PATTERNS_LIB_PLS_INCLUDE_PLS_INTERNAL_HELPERS_TSAN_FIBER_API_H_
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment