forked from OctaForge/libostd
initial import of context switching assembly from boost.context
This commit is contained in:
parent
8ecaa338bc
commit
ce2a8ed758
32
src/asm/README.md
Normal file
32
src/asm/README.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
*Last sync: 82293a2c03ac2571aafa181ea58a67375a13ceb9.*
|
||||||
|
|
||||||
|
This directory contains assembly context switching code for different platforms,
|
||||||
|
taken from the Boost.Context library and adapted to OctaSTD' needs. The files
|
||||||
|
are licensed under the Boost Software License, version 1.0, unless specified
|
||||||
|
otherwise.
|
||||||
|
|
||||||
|
**The license text goes as follows:**
|
||||||
|
|
||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
86
src/asm/arm/jump_arm_aapcs_elf_gas.S
Normal file
86
src/asm/arm/jump_arm_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
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| | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_jump_fcontext,%function
|
||||||
|
ostd_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 ostd_jump_fcontext,.-ostd_jump_fcontext
|
||||||
|
|
||||||
|
@ Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
95
src/asm/arm/jump_arm_aapcs_macho_gas.S
Normal file
95
src/asm/arm/jump_arm_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_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}
|
81
src/asm/arm/jump_arm_aapcs_pe_armasm.asm
Normal file
81
src/asm/arm/jump_arm_aapcs_pe_armasm.asm
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
;/*
|
||||||
|
; 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 ostd_jump_fcontext
|
||||||
|
|
||||||
|
ostd_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
|
79
src/asm/arm/make_arm_aapcs_elf_gas.S
Normal file
79
src/asm/arm/make_arm_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
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| | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_make_fcontext,%function
|
||||||
|
ostd_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, #128
|
||||||
|
|
||||||
|
@ third arg of ostd_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 ostd_make_fcontext,.-ostd_make_fcontext
|
||||||
|
|
||||||
|
@ Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
71
src/asm/arm/make_arm_aapcs_macho_gas.S
Normal file
71
src/asm/arm/make_arm_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_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, #128
|
||||||
|
|
||||||
|
@ third arg of ostd_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
|
77
src/asm/arm/make_arm_aapcs_pe_armasm.asm
Normal file
77
src/asm/arm/make_arm_aapcs_pe_armasm.asm
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
;/*
|
||||||
|
; 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 ostd_make_fcontext
|
||||||
|
IMPORT _exit
|
||||||
|
|
||||||
|
ostd_make_fcontext PROC
|
||||||
|
; first arg of ostd_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 ostd_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 ostd_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
|
91
src/asm/arm/ontop_arm_aapcs_elf_gas.S
Normal file
91
src/asm/arm/ontop_arm_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
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| | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_ontop_fcontext,%function
|
||||||
|
ostd_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 ostd_ontop_fcontext,.-ostd_ontop_fcontext
|
||||||
|
|
||||||
|
@ Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
100
src/asm/arm/ontop_arm_aapcs_macho_gas.S
Normal file
100
src/asm/arm/ontop_arm_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_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
|
86
src/asm/arm/ontop_arm_aapcs_pe_armasm.asm
Normal file
86
src/asm/arm/ontop_arm_aapcs_pe_armasm.asm
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
;/*
|
||||||
|
; 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 ostd_ontop_fcontext
|
||||||
|
|
||||||
|
ostd_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
|
113
src/asm/arm64/jump_arm64_aapcs_elf_gas.S
Normal file
113
src/asm/arm64/jump_arm64_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
.align 2
|
||||||
|
.global ostd_jump_fcontext
|
||||||
|
.type ostd_jump_fcontext, %function
|
||||||
|
ostd_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 ostd_jump_fcontext,.-ostd_jump_fcontext
|
||||||
|
# Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
109
src/asm/arm64/jump_arm64_aapcs_macho_gas.S
Normal file
109
src/asm/arm64/jump_arm64_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_jump_fcontext
|
||||||
|
.balign 16
|
||||||
|
_ostd_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
|
84
src/asm/arm64/make_arm64_aapcs_elf_gas.S
Normal file
84
src/asm/arm64/make_arm64_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
.align 2
|
||||||
|
.global ostd_make_fcontext
|
||||||
|
.type ostd_make_fcontext, %function
|
||||||
|
ostd_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 ostd_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 ostd_make_fcontext,.-ostd_make_fcontext
|
||||||
|
# Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
88
src/asm/arm64/make_arm64_aapcs_macho_gas.S
Normal file
88
src/asm/arm64/make_arm64_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_make_fcontext
|
||||||
|
.balign 16
|
||||||
|
|
||||||
|
_ostd_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 ostd_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
|
||||||
|
|
||||||
|
|
112
src/asm/arm64/ontop_arm64_aapcs_elf_gas.S
Normal file
112
src/asm/arm64/ontop_arm64_aapcs_elf_gas.S
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
.align 2
|
||||||
|
.global ostd_ontop_fcontext
|
||||||
|
.type ostd_ontop_fcontext, %function
|
||||||
|
ostd_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 ostd_ontop_fcontext,.-ostd_ontop_fcontext
|
||||||
|
# Mark that we don't need executable stack.
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
108
src/asm/arm64/ontop_arm64_aapcs_macho_gas.S
Normal file
108
src/asm/arm64/ontop_arm64_aapcs_macho_gas.S
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_ontop_fcontext
|
||||||
|
.balign 16
|
||||||
|
_ostd_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
|
113
src/asm/i386/jump_i386_ms_pe_gas.asm
Normal file
113
src/asm/i386/jump_i386_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
* | 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| *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
**************************************************************************************/
|
||||||
|
|
||||||
|
.file "jump_i386_ms_pe_gas.asm"
|
||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl _ostd_jump_fcontext
|
||||||
|
.def _ostd_jump_fcontext; .scl 2; .type 32; .endef
|
||||||
|
_ostd_jump_fcontext:
|
||||||
|
/* prepare stack */
|
||||||
|
leal -0x2c(%esp), %esp
|
||||||
|
|
||||||
|
/* save MMX control- and status-word */
|
||||||
|
stmxcsr (%esp)
|
||||||
|
/* save x87 control-word */
|
||||||
|
fnstcw 0x4(%esp)
|
||||||
|
|
||||||
|
/* 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 ostd_jump_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x30(%esp), %ecx
|
||||||
|
|
||||||
|
/* restore ESP (pointing to context-data) from ECX */
|
||||||
|
movl %ecx, %esp
|
||||||
|
|
||||||
|
/* restore MMX control- and status-word */
|
||||||
|
ldmxcsr (%esp)
|
||||||
|
/* restore x87 control-word */
|
||||||
|
fldcw 0x4(%esp)
|
||||||
|
|
||||||
|
/* 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:\"ostd_jump_fcontext\""
|
112
src/asm/i386/jump_i386_ms_pe_masm.asm
Normal file
112
src/asm/i386/jump_i386_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
ostd_jump_fcontext PROC OSTD_CONTEXT_EXPORT
|
||||||
|
; prepare stack
|
||||||
|
lea esp, [esp-02ch]
|
||||||
|
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [esp]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [esp+04h]
|
||||||
|
|
||||||
|
assume fs:nothing
|
||||||
|
; load NT_TIB into ECX
|
||||||
|
mov edx, fs:[018h]
|
||||||
|
assume fs:error
|
||||||
|
; load fiber local storage
|
||||||
|
mov eax, [edx+010h]
|
||||||
|
mov [esp+08h], eax
|
||||||
|
; load current deallocation stack
|
||||||
|
mov eax, [edx+0e0ch]
|
||||||
|
mov [esp+0ch], eax
|
||||||
|
; load current stack limit
|
||||||
|
mov eax, [edx+08h]
|
||||||
|
mov [esp+010h], eax
|
||||||
|
; load current stack base
|
||||||
|
mov eax, [edx+04h]
|
||||||
|
mov [esp+014h], eax
|
||||||
|
; load current SEH exception list
|
||||||
|
mov eax, [edx]
|
||||||
|
mov [esp+018h], eax
|
||||||
|
|
||||||
|
mov [esp+01ch], edi ; save EDI
|
||||||
|
mov [esp+020h], esi ; save ESI
|
||||||
|
mov [esp+024h], ebx ; save EBX
|
||||||
|
mov [esp+028h], ebp ; save EBP
|
||||||
|
|
||||||
|
; store ESP (pointing to context-data) in EAX
|
||||||
|
mov eax, esp
|
||||||
|
|
||||||
|
; firstarg of ostd_jump_fcontext() == fcontext to jump to
|
||||||
|
mov ecx, [esp+030h]
|
||||||
|
|
||||||
|
; restore ESP (pointing to context-data) from ECX
|
||||||
|
mov esp, ecx
|
||||||
|
|
||||||
|
; restore MMX control- and status-word
|
||||||
|
ldmxcsr [esp]
|
||||||
|
; restore x87 control-word
|
||||||
|
fldcw [esp+04h]
|
||||||
|
|
||||||
|
assume fs:nothing
|
||||||
|
; load NT_TIB into EDX
|
||||||
|
mov edx, fs:[018h]
|
||||||
|
assume fs:error
|
||||||
|
; restore fiber local storage
|
||||||
|
mov ecx, [esp+08h]
|
||||||
|
mov [edx+010h], ecx
|
||||||
|
; restore current deallocation stack
|
||||||
|
mov ecx, [esp+0ch]
|
||||||
|
mov [edx+0e0ch], ecx
|
||||||
|
; restore current stack limit
|
||||||
|
mov ecx, [esp+010h]
|
||||||
|
mov [edx+08h], ecx
|
||||||
|
; restore current stack base
|
||||||
|
mov ecx, [esp+014h]
|
||||||
|
mov [edx+04h], ecx
|
||||||
|
; restore current SEH exception list
|
||||||
|
mov ecx, [esp+018h]
|
||||||
|
mov [edx], ecx
|
||||||
|
|
||||||
|
mov ecx, [esp+02ch] ; restore EIP
|
||||||
|
|
||||||
|
mov edi, [esp+01ch] ; restore EDI
|
||||||
|
mov esi, [esp+020h] ; restore ESI
|
||||||
|
mov ebx, [esp+024h] ; restore EBX
|
||||||
|
mov ebp, [esp+028h] ; restore EBP
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea esp, [esp+030h]
|
||||||
|
|
||||||
|
; return transfer_t
|
||||||
|
; FCTX == EAX, DATA == EDX
|
||||||
|
mov edx, [eax+034h]
|
||||||
|
|
||||||
|
; jump to context
|
||||||
|
jmp ecx
|
||||||
|
ostd_jump_fcontext ENDP
|
||||||
|
END
|
78
src/asm/i386/jump_i386_sysv_elf_gas.S
Normal file
78
src/asm/i386/jump_i386_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_jump_fcontext,@function
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
leal -0x18(%esp), %esp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%esp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%esp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_jump_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x20(%esp), %eax
|
||||||
|
|
||||||
|
/* second arg of ostd_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 */
|
||||||
|
|
||||||
|
ldmxcsr (%esp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%esp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_jump_fcontext,.-ostd_jump_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
73
src/asm/i386/jump_i386_sysv_macho_gas.S
Normal file
73
src/asm/i386/jump_i386_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl _ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_jump_fcontext:
|
||||||
|
leal -0x18(%esp), %esp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%esp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%esp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_jump_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x20(%esp), %eax
|
||||||
|
|
||||||
|
/* second arg of ostd_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 */
|
||||||
|
|
||||||
|
ldmxcsr (%esp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%esp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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
|
147
src/asm/i386/make_i386_ms_pe_gas.asm
Normal file
147
src/asm/i386/make_i386_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
* | 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| *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
**************************************************************************************/
|
||||||
|
|
||||||
|
.file "make_i386_ms_pe_gas.asm"
|
||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl _ostd_make_fcontext
|
||||||
|
.def _ostd_make_fcontext; .scl 2; .type 32; .endef
|
||||||
|
_ostd_make_fcontext:
|
||||||
|
/* first arg of ostd_make_fcontext() == top of context-stack */
|
||||||
|
movl 0x04(%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 */
|
||||||
|
/* 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 ostd_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 ostd_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 ostd_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 ostd_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:\"ostd_make_fcontext\""
|
140
src/asm/i386/make_i386_ms_pe_masm.asm
Normal file
140
src/asm/i386/make_i386_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
ostd_make_fcontext PROC OSTD_CONTEXT_EXPORT
|
||||||
|
; first arg of ostd_make_fcontext() == top of context-stack
|
||||||
|
mov eax, [esp+04h]
|
||||||
|
|
||||||
|
; reserve space for first argument of context-function
|
||||||
|
; EAX might already point to a 16byte border
|
||||||
|
lea eax, [eax-08h]
|
||||||
|
|
||||||
|
; 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-040h]
|
||||||
|
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [eax]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [eax+04h]
|
||||||
|
|
||||||
|
; first arg of ostd_make_fcontext() == top of context-stack
|
||||||
|
mov ecx, [esp+04h]
|
||||||
|
; save top address of context stack as 'base'
|
||||||
|
mov [eax+014h], ecx
|
||||||
|
; second arg of ostd_make_fcontext() == size of context-stack
|
||||||
|
mov edx, [esp+08h]
|
||||||
|
; 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+010h], ecx
|
||||||
|
; save bottom address of context-stack as 'dealloction stack'
|
||||||
|
mov [eax+0ch], ecx
|
||||||
|
; set fiber-storage to zero
|
||||||
|
xor ecx, ecx
|
||||||
|
mov [eax+08h], ecx
|
||||||
|
|
||||||
|
; third arg of ostd_make_fcontext() == address of context-function
|
||||||
|
; stored in EBX
|
||||||
|
mov ecx, [esp+0ch]
|
||||||
|
mov [eax+024h], 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 ostd_jump_fcontext() first time
|
||||||
|
mov [eax+02ch], 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+028h], 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+04h]
|
||||||
|
; save address in ECX as SEH handler for context
|
||||||
|
mov [eax+03ch], ecx
|
||||||
|
; set ECX to -1
|
||||||
|
mov ecx, 0ffffffffh
|
||||||
|
; save ECX as next SEH item
|
||||||
|
mov [eax+038h], ecx
|
||||||
|
; load address of next SEH item
|
||||||
|
lea ecx, [eax+038h]
|
||||||
|
; save next SEH
|
||||||
|
mov [eax+018h], ecx
|
||||||
|
|
||||||
|
ret ; return pointer to context-data
|
||||||
|
|
||||||
|
trampoline:
|
||||||
|
; move transport_t for entering context-function
|
||||||
|
; FCTX == EAX, DATA == EDX
|
||||||
|
mov [esp], eax
|
||||||
|
mov [esp+04h], 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
|
||||||
|
ostd_make_fcontext ENDP
|
||||||
|
END
|
106
src/asm/i386/make_i386_sysv_elf_gas.S
Normal file
106
src/asm/i386/make_i386_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_make_fcontext,@function
|
||||||
|
ostd_make_fcontext:
|
||||||
|
/* first arg of ostd_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 ostd_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 ostd_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 ostd_make_fcontext,.-ostd_make_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
95
src/asm/i386/make_i386_sysv_macho_gas.S
Normal file
95
src/asm/i386/make_i386_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl _ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_make_fcontext:
|
||||||
|
/* first arg of ostd_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 ostd_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 ostd_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:
|
||||||
|
/* exit code is zero */
|
||||||
|
xorl %eax, %eax
|
||||||
|
movl %eax, (%esp)
|
||||||
|
/* exit application */
|
||||||
|
call __exit
|
||||||
|
hlt
|
121
src/asm/i386/ontop_i386_ms_pe_gas.asm
Normal file
121
src/asm/i386/ontop_i386_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
* | 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| *
|
||||||
|
* --------------------------------------------------------------------------------- *
|
||||||
|
**************************************************************************************/
|
||||||
|
|
||||||
|
.file "ontop_i386_ms_pe_gas.asm"
|
||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl _ostd_ontop_fcontext
|
||||||
|
.def _ostd_ontop_fcontext; .scl 2; .type 32; .endef
|
||||||
|
_ostd_ontop_fcontext:
|
||||||
|
/* prepare stack */
|
||||||
|
leal -0x2c(%esp), %esp
|
||||||
|
|
||||||
|
/* save MMX control- and status-word */
|
||||||
|
stmxcsr (%esp)
|
||||||
|
/* save x87 control-word */
|
||||||
|
fnstcw 0x4(%esp)
|
||||||
|
|
||||||
|
/* 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 ostd_ontop_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x30(%esp), %eax
|
||||||
|
|
||||||
|
/* pass parent fcontext_t */
|
||||||
|
movl %ecx, 0x30(%eax)
|
||||||
|
|
||||||
|
/* second arg of ostd_ontop_fcontext() == data to be transferred */
|
||||||
|
movl 0x34(%esp), %ecx
|
||||||
|
|
||||||
|
/* pass data */
|
||||||
|
movl %ecx, 0x34(%eax)
|
||||||
|
|
||||||
|
/* third arg of ostd_ontop_fcontext() == ontop-function */
|
||||||
|
movl 0x38(%esp), %ecx
|
||||||
|
|
||||||
|
/* restore ESP (pointing to context-data) from EDX */
|
||||||
|
movl %eax, %esp
|
||||||
|
|
||||||
|
/* restore MMX control- and status-word */
|
||||||
|
ldmxcsr (%esp)
|
||||||
|
/* restore x87 control-word */
|
||||||
|
fldcw 0x4(%esp)
|
||||||
|
|
||||||
|
/* 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:\"ostd_ontop_fcontext\""
|
120
src/asm/i386/ontop_i386_ms_pe_masm.asm
Normal file
120
src/asm/i386/ontop_i386_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
ostd_ontop_fcontext PROC OSTD_CONTEXT_EXPORT
|
||||||
|
; prepare stack
|
||||||
|
lea esp, [esp-02ch]
|
||||||
|
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [esp]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [esp+04h]
|
||||||
|
|
||||||
|
assume fs:nothing
|
||||||
|
; load NT_TIB into ECX
|
||||||
|
mov edx, fs:[018h]
|
||||||
|
assume fs:error
|
||||||
|
; load fiber local storage
|
||||||
|
mov eax, [edx+010h]
|
||||||
|
mov [esp+08h], eax
|
||||||
|
; load current deallocation stack
|
||||||
|
mov eax, [edx+0e0ch]
|
||||||
|
mov [esp+0ch], eax
|
||||||
|
; load current stack limit
|
||||||
|
mov eax, [edx+08h]
|
||||||
|
mov [esp+010h], eax
|
||||||
|
; load current stack base
|
||||||
|
mov eax, [edx+04h]
|
||||||
|
mov [esp+014h], eax
|
||||||
|
; load current SEH exception list
|
||||||
|
mov eax, [edx]
|
||||||
|
mov [esp+018h], eax
|
||||||
|
|
||||||
|
mov [esp+01ch], edi ; save EDI
|
||||||
|
mov [esp+020h], esi ; save ESI
|
||||||
|
mov [esp+024h], ebx ; save EBX
|
||||||
|
mov [esp+028h], ebp ; save EBP
|
||||||
|
|
||||||
|
; store ESP (pointing to context-data) in ECX
|
||||||
|
mov ecx, esp
|
||||||
|
|
||||||
|
; first arg of ostd_ontop_fcontext() == fcontext to jump to
|
||||||
|
mov eax, [esp+030h]
|
||||||
|
|
||||||
|
; pass parent fcontext_t
|
||||||
|
mov [eax+030h], ecx
|
||||||
|
|
||||||
|
; second arg of ostd_ontop_fcontext() == data to be transferred
|
||||||
|
mov ecx, [esp+034h]
|
||||||
|
|
||||||
|
; pass data
|
||||||
|
mov [eax+034h], ecx
|
||||||
|
|
||||||
|
; third arg of ostd_ontop_fcontext() == ontop-function
|
||||||
|
mov ecx, [esp+038h]
|
||||||
|
|
||||||
|
; restore ESP (pointing to context-data) from EAX
|
||||||
|
mov esp, eax
|
||||||
|
|
||||||
|
; restore MMX control- and status-word
|
||||||
|
ldmxcsr [esp]
|
||||||
|
; restore x87 control-word
|
||||||
|
fldcw [esp+04h]
|
||||||
|
|
||||||
|
assume fs:nothing
|
||||||
|
; load NT_TIB into EDX
|
||||||
|
mov edx, fs:[018h]
|
||||||
|
assume fs:error
|
||||||
|
; restore fiber local storage
|
||||||
|
mov eax, [esp+08h]
|
||||||
|
mov [edx+010h], eax
|
||||||
|
; restore current deallocation stack
|
||||||
|
mov eax, [esp+0ch]
|
||||||
|
mov [edx+0e0ch], eax
|
||||||
|
; restore current stack limit
|
||||||
|
mov eax, [esp+010h]
|
||||||
|
mov [edx+08h], eax
|
||||||
|
; restore current stack base
|
||||||
|
mov eax, [esp+014h]
|
||||||
|
mov [edx+04h], eax
|
||||||
|
; restore current SEH exception list
|
||||||
|
mov eax, [esp+018h]
|
||||||
|
mov [edx], eax
|
||||||
|
|
||||||
|
mov edi, [esp+01ch] ; restore EDI
|
||||||
|
mov esi, [esp+020h] ; restore ESI
|
||||||
|
mov ebx, [esp+024h] ; restore EBX
|
||||||
|
mov ebp, [esp+028h] ; restore EBP
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea esp, [esp+02ch]
|
||||||
|
|
||||||
|
; keep return-address on stack
|
||||||
|
|
||||||
|
; jump to context
|
||||||
|
jmp ecx
|
||||||
|
ostd_ontop_fcontext ENDP
|
||||||
|
END
|
85
src/asm/i386/ontop_i386_sysv_elf_gas.S
Normal file
85
src/asm/i386/ontop_i386_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_ontop_fcontext,@function
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
leal -0x18(%esp), %esp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%esp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%esp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_ontop_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x20(%esp), %eax
|
||||||
|
|
||||||
|
/* pass parent fcontext_t */
|
||||||
|
movl %ecx, 0x20(%eax)
|
||||||
|
|
||||||
|
/* second arg of ostd_ontop_fcontext() == data to be transferred */
|
||||||
|
movl 0x24(%esp), %ecx
|
||||||
|
|
||||||
|
/* pass data */
|
||||||
|
movl %ecx, 0x24(%eax)
|
||||||
|
|
||||||
|
/* third arg of ostd_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)
|
||||||
|
|
||||||
|
ldmxcsr (%esp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%esp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_ontop_fcontext,.-ostd_ontop_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
80
src/asm/i386/ontop_i386_sysv_macho_gas.S
Normal file
80
src/asm/i386/ontop_i386_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ---------------------------------------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl _ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_ontop_fcontext:
|
||||||
|
leal -0x18(%esp), %esp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%esp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%esp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_ontop_fcontext() == fcontext to jump to */
|
||||||
|
movl 0x20(%esp), %eax
|
||||||
|
|
||||||
|
/* pass parent fcontext_t */
|
||||||
|
movl %ecx, 0x20(%eax)
|
||||||
|
|
||||||
|
/* second arg of ostd_ontop_fcontext() == data to be transferred */
|
||||||
|
movl 0x24(%esp), %ecx
|
||||||
|
|
||||||
|
/* pass data */
|
||||||
|
movl %ecx, 0x24(%eax)
|
||||||
|
|
||||||
|
/* third arg of ostd_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)
|
||||||
|
|
||||||
|
ldmxcsr (%esp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%esp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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
|
56
src/asm/jump_all_gas.S
Normal file
56
src/asm/jump_all_gas.S
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/* A stub file that includes the right assembly according to the target
|
||||||
|
* architecture and operating system, for gas only.
|
||||||
|
*
|
||||||
|
* This file is a part of OctaSTD, provided to you under the NCSA license.
|
||||||
|
* See the COPYING.md file in the main distribution for further information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "i386/jump_i386_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "i386/jump_i386_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "i386/jump_i386_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "x86_64/jump_x86_64_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "x86_64/jump_x86_64_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "x86_64/jump_x86_64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc32/jump_ppc32_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc32/jump_ppc32_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc32/jump_ppc32_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc64/jump_ppc64_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc64/jump_ppc64_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc64/jump_ppc64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm64/jump_arm64_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm64/jump_arm64_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__arm__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm/jump_arm_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm/jump_arm_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__mips__)
|
||||||
|
# include "mips32/jump_mips32_o32_elf_gas.S"
|
||||||
|
#else
|
||||||
|
#error "Unsupported architecture"
|
||||||
|
#endif
|
56
src/asm/make_all_gas.S
Normal file
56
src/asm/make_all_gas.S
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/* A stub file that includes the right assembly according to the target
|
||||||
|
* architecture and operating system, for gas only.
|
||||||
|
*
|
||||||
|
* This file is a part of OctaSTD, provided to you under the NCSA license.
|
||||||
|
* See the COPYING.md file in the main distribution for further information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "i386/make_i386_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "i386/make_i386_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "i386/make_i386_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "x86_64/make_x86_64_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "x86_64/make_x86_64_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "x86_64/make_x86_64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc32/make_ppc32_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc32/make_ppc32_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc32/make_ppc32_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc64/make_ppc64_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc64/make_ppc64_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc64/make_ppc64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm64/make_arm64_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm64/make_arm64_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__arm__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm/make_arm_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm/make_arm_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__mips__)
|
||||||
|
# include "mips32/make_mips32_o32_elf_gas.S"
|
||||||
|
#else
|
||||||
|
#error "Unsupported architecture"
|
||||||
|
#endif
|
118
src/asm/mips32/jump_mips32_o32_elf_gas.S
Normal file
118
src/asm/mips32/jump_mips32_o32_elf_gas.S
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | GP | FCTX| DATA| | | | | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
* *****************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_jump_fcontext,@function
|
||||||
|
.ent ostd_jump_fcontext
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
# reserve space on stack
|
||||||
|
addiu $sp, $sp, -112
|
||||||
|
|
||||||
|
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 $t0, 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, 112
|
||||||
|
|
||||||
|
# return transfer_t from jump
|
||||||
|
sw $a0, ($t0) # fctx of transfer_t
|
||||||
|
sw $a2, 4($t0) # 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 ostd_jump_fcontext
|
||||||
|
.size ostd_jump_fcontext, .-ostd_jump_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
118
src/asm/mips32/make_mips32_o32_elf_gas.S
Normal file
118
src/asm/mips32/make_mips32_o32_elf_gas.S
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | FP |hiddn| RA | PC | GP | FCTX| DATA| | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
* *****************************************************/
|
||||||
|
/*******************************************************
|
||||||
|
* *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | 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 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | GP | FCTX| DATA| | | | | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
* *****************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_make_fcontext,@function
|
||||||
|
.ent ostd_make_fcontext
|
||||||
|
ostd_make_fcontext:
|
||||||
|
#ifdef __PIC__
|
||||||
|
.set noreorder
|
||||||
|
.cpload $t9
|
||||||
|
.set reorder
|
||||||
|
#endif
|
||||||
|
# first arg of ostd_make_fcontext() == top address of context-stack
|
||||||
|
move $v0, $a0
|
||||||
|
|
||||||
|
# shift address in A0 to lower 16 byte boundary
|
||||||
|
move $v1, $v0
|
||||||
|
li $v0, -16 # 0xfffffffffffffff0
|
||||||
|
and $v0, $v1, $v0
|
||||||
|
|
||||||
|
# reserve space for context-data on context-stack
|
||||||
|
# including 48 byte of shadow space (sp % 16 == 0)
|
||||||
|
addiu $v0, $v0, -112
|
||||||
|
|
||||||
|
# third arg of ostd_make_fcontext() == address of context-function
|
||||||
|
sw $a2, 92($v0)
|
||||||
|
# save global pointer in context-data
|
||||||
|
sw $gp, 96($v0)
|
||||||
|
|
||||||
|
# compute address of returned transfer_t
|
||||||
|
addiu $t0, $v0, 52
|
||||||
|
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:
|
||||||
|
lw $gp, 0($sp)
|
||||||
|
# allocate stack space (contains shadow space for subroutines)
|
||||||
|
addiu $sp, $sp, -32
|
||||||
|
# save return address
|
||||||
|
sw $ra, 28($sp)
|
||||||
|
|
||||||
|
# restore GP (global pointer)
|
||||||
|
# move $gp, $s1
|
||||||
|
# exit code is zero
|
||||||
|
move $a0, $zero
|
||||||
|
# address of exit
|
||||||
|
lw $t9, %call16(_exit)($gp)
|
||||||
|
# exit application
|
||||||
|
jalr $t9
|
||||||
|
.end ostd_make_fcontext
|
||||||
|
.size ostd_make_fcontext, .-ostd_make_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
119
src/asm/mips32/ontop_mips32_o32_elf_gas.S
Normal file
119
src/asm/mips32/ontop_mips32_o32_elf_gas.S
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
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 | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* | GP | FCTX| DATA| | | | | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
* *****************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_ontop_fcontext,@function
|
||||||
|
.ent ostd_ontop_fcontext
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
# reserve space on stack
|
||||||
|
addiu $sp, $sp, -112
|
||||||
|
|
||||||
|
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 $t0, 84($sp) # restore hidden, address of returned transfer_t
|
||||||
|
lw $ra, 88($sp) # restore RA
|
||||||
|
|
||||||
|
# load PC
|
||||||
|
lw $t9, 44($sp)
|
||||||
|
|
||||||
|
# adjust stack
|
||||||
|
addiu $sp, $sp, 112
|
||||||
|
|
||||||
|
# return transfer_t from jump
|
||||||
|
sw $a0, ($t0) # fctx of transfer_t
|
||||||
|
sw $a2, 4($t0) # data of transfer_t
|
||||||
|
# pass transfer_t as first arg in context function
|
||||||
|
# A0 == hidden, A1 == fctx, A2 == data
|
||||||
|
move $a1, $a0
|
||||||
|
move $a0, $t0
|
||||||
|
|
||||||
|
# jump to context
|
||||||
|
jr $a3
|
||||||
|
.end ostd_ontop_fcontext
|
||||||
|
.size ostd_ontop_fcontext, .-ostd_ontop_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
56
src/asm/ontop_all_gas.S
Normal file
56
src/asm/ontop_all_gas.S
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/* A stub file that includes the right assembly according to the target
|
||||||
|
* architecture and operating system, for gas only.
|
||||||
|
*
|
||||||
|
* This file is a part of OctaSTD, provided to you under the NCSA license.
|
||||||
|
* See the COPYING.md file in the main distribution for further information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "i386/ontop_i386_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "i386/ontop_i386_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "i386/ontop_i386_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "x86_64/ontop_x86_64_sysv_macho_gas.S"
|
||||||
|
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
||||||
|
# include "x86_64/ontop_x86_64_ms_pe_gas.asm"
|
||||||
|
# else
|
||||||
|
# include "x86_64/ontop_x86_64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc32/ontop_ppc32_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc32/ontop_ppc32_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc32/ontop_ppc32_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__ppc64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "ppc64/ontop_ppc64_sysv_macho_gas.S"
|
||||||
|
# elif defined(_AIX)
|
||||||
|
# include "ppc64/ontop_ppc64_sysv_xcoff_gas.S"
|
||||||
|
# else
|
||||||
|
# include "ppc64/ontop_ppc64_sysv_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm64/ontop_arm64_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm64/ontop_arm64_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__arm__)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# include "arm/ontop_arm_aapcs_macho_gas.S"
|
||||||
|
# else
|
||||||
|
# include "arm/ontop_arm_aapcs_elf_gas.S"
|
||||||
|
# endif
|
||||||
|
#elif defined(__mips__)
|
||||||
|
# include "mips32/ontop_mips32_o32_elf_gas.S"
|
||||||
|
#else
|
||||||
|
#error "Unsupported architecture"
|
||||||
|
#endif
|
206
src/asm/ppc32/jump_ppc32_sysv_elf_gas.S
Normal file
206
src/asm/ppc32/jump_ppc32_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
/*
|
||||||
|
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 ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_jump_fcontext,@function
|
||||||
|
ostd_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
|
||||||
|
.size ostd_jump_fcontext, .-ostd_jump_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
201
src/asm/ppc32/jump_ppc32_sysv_macho_gas.S
Normal file
201
src/asm/ppc32/jump_ppc32_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_jump_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_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
|
203
src/asm/ppc32/jump_ppc32_sysv_xcoff_gas.S
Normal file
203
src/asm/ppc32/jump_ppc32_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/*
|
||||||
|
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 .ostd_jump_fcontext
|
||||||
|
.globl ostd_jump_fcontext[DS]
|
||||||
|
.align 2
|
||||||
|
.csect ostd_jump_fcontext[DS]
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
.long .ostd_jump_fcontext
|
||||||
|
.ostd_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
|
142
src/asm/ppc32/make_ppc32_sysv_elf_gas.S
Normal file
142
src/asm/ppc32/make_ppc32_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
/*
|
||||||
|
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 ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_make_fcontext,@function
|
||||||
|
ostd_make_fcontext:
|
||||||
|
# save return address into R6
|
||||||
|
mflr %r6
|
||||||
|
|
||||||
|
# first arg of ostd_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 ostd_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
|
||||||
|
.size ostd_make_fcontext, .-ostd_make_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
137
src/asm/ppc32/make_ppc32_sysv_macho_gas.S
Normal file
137
src/asm/ppc32/make_ppc32_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_make_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_make_fcontext:
|
||||||
|
# save return address into R6
|
||||||
|
mflr r6
|
||||||
|
|
||||||
|
# first arg of ostd_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 ostd_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
|
138
src/asm/ppc32/make_ppc32_sysv_xcoff_gas.S
Normal file
138
src/asm/ppc32/make_ppc32_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
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 ostd_make_fcontext[DS]
|
||||||
|
.globl .ostd_make_fcontext[PR]
|
||||||
|
.align 2
|
||||||
|
.csect ostd_make_fcontext[DS]
|
||||||
|
ostd_make_fcontext:
|
||||||
|
.long .ostd_make_fcontext[PR]
|
||||||
|
.csect .ostd_make_fcontext[PR], 3
|
||||||
|
#.ostd_make_fcontext:
|
||||||
|
# save return address into R6
|
||||||
|
mflr 6
|
||||||
|
|
||||||
|
# first arg of ostd_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 ostd_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
|
206
src/asm/ppc32/ontop_ppc32_sysv_elf_gas.S
Normal file
206
src/asm/ppc32/ontop_ppc32_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
/*
|
||||||
|
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 ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
.type ostd_ontop_fcontext,@function
|
||||||
|
ostd_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
|
||||||
|
.size ostd_ontop_fcontext, .-ostd_ontop_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
201
src/asm/ppc32/ontop_ppc32_sysv_macho_gas.S
Normal file
201
src/asm/ppc32/ontop_ppc32_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_ontop_fcontext
|
||||||
|
.align 2
|
||||||
|
_ostd_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
|
203
src/asm/ppc32/ontop_ppc32_sysv_xcoff_gas.S
Normal file
203
src/asm/ppc32/ontop_ppc32_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/*
|
||||||
|
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 .ostd_ontop_fcontext
|
||||||
|
.globl ostd_ontop_fcontext[DS]
|
||||||
|
.align 2
|
||||||
|
.csect ostd_ontop_fcontext[DS]
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
.long .ostd_ontop_fcontext
|
||||||
|
.ostd_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
|
195
src/asm/ppc64/jump_ppc64_sysv_elf_gas.S
Normal file
195
src/asm/ppc64/jump_ppc64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.globl ostd_jump_fcontext
|
||||||
|
#if _CALL_ELF == 2
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
addis %r2, %r12, .TOC.-ostd_jump_fcontext@ha
|
||||||
|
addi %r2, %r2, .TOC.-ostd_jump_fcontext@l
|
||||||
|
.localentry ostd_jump_fcontext, . - ostd_jump_fcontext
|
||||||
|
#else
|
||||||
|
.section ".opd","aw"
|
||||||
|
.align 3
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.quad .L.ostd_jump_fcontext,.TOC.@tocbase,0
|
||||||
|
.type ostd_jump_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.L.ostd_jump_fcontext:
|
||||||
|
# else
|
||||||
|
.hidden .ostd_jump_fcontext
|
||||||
|
.globl .ostd_jump_fcontext
|
||||||
|
.quad .ostd_jump_fcontext,.TOC.@tocbase,0
|
||||||
|
.size ostd_jump_fcontext,24
|
||||||
|
.type .ostd_jump_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.ostd_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 %r29, 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
|
||||||
|
|
||||||
|
#if _CALL_ELF != 2
|
||||||
|
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
|
||||||
|
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
|
||||||
|
|
||||||
|
# return transfer_t
|
||||||
|
std %r6, 0(%r3)
|
||||||
|
std %r5, 8(%r3)
|
||||||
|
|
||||||
|
# jump to context
|
||||||
|
bctr
|
||||||
|
#if _CALL_ELF == 2
|
||||||
|
.size ostd_jump_fcontext, .-ostd_jump_fcontext
|
||||||
|
#else
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.size .ostd_jump_fcontext, .-.L.ostd_jump_fcontext
|
||||||
|
# else
|
||||||
|
.size .ostd_jump_fcontext, .-.ostd_jump_fcontext
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
152
src/asm/ppc64/jump_ppc64_sysv_macho_gas.S
Normal file
152
src/asm/ppc64/jump_ppc64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
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 ostd_jump_fcontext
|
||||||
|
|
||||||
|
_ostd_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 %r29, 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 r0, 176(r1)
|
||||||
|
; restore CTR
|
||||||
|
mtctr r0
|
||||||
|
|
||||||
|
; adjust stack
|
||||||
|
addi r1, r1, 184
|
||||||
|
|
||||||
|
; return transfer_t
|
||||||
|
std %r6, 0(%r3)
|
||||||
|
std %r5, 8(%r3)
|
||||||
|
|
||||||
|
; jump to context
|
||||||
|
bctr
|
84
src/asm/ppc64/jump_ppc64_sysv_xcoff_gas.S
Normal file
84
src/asm/ppc64/jump_ppc64_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
.align 2
|
||||||
|
.globl .ostd_jump_fcontext
|
||||||
|
.ostd_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
|
176
src/asm/ppc64/make_ppc64_sysv_elf_gas.S
Normal file
176
src/asm/ppc64/make_ppc64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.globl ostd_make_fcontext
|
||||||
|
#if _CALL_ELF == 2
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
ostd_make_fcontext:
|
||||||
|
addis %r2, %r12, .TOC.-ostd_make_fcontext@ha
|
||||||
|
addi %r2, %r2, .TOC.-ostd_make_fcontext@l
|
||||||
|
.localentry ostd_make_fcontext, . - ostd_make_fcontext
|
||||||
|
#else
|
||||||
|
.section ".opd","aw"
|
||||||
|
.align 3
|
||||||
|
ostd_make_fcontext:
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.quad .L.ostd_make_fcontext,.TOC.@tocbase,0
|
||||||
|
.type ostd_make_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.L.ostd_make_fcontext:
|
||||||
|
# else
|
||||||
|
.hidden .ostd_make_fcontext
|
||||||
|
.globl .ostd_make_fcontext
|
||||||
|
.quad .ostd_make_fcontext,.TOC.@tocbase,0
|
||||||
|
.size ostd_make_fcontext,24
|
||||||
|
.type .ostd_make_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.ostd_make_fcontext:
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
# save return address into R6
|
||||||
|
mflr %r6
|
||||||
|
|
||||||
|
# first arg of ostd_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 ostd_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)
|
||||||
|
|
||||||
|
# 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 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 ostd_make_fcontext, .-ostd_make_fcontext
|
||||||
|
#else
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.size .ostd_make_fcontext, .-.L.ostd_make_fcontext
|
||||||
|
# else
|
||||||
|
.size .ostd_make_fcontext, .-.ostd_make_fcontext
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
126
src/asm/ppc64/make_ppc64_sysv_macho_gas.S
Normal file
126
src/asm/ppc64/make_ppc64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_make_fcontext
|
||||||
|
_ostd_make_fcontext:
|
||||||
|
; save return address into R6
|
||||||
|
mflr r6
|
||||||
|
|
||||||
|
; first arg of ostd_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 ostd_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
|
62
src/asm/ppc64/make_ppc64_sysv_xcoff_gas.S
Normal file
62
src/asm/ppc64/make_ppc64_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
.globl ostd_make_fcontext[DS]
|
||||||
|
.globl .ostd_make_fcontext[PR]
|
||||||
|
.align 2
|
||||||
|
.csect .ostd_make_fcontext[PR], 3
|
||||||
|
.globl _ostd_make_fcontext
|
||||||
|
#._ostd_make_fcontext:
|
||||||
|
# save return address into R6
|
||||||
|
mflr 6
|
||||||
|
|
||||||
|
# first arg of ostd_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 ostd_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
|
194
src/asm/ppc64/ontop_ppc64_sysv_elf_gas.S
Normal file
194
src/asm/ppc64/ontop_ppc64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
/*
|
||||||
|
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 | | *
|
||||||
|
* ------------------------------------------------- *
|
||||||
|
* *
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
.globl ostd_ontop_fcontext
|
||||||
|
#if _CALL_ELF == 2
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
addis %r2, %r12, .TOC.-ostd_ontop_fcontext@ha
|
||||||
|
addi %r2, %r2, .TOC.-ostd_ontop_fcontext@l
|
||||||
|
.localentry ostd_ontop_fcontext, . - ostd_ontop_fcontext
|
||||||
|
#else
|
||||||
|
.section ".opd","aw"
|
||||||
|
.align 3
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.quad .L.ostd_ontop_fcontext,.TOC.@tocbase,0
|
||||||
|
.type ostd_ontop_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.L.ostd_ontop_fcontext:
|
||||||
|
# else
|
||||||
|
.hidden .ostd_ontop_fcontext
|
||||||
|
.globl .ostd_ontop_fcontext
|
||||||
|
.quad .ostd_ontop_fcontext,.TOC.@tocbase,0
|
||||||
|
.size ostd_ontop_fcontext,24
|
||||||
|
.type .ostd_ontop_fcontext,@function
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.ostd_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 %r29, 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
|
||||||
|
|
||||||
|
#if _CALL_ELF != 2
|
||||||
|
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
|
||||||
|
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
|
||||||
|
#if _CALL_ELF == 2
|
||||||
|
.size ostd_ontop_fcontext, .-ostd_ontop_fcontext
|
||||||
|
#else
|
||||||
|
# ifdef _CALL_LINUX
|
||||||
|
.size .ostd_ontop_fcontext, .-.L.ostd_ontop_fcontext
|
||||||
|
# else
|
||||||
|
.size .ostd_ontop_fcontext, .-.ostd_ontop_fcontext
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
151
src/asm/ppc64/ontop_ppc64_sysv_macho_gas.S
Normal file
151
src/asm/ppc64/ontop_ppc64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
/*
|
||||||
|
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 ostd_ontop_fcontext
|
||||||
|
|
||||||
|
_ostd_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 %r29, 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
|
83
src/asm/ppc64/ontop_ppc64_sysv_xcoff_gas.S
Normal file
83
src/asm/ppc64/ontop_ppc64_sysv_xcoff_gas.S
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
.align 2
|
||||||
|
.globl .ostd_jump_fcontext
|
||||||
|
.ostd_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 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
|
203
src/asm/x86_64/jump_x86_64_ms_pe_gas.asm
Normal file
203
src/asm/x86_64/jump_x86_64_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/*
|
||||||
|
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 ostd_jump_fcontext
|
||||||
|
.def ostd_jump_fcontext; .scl 2; .type 32; .endef
|
||||||
|
.seh_proc ostd_jump_fcontext
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
.seh_endprologue
|
||||||
|
|
||||||
|
leaq -0x118(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
|
||||||
|
/* load NT_TIB */
|
||||||
|
movq %gs:(0x30), %r10
|
||||||
|
/* save fiber local storage */
|
||||||
|
movq 0x18(%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
|
||||||
|
|
||||||
|
/* save 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
|
||||||
|
|
||||||
|
/* load NT_TIB */
|
||||||
|
movq %gs:(0x30), %r10
|
||||||
|
/* restore fiber local storage */
|
||||||
|
movq 0xb0(%rsp), %rax
|
||||||
|
movq %rax, 0x18(%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:\"ostd_jump_fcontext\""
|
201
src/asm/x86_64/jump_x86_64_ms_pe_masm.asm
Normal file
201
src/asm/x86_64/jump_x86_64_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
ostd_jump_fcontext PROC OSTD_CONTEXT_EXPORT FRAME
|
||||||
|
.endprolog
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea rsp, [rsp-0118h]
|
||||||
|
|
||||||
|
; save XMM storage
|
||||||
|
movaps [rsp], xmm6
|
||||||
|
movaps [rsp+010h], xmm7
|
||||||
|
movaps [rsp+020h], xmm8
|
||||||
|
movaps [rsp+030h], xmm9
|
||||||
|
movaps [rsp+040h], xmm10
|
||||||
|
movaps [rsp+050h], xmm11
|
||||||
|
movaps [rsp+060h], xmm12
|
||||||
|
movaps [rsp+070h], xmm13
|
||||||
|
movaps [rsp+080h], xmm14
|
||||||
|
movaps [rsp+090h], xmm15
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [rsp+0a0h]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [rsp+0a4h]
|
||||||
|
|
||||||
|
; load NT_TIB
|
||||||
|
mov r10, gs:[030h]
|
||||||
|
; save fiber local storage
|
||||||
|
mov rax, [r10+018h]
|
||||||
|
mov [rsp+0b0h], rax
|
||||||
|
; save current deallocation stack
|
||||||
|
mov rax, [r10+01478h]
|
||||||
|
mov [rsp+0b8h], rax
|
||||||
|
; save current stack limit
|
||||||
|
mov rax, [r10+010h]
|
||||||
|
mov [rsp+0c0h], rax
|
||||||
|
; save current stack base
|
||||||
|
mov rax, [r10+08h]
|
||||||
|
mov [rsp+0c8h], rax
|
||||||
|
|
||||||
|
mov [rsp+0d0h], r12 ; save R12
|
||||||
|
mov [rsp+0d8h], r13 ; save R13
|
||||||
|
mov [rsp+0e0h], r14 ; save R14
|
||||||
|
mov [rsp+0e8h], r15 ; save R15
|
||||||
|
mov [rsp+0f0h], rdi ; save RDI
|
||||||
|
mov [rsp+0f8h], rsi ; save RSI
|
||||||
|
mov [rsp+0100h], rbx ; save RBX
|
||||||
|
mov [rsp+0108h], rbp ; save RBP
|
||||||
|
|
||||||
|
mov [rsp+0110h], 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
|
||||||
|
|
||||||
|
; restore XMM storage
|
||||||
|
movaps xmm6, [rsp]
|
||||||
|
movaps xmm7, [rsp+010h]
|
||||||
|
movaps xmm8, [rsp+020h]
|
||||||
|
movaps xmm9, [rsp+030h]
|
||||||
|
movaps xmm10, [rsp+040h]
|
||||||
|
movaps xmm11, [rsp+050h]
|
||||||
|
movaps xmm12, [rsp+060h]
|
||||||
|
movaps xmm13, [rsp+070h]
|
||||||
|
movaps xmm14, [rsp+080h]
|
||||||
|
movaps xmm15, [rsp+090h]
|
||||||
|
; restore MMX control- and status-word
|
||||||
|
ldmxcsr [rsp+0a0h]
|
||||||
|
; save x87 control-word
|
||||||
|
fldcw [rsp+0a4h]
|
||||||
|
|
||||||
|
; load NT_TIB
|
||||||
|
mov r10, gs:[030h]
|
||||||
|
; restore fiber local storage
|
||||||
|
mov rax, [rsp+0b0h]
|
||||||
|
mov [r10+018h], rax
|
||||||
|
; restore current deallocation stack
|
||||||
|
mov rax, [rsp+0b8h]
|
||||||
|
mov [r10+01478h], rax
|
||||||
|
; restore current stack limit
|
||||||
|
mov rax, [rsp+0c0h]
|
||||||
|
mov [r10+010h], rax
|
||||||
|
; restore current stack base
|
||||||
|
mov rax, [rsp+0c8h]
|
||||||
|
mov [r10+08h], rax
|
||||||
|
|
||||||
|
mov r12, [rsp+0d0h] ; restore R12
|
||||||
|
mov r13, [rsp+0d8h] ; restore R13
|
||||||
|
mov r14, [rsp+0e0h] ; restore R14
|
||||||
|
mov r15, [rsp+0e8h] ; restore R15
|
||||||
|
mov rdi, [rsp+0f0h] ; restore RDI
|
||||||
|
mov rsi, [rsp+0f8h] ; restore RSI
|
||||||
|
mov rbx, [rsp+0100h] ; restore RBX
|
||||||
|
mov rbp, [rsp+0108h] ; restore RBP
|
||||||
|
|
||||||
|
mov rax, [rsp+0110h] ; restore hidden address of transport_t
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea rsp, [rsp+0118h]
|
||||||
|
|
||||||
|
; load return-address
|
||||||
|
pop r10
|
||||||
|
|
||||||
|
; transport_t returned in RAX
|
||||||
|
; return parent fcontext_t
|
||||||
|
mov [rax], r9
|
||||||
|
; return data
|
||||||
|
mov [rax+08h], r8
|
||||||
|
|
||||||
|
; transport_t as 1.arg of context-function
|
||||||
|
mov rcx, rax
|
||||||
|
|
||||||
|
; indirect jump to context
|
||||||
|
jmp r10
|
||||||
|
ostd_jump_fcontext ENDP
|
||||||
|
END
|
76
src/asm/x86_64/jump_x86_64_sysv_elf_gas.S
Normal file
76
src/asm/x86_64/jump_x86_64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
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 ostd_jump_fcontext
|
||||||
|
.type ostd_jump_fcontext,@function
|
||||||
|
.align 16
|
||||||
|
ostd_jump_fcontext:
|
||||||
|
leaq -0x38(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%rsp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%rsp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 */
|
||||||
|
|
||||||
|
ldmxcsr (%rsp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%rsp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_jump_fcontext,.-ostd_jump_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
71
src/asm/x86_64/jump_x86_64_sysv_macho_gas.S
Normal file
71
src/asm/x86_64/jump_x86_64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_jump_fcontext
|
||||||
|
.align 8
|
||||||
|
_ostd_jump_fcontext:
|
||||||
|
leaq -0x38(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%rsp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%rsp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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 */
|
||||||
|
|
||||||
|
ldmxcsr (%rsp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%rsp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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
|
169
src/asm/x86_64/make_x86_64_ms_pe_gas.asm
Normal file
169
src/asm/x86_64/make_x86_64_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
/*
|
||||||
|
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 ostd_make_fcontext
|
||||||
|
.def ostd_make_fcontext; .scl 2; .type 32; .endef
|
||||||
|
.seh_proc ostd_make_fcontext
|
||||||
|
ostd_make_fcontext:
|
||||||
|
.seh_endprologue
|
||||||
|
|
||||||
|
/* first arg of ostd_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 ostd_make_fcontext() == address of context-function */
|
||||||
|
movq %r8, 0x100(%rax)
|
||||||
|
|
||||||
|
/* first arg of ostd_make_fcontext() == top of context-stack */
|
||||||
|
/* save top address of context stack as 'base' */
|
||||||
|
movq %rcx, 0xc8(%rax)
|
||||||
|
/* second arg of ostd_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)
|
||||||
|
|
||||||
|
/* 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 ostd_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:
|
||||||
|
/* 32byte shadow-space for _exit() */
|
||||||
|
andq $-32, %rsp
|
||||||
|
/* 32byte shadow-space for _exit() are */
|
||||||
|
/* already reserved by ostd_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:\"ostd_make_fcontext\""
|
163
src/asm/x86_64/make_x86_64_ms_pe_masm.asm
Normal file
163
src/asm/x86_64/make_x86_64_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
ostd_make_fcontext PROC OSTD_CONTEXT_EXPORT FRAME
|
||||||
|
; .xdata for a function's structured exception handling unwind behavior
|
||||||
|
.endprolog
|
||||||
|
|
||||||
|
; first arg of ostd_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, 0150h
|
||||||
|
|
||||||
|
; third arg of ostd_make_fcontext() == address of context-function
|
||||||
|
; stored in RBX
|
||||||
|
mov [rax+0100h], r8
|
||||||
|
|
||||||
|
; first arg of ostd_make_fcontext() == top of context-stack
|
||||||
|
; save top address of context stack as 'base'
|
||||||
|
mov [rax+0c8h], rcx
|
||||||
|
; second arg of ostd_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+0c0h], rcx
|
||||||
|
; save address of context stack limit as 'dealloction stack'
|
||||||
|
mov [rax+0b8h], rcx
|
||||||
|
; set fiber-storage to zero
|
||||||
|
xor rcx, rcx
|
||||||
|
mov [rax+0b0h], rcx
|
||||||
|
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [rax+0a0h]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [rax+0a4h]
|
||||||
|
|
||||||
|
; compute address of transport_t
|
||||||
|
lea rcx, [rax+0140h]
|
||||||
|
; store address of transport_t in hidden field
|
||||||
|
mov [rax+0110h], 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 ostd_jump_fcontext() first time
|
||||||
|
mov [rax+0118h], 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+0108h], 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
|
||||||
|
ostd_make_fcontext ENDP
|
||||||
|
END
|
81
src/asm/x86_64/make_x86_64_sysv_elf_gas.S
Normal file
81
src/asm/x86_64/make_x86_64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
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 ostd_make_fcontext
|
||||||
|
.type ostd_make_fcontext,@function
|
||||||
|
.align 16
|
||||||
|
ostd_make_fcontext:
|
||||||
|
/* first arg of ostd_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 ostd_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 ostd_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 ostd_make_fcontext,.-ostd_make_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
76
src/asm/x86_64/make_x86_64_sysv_macho_gas.S
Normal file
76
src/asm/x86_64/make_x86_64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_make_fcontext
|
||||||
|
.align 8
|
||||||
|
_ostd_make_fcontext:
|
||||||
|
/* first arg of ostd_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 ostd_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 ostd_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
|
205
src/asm/x86_64/ontop_x86_64_ms_pe_gas.asm
Normal file
205
src/asm/x86_64/ontop_x86_64_ms_pe_gas.asm
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
/*
|
||||||
|
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 ostd_ontop_fcontext
|
||||||
|
.def ostd_ontop_fcontext; .scl 2; .type 32; .endef
|
||||||
|
.seh_proc ostd_ontop_fcontext
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
.seh_endprologue
|
||||||
|
|
||||||
|
leaq -0x118(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
|
||||||
|
/* load NT_TIB */
|
||||||
|
movq %gs:(0x30), %r10
|
||||||
|
/* save fiber local storage */
|
||||||
|
movq 0x18(%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
|
||||||
|
|
||||||
|
/* save 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
|
||||||
|
|
||||||
|
/* load NT_TIB */
|
||||||
|
movq %gs:(0x30), %r10
|
||||||
|
/* restore fiber local storage */
|
||||||
|
movq 0xb0(%rsp), %rax
|
||||||
|
movq %rax, 0x18(%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:\"ostd_ontop_fcontext\""
|
203
src/asm/x86_64/ontop_x86_64_ms_pe_masm.asm
Normal file
203
src/asm/x86_64/ontop_x86_64_ms_pe_masm.asm
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
ostd_ontop_fcontext PROC OSTD_CONTEXT_EXPORT FRAME
|
||||||
|
.endprolog
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea rsp, [rsp-0118h]
|
||||||
|
|
||||||
|
; save XMM storage
|
||||||
|
movaps [rsp], xmm6
|
||||||
|
movaps [rsp+010h], xmm7
|
||||||
|
movaps [rsp+020h], xmm8
|
||||||
|
movaps [rsp+030h], xmm9
|
||||||
|
movaps [rsp+040h], xmm10
|
||||||
|
movaps [rsp+050h], xmm11
|
||||||
|
movaps [rsp+060h], xmm12
|
||||||
|
movaps [rsp+070h], xmm13
|
||||||
|
movaps [rsp+080h], xmm14
|
||||||
|
movaps [rsp+090h], xmm15
|
||||||
|
; save MMX control- and status-word
|
||||||
|
stmxcsr [rsp+0a0h]
|
||||||
|
; save x87 control-word
|
||||||
|
fnstcw [rsp+0a4h]
|
||||||
|
|
||||||
|
; load NT_TIB
|
||||||
|
mov r10, gs:[030h]
|
||||||
|
; save fiber local storage
|
||||||
|
mov rax, [r10+018h]
|
||||||
|
mov [rsp+0b0h], rax
|
||||||
|
; save current deallocation stack
|
||||||
|
mov rax, [r10+01478h]
|
||||||
|
mov [rsp+0b8h], rax
|
||||||
|
; save current stack limit
|
||||||
|
mov rax, [r10+010h]
|
||||||
|
mov [rsp+0c0h], rax
|
||||||
|
; save current stack base
|
||||||
|
mov rax, [r10+08h]
|
||||||
|
mov [rsp+0c8h], rax
|
||||||
|
|
||||||
|
mov [rsp+0d0h], r12 ; save R12
|
||||||
|
mov [rsp+0d8h], r13 ; save R13
|
||||||
|
mov [rsp+0e0h], r14 ; save R14
|
||||||
|
mov [rsp+0e8h], r15 ; save R15
|
||||||
|
mov [rsp+0f0h], rdi ; save RDI
|
||||||
|
mov [rsp+0f8h], rsi ; save RSI
|
||||||
|
mov [rsp+0100h], rbx ; save RBX
|
||||||
|
mov [rsp+0108h], rbp ; save RBP
|
||||||
|
|
||||||
|
mov [rsp+0110h], 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
|
||||||
|
|
||||||
|
; restore XMM storage
|
||||||
|
movaps xmm6, [rsp]
|
||||||
|
movaps xmm7, [rsp+010h]
|
||||||
|
movaps xmm8, [rsp+020h]
|
||||||
|
movaps xmm9, [rsp+030h]
|
||||||
|
movaps xmm10, [rsp+040h]
|
||||||
|
movaps xmm11, [rsp+050h]
|
||||||
|
movaps xmm12, [rsp+060h]
|
||||||
|
movaps xmm13, [rsp+070h]
|
||||||
|
movaps xmm14, [rsp+080h]
|
||||||
|
movaps xmm15, [rsp+090h]
|
||||||
|
; restore MMX control- and status-word
|
||||||
|
ldmxcsr [rsp+0a0h]
|
||||||
|
; save x87 control-word
|
||||||
|
fldcw [rsp+0a4h]
|
||||||
|
|
||||||
|
; load NT_TIB
|
||||||
|
mov r10, gs:[030h]
|
||||||
|
; restore fiber local storage
|
||||||
|
mov rax, [rsp+0b0h]
|
||||||
|
mov [r10+018h], rax
|
||||||
|
; restore current deallocation stack
|
||||||
|
mov rax, [rsp+0b8h]
|
||||||
|
mov [r10+01478h], rax
|
||||||
|
; restore current stack limit
|
||||||
|
mov rax, [rsp+0c0h]
|
||||||
|
mov [r10+010h], rax
|
||||||
|
; restore current stack base
|
||||||
|
mov rax, [rsp+0c8h]
|
||||||
|
mov [r10+08h], rax
|
||||||
|
|
||||||
|
mov r12, [rsp+0d0h] ; restore R12
|
||||||
|
mov r13, [rsp+0d8h] ; restore R13
|
||||||
|
mov r14, [rsp+0e0h] ; restore R14
|
||||||
|
mov r15, [rsp+0e8h] ; restore R15
|
||||||
|
mov rdi, [rsp+0f0h] ; restore RDI
|
||||||
|
mov rsi, [rsp+0f8h] ; restore RSI
|
||||||
|
mov rbx, [rsp+0100h] ; restore RBX
|
||||||
|
mov rbp, [rsp+0108h] ; restore RBP
|
||||||
|
|
||||||
|
mov rax, [rsp+0110h] ; restore hidden address of transport_t
|
||||||
|
|
||||||
|
; prepare stack
|
||||||
|
lea rsp, [rsp+0118h]
|
||||||
|
|
||||||
|
; keep return-address on stack
|
||||||
|
|
||||||
|
; transport_t returned in RAX
|
||||||
|
; return parent fcontext_t
|
||||||
|
mov [rax], rcx
|
||||||
|
; return data
|
||||||
|
mov [rax+08h], 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
|
||||||
|
ostd_ontop_fcontext ENDP
|
||||||
|
END
|
79
src/asm/x86_64/ontop_x86_64_sysv_elf_gas.S
Normal file
79
src/asm/x86_64/ontop_x86_64_sysv_elf_gas.S
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
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 ostd_ontop_fcontext
|
||||||
|
.type ostd_ontop_fcontext,@function
|
||||||
|
.align 16
|
||||||
|
ostd_ontop_fcontext:
|
||||||
|
/* preserve ontop-function in R8 */
|
||||||
|
movq %rdx, %r8
|
||||||
|
|
||||||
|
leaq -0x38(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%rsp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%rsp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
ldmxcsr (%rsp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%rsp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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 ostd_ontop_fcontext,.-ostd_ontop_fcontext
|
||||||
|
|
||||||
|
/* Mark that we don't need executable stack. */
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
74
src/asm/x86_64/ontop_x86_64_sysv_macho_gas.S
Normal file
74
src/asm/x86_64/ontop_x86_64_sysv_macho_gas.S
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
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 _ostd_ontop_fcontext
|
||||||
|
.align 8
|
||||||
|
_ostd_ontop_fcontext:
|
||||||
|
/* preserve ontop-function in R8 */
|
||||||
|
movq %rdx, %r8
|
||||||
|
|
||||||
|
leaq -0x38(%rsp), %rsp /* prepare stack */
|
||||||
|
|
||||||
|
stmxcsr (%rsp) /* save MMX control- and status-word */
|
||||||
|
fnstcw 0x4(%rsp) /* save x87 control-word */
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
ldmxcsr (%rsp) /* restore MMX control- and status-word */
|
||||||
|
fldcw 0x4(%rsp) /* restore x87 control-word */
|
||||||
|
|
||||||
|
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
|
Loading…
Reference in a new issue