@@ -1,113 +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 jump_fcontext
-.type jump_fcontext, %function
-jump_fcontext:
- # prepare stack for GP + FPU
- sub sp, sp, #0xb0
- # save d8 - d15
- stp d8, d9, [sp, #0x00]
- stp d10, d11, [sp, #0x10]
- stp d12, d13, [sp, #0x20]
- stp d14, d15, [sp, #0x30]
- # save x19-x30
- stp x19, x20, [sp, #0x40]
- stp x21, x22, [sp, #0x50]
- stp x23, x24, [sp, #0x60]
- stp x25, x26, [sp, #0x70]
- stp x27, x28, [sp, #0x80]
- stp x29, x30, [sp, #0x90]
- # save LR as PC
- str x30, [sp, #0xa0]
- # store RSP (pointing to context-data) in X0
- mov x4, sp
- # restore RSP (pointing to context-data) from X1
- mov sp, x0
- # load d8 - d15
- ldp d8, d9, [sp, #0x00]
- ldp d10, d11, [sp, #0x10]
- ldp d12, d13, [sp, #0x20]
- ldp d14, d15, [sp, #0x30]
- # load x19-x30
- ldp x19, x20, [sp, #0x40]
- ldp x21, x22, [sp, #0x50]
- ldp x23, x24, [sp, #0x60]
- ldp x25, x26, [sp, #0x70]
- ldp x27, x28, [sp, #0x80]
- ldp x29, x30, [sp, #0x90]
- # return transfer_t from jump
- # pass transfer_t as first arg in context function
- # X0 == FCTX, X1 == DATA
- mov x0, x4
- # load pc
- ldr x4, [sp, #0xa0]
- # restore stack from GP + FPU
- add sp, sp, #0xb0
- ret x4
-.size jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+ 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 jump_fcontext
+.type jump_fcontext, %function
+jump_fcontext:
+ # prepare stack for GP + FPU
+ sub sp, sp, #0xb0
+ # save d8 - d15
+ stp d8, d9, [sp, #0x00]
+ stp d10, d11, [sp, #0x10]
+ stp d12, d13, [sp, #0x20]
+ stp d14, d15, [sp, #0x30]
+ # save x19-x30
+ stp x19, x20, [sp, #0x40]
+ stp x21, x22, [sp, #0x50]
+ stp x23, x24, [sp, #0x60]
+ stp x25, x26, [sp, #0x70]
+ stp x27, x28, [sp, #0x80]
+ stp x29, x30, [sp, #0x90]
+ # save LR as PC
+ str x30, [sp, #0xa0]
+ # store RSP (pointing to context-data) in X0
+ mov x4, sp
+ # restore RSP (pointing to context-data) from X1
+ mov sp, x0
+ # load d8 - d15
+ ldp d8, d9, [sp, #0x00]
+ ldp d10, d11, [sp, #0x10]
+ ldp d12, d13, [sp, #0x20]
+ ldp d14, d15, [sp, #0x30]
+ # load x19-x30
+ ldp x19, x20, [sp, #0x40]
+ ldp x21, x22, [sp, #0x50]
+ ldp x23, x24, [sp, #0x60]
+ ldp x25, x26, [sp, #0x70]
+ ldp x27, x28, [sp, #0x80]
+ ldp x29, x30, [sp, #0x90]
+ # return transfer_t from jump
+ # pass transfer_t as first arg in context function
+ # X0 == FCTX, X1 == DATA
+ mov x0, x4
+ # load pc
+ ldr x4, [sp, #0xa0]
+ # restore stack from GP + FPU
+ add sp, sp, #0xb0
+ ret x4
+.size jump_fcontext,.-jump_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
@@ -1,109 +1,109 @@
-.globl _jump_fcontext
-.balign 16
-_jump_fcontext:
- ; prepare stack for GP + FPU
- ; save d8 - d15
- ; save x19-x30
- stp fp, lr, [sp, #0x90]
- ; save LR as PC
- str lr, [sp, #0xa0]
- ; store RSP (pointing to context-data) in X0
- ; restore RSP (pointing to context-data) from X1
- ; load d8 - d15
- ; load x19-x30
- ldp fp, lr, [sp, #0x90]
- ; return transfer_t from jump
- ; pass transfer_t as first arg in context function
- ; X0 == FCTX, X1 == DATA
- ; load pc
- ; restore stack from GP + FPU
+.globl _jump_fcontext
+.balign 16
+_jump_fcontext:
+ ; prepare stack for GP + FPU
+ ; save d8 - d15
+ ; save x19-x30
+ stp fp, lr, [sp, #0x90]
+ ; save LR as PC
+ str lr, [sp, #0xa0]
+ ; store RSP (pointing to context-data) in X0
+ ; restore RSP (pointing to context-data) from X1
+ ; load d8 - d15
+ ; load x19-x30
+ ldp fp, lr, [sp, #0x90]
+ ; return transfer_t from jump
+ ; pass transfer_t as first arg in context function
+ ; X0 == FCTX, X1 == DATA
+ ; load pc
+ ; restore stack from GP + FPU
@@ -1,86 +1,86 @@
- Copyright Oliver Kowalke 2009.
- * | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
- * | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
- * |hiddn| v1 | v2 | v3 | v4 | v5 | v6 | v7 | *
- * | v8 | lr | pc | FCTX| DATA| | *
-.globl jump_fcontext
-.type jump_fcontext,%function
- @ 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
- @ restore S16-S31
- vldmia sp, {d8-d15}
- 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}
-@ Mark that we don't need executable stack.
+ Copyright Oliver Kowalke 2009.
+ * | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | *
+ * | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 | *
+ * |hiddn| v1 | v2 | v3 | v4 | v5 | v6 | v7 | *
+ * | v8 | lr | pc | FCTX| DATA| | *
+.globl jump_fcontext
+.type jump_fcontext,%function
+ @ 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
+ @ restore S16-S31
+ vldmia sp, {d8-d15}
+ 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}
+@ Mark that we don't need executable stack.
@@ -1,95 +1,95 @@
- * | sjlj|hiddn| v1 | v2 | v3 | v4 | v5 | v6 | *
- * | v7 | v8 | lr | pc | FCTX| DATA| | *
- @ 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}
- @ r#estore SjLj handler
- pop {v1}
- @ store SjLj handler in TLS
- str v1, [v2, #8]
+ * | sjlj|hiddn| v1 | v2 | v3 | v4 | v5 | v6 | *
+ * | v7 | v8 | lr | pc | FCTX| DATA| | *
+ @ 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}
+ @ r#estore SjLj handler
+ pop {v1}
+ @ store SjLj handler in TLS
+ str v1, [v2, #8]
@@ -1,81 +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 jump_fcontext
-jump_fcontext PROC
- ; save hidden,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]
- ; save current deallocation stack
- ldr a5, [v1, #0xe0c]
- ; store RSP (pointing to context-data) in A1
- ; restore RSP (pointing to context-data) from A2
- ; restore deallocation stack
- pop {a5}
- str a5, [v1, #0xe0c]
- ; restore stack limit
- str a5, [v1, #0x08]
- ; restore stack base
- str a5, [v1, #0x04]
- ; restore hidden,V1-V8,LR
- ; A1 == FCTX, A2 == DATA
- ; restore PC
- ENDP
- END
+;/*
+; Copyright Oliver Kowalke 2009.
+; Distributed under the Boost Software License, Version 1.0.
+; (See accompanying file LICENSE_1_0.txt or copy at
+; http://www.boost.org/LICENSE_1_0.txt)
+;*/
+; *******************************************************
+; * *
+; * ------------------------------------------------- *
+; * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+; * | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
+; * |deall|limit| base|hiddn| v1 | v2 | v3 | v4 | *
+; * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+; * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
+; * | v5 | v6 | v7 | v8 | lr | pc | FCTX| DATA| *
+ AREA |.text|, CODE
+ ALIGN 4
+ EXPORT jump_fcontext
+jump_fcontext PROC
+ ; save hidden,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]
+ ; save current deallocation stack
+ ldr a5, [v1, #0xe0c]
+ ; store RSP (pointing to context-data) in A1
+ ; restore RSP (pointing to context-data) from A2
+ ; restore deallocation stack
+ pop {a5}
+ str a5, [v1, #0xe0c]
+ ; restore stack limit
+ str a5, [v1, #0x08]
+ ; restore stack base
+ str a5, [v1, #0x04]
+ ; restore hidden,V1-V8,LR
+ ; A1 == FCTX, A2 == DATA
+ ; restore PC
+ ENDP
+ END
@@ -1,20 +1,20 @@
- Copyright Sergue E. Leontiev 2013.
-// Stub file for universal binary
-#if defined(__i386__)
- #include "jump_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "jump_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
- #include "jump_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "jump_ppc64_sysv_macho_gas.S"
-#else
- #error "No arch's"
+ Copyright Sergue E. Leontiev 2013.
+// Stub file for universal binary
+#if defined(__i386__)
+ #include "jump_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+ #include "jump_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+ #include "jump_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+ #include "jump_ppc64_sysv_macho_gas.S"
+#else
+ #error "No arch's"
@@ -1,117 +1,117 @@
- Copyright Thomas Sailer 2013.
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 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"
-.p2align 4,,15
-.def _jump_fcontext; .scl 2; .type 32; .endef
- /* prepare stack */
- leal -0x2c(%esp), %esp
-#if !defined(BOOST_USE_TSX)
- /* save MMX control- and status-word */
- stmxcsr (%esp)
- /* save x87 control-word */
- fnstcw 0x4(%esp)
- /* load NT_TIB */
- movl %fs:(0x18), %edx
- /* load fiber local storage */
- movl 0x10(%edx), %eax
- movl %eax, 0x8(%esp)
- /* load current dealloction stack */
- movl 0xe0c(%edx), %eax
- movl %eax, 0xc(%esp)
- /* load current stack limit */
- movl 0x8(%edx), %eax
- movl %eax, 0x10(%esp)
- /* load current stack base */
- movl 0x4(%edx), %eax
- movl %eax, 0x14(%esp)
- /* load current SEH exception list */
- movl (%edx), %eax
- movl %eax, 0x18(%esp)
- movl %edi, 0x1c(%esp) /* save EDI */
- movl %esi, 0x20(%esp) /* save ESI */
- movl %ebx, 0x24(%esp) /* save EBX */
- movl %ebp, 0x28(%esp) /* save EBP */
- /* store ESP (pointing to context-data) in EAX */
- movl %esp, %eax
- /* firstarg of jump_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %ecx
- /* restore ESP (pointing to context-data) from ECX */
- movl %ecx, %esp
- /* restore MMX control- and status-word */
- ldmxcsr (%esp)
- /* restore x87 control-word */
- fldcw 0x4(%esp)
- /* restore NT_TIB into 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 */
- leal 0x30(%esp), %esp
- /* return transfer_t */
- /* FCTX == EAX, DATA == EDX */
- movl 0x34(%eax), %edx
- /* jump to context */
- jmp *%ecx
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
+ Copyright Thomas Sailer 2013.
+/*************************************************************************************
+* --------------------------------------------------------------------------------- *
+* | 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"
+.p2align 4,,15
+.def _jump_fcontext; .scl 2; .type 32; .endef
+ /* prepare stack */
+ leal -0x2c(%esp), %esp
+#if !defined(BOOST_USE_TSX)
+ /* save MMX control- and status-word */
+ stmxcsr (%esp)
+ /* save x87 control-word */
+ fnstcw 0x4(%esp)
+ /* load NT_TIB */
+ movl %fs:(0x18), %edx
+ /* load fiber local storage */
+ movl 0x10(%edx), %eax
+ movl %eax, 0x8(%esp)
+ /* load current dealloction stack */
+ movl 0xe0c(%edx), %eax
+ movl %eax, 0xc(%esp)
+ /* load current stack limit */
+ movl 0x8(%edx), %eax
+ movl %eax, 0x10(%esp)
+ /* load current stack base */
+ movl 0x4(%edx), %eax
+ movl %eax, 0x14(%esp)
+ /* load current SEH exception list */
+ movl (%edx), %eax
+ movl %eax, 0x18(%esp)
+ movl %edi, 0x1c(%esp) /* save EDI */
+ movl %esi, 0x20(%esp) /* save ESI */
+ movl %ebx, 0x24(%esp) /* save EBX */
+ movl %ebp, 0x28(%esp) /* save EBP */
+ /* store ESP (pointing to context-data) in EAX */
+ movl %esp, %eax
+ /* firstarg of jump_fcontext() == fcontext to jump to */
+ movl 0x30(%esp), %ecx
+ /* restore ESP (pointing to context-data) from ECX */
+ movl %ecx, %esp
+ /* restore MMX control- and status-word */
+ ldmxcsr (%esp)
+ /* restore x87 control-word */
+ fldcw 0x4(%esp)
+ /* restore NT_TIB into 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 */
+ leal 0x30(%esp), %esp
+ /* return transfer_t */
+ /* FCTX == EAX, DATA == EDX */
+ movl 0x34(%eax), %edx
+ /* jump to context */
+ jmp *%ecx
+.section .drectve
+.ascii " -export:\"jump_fcontext\""
@@ -1,116 +1,116 @@
-; ---------------------------------------------------------------------------------
-; | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
-; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
-; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
-; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
-; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
-.386
-.XMM
-.model flat, c
-.code
-jump_fcontext PROC BOOST_CONTEXT_EXPORT
- ; prepare stack
- lea esp, [esp-02ch]
-IFNDEF BOOST_USE_TSX
- ; save MMX control- and status-word
- stmxcsr [esp]
- ; save x87 control-word
- fnstcw [esp+04h]
-ENDIF
- 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 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]
- ; load NT_TIB into EDX
- ; 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
- lea esp, [esp+030h]
- ; return transfer_t
- ; FCTX == EAX, DATA == EDX
- mov edx, [eax+034h]
- ; jump to context
- jmp ecx
-jump_fcontext ENDP
-END
+; ---------------------------------------------------------------------------------
+; | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
+; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
+; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
+; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
+; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
+.386
+.XMM
+.model flat, c
+.code
+jump_fcontext PROC BOOST_CONTEXT_EXPORT
+ ; prepare stack
+ lea esp, [esp-02ch]
+IFNDEF BOOST_USE_TSX
+ ; save MMX control- and status-word
+ stmxcsr [esp]
+ ; save x87 control-word
+ fnstcw [esp+04h]
+ENDIF
+ 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 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]
+ ; load NT_TIB into EDX
+ ; 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
+ lea esp, [esp+030h]
+ ; return transfer_t
+ ; FCTX == EAX, DATA == EDX
+ mov edx, [eax+034h]
+ ; jump to context
+ jmp ecx
+jump_fcontext ENDP
+END
@@ -1,82 +1,82 @@
-/****************************************************************************************
- * ---------------------------------------------------------------------------------- *
- * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
- * | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
- * | 0x20 | 0x24 | | *
- * | to | data | | *
- ****************************************************************************************/
-.type jump_fcontext,@function
- 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 jump_fcontext() == fcontext to jump to */
- movl 0x20(%esp), %eax
- /* second arg of jump_fcontext() == data to be transferred */
- movl 0x24(%esp), %edx
- /* restore ESP (pointing to context-data) from EAX */
- movl %eax, %esp
- /* address of returned transport_t */
- movl 0x1c(%esp), %eax
- /* return parent fcontext_t */
- movl %ecx, (%eax)
- /* return data */
- movl %edx, 0x4(%eax)
- movl 0x18(%esp), %ecx /* restore EIP */
- 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 */
-/* Mark that we don't need executable stack. */
+/****************************************************************************************
+ * ---------------------------------------------------------------------------------- *
+ * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
+ * | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
+ * | 0x20 | 0x24 | | *
+ * | to | data | | *
+ ****************************************************************************************/
+.type jump_fcontext,@function
+ 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 jump_fcontext() == fcontext to jump to */
+ movl 0x20(%esp), %eax
+ /* second arg of jump_fcontext() == data to be transferred */
+ movl 0x24(%esp), %edx
+ /* restore ESP (pointing to context-data) from EAX */
+ movl %eax, %esp
+ /* address of returned transport_t */
+ movl 0x1c(%esp), %eax
+ /* return parent fcontext_t */
+ movl %ecx, (%eax)
+ /* return data */
+ movl %edx, 0x4(%eax)
+ movl 0x18(%esp), %ecx /* restore EIP */
+ 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 */
+/* Mark that we don't need executable stack. */
@@ -1,75 +1,75 @@
- * | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | to | *
- * | 0x20 | | *
- * | data | | *
- movl 0x20(%esp), %edx
- movl %ecx, %eax
- /* returned data is stored in EDX */
- leal 0x1c(%esp), %esp /* prepare stack */
+ * | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | to | *
+ * | 0x20 | | *
+ * | data | | *
+ movl 0x20(%esp), %edx
+ movl %ecx, %eax
+ /* returned data is stored in EDX */
+ leal 0x1c(%esp), %esp /* prepare stack */
@@ -1,16 +1,16 @@
@@ -1,118 +1,118 @@
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * | F20 | F22 | F24 | F26 | *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * | F28 | F30 | S0 | S1 | S2 | S3 | *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * | GP | FCTX| DATA| | | | | | *
- * *****************************************************/
-.ent jump_fcontext
- # reserve space on stack
- addiu $sp, $sp, -96
- sw $s0, 48($sp) # save S0
- sw $s1, 52($sp) # save S1
- sw $s2, 56($sp) # save S2
- sw $s3, 60($sp) # save S3
- sw $s4, 64($sp) # save S4
- sw $s5, 68($sp) # save S5
- sw $s6, 72($sp) # save S6
- sw $s7, 76($sp) # save S7
- sw $fp, 80($sp) # save FP
- sw $a0, 84($sp) # save hidden, address of returned transfer_t
- sw $ra, 88($sp) # save RA
- sw $ra, 92($sp) # save RA as PC
-#if defined(__mips_hard_float)
- s.d $f20, ($sp) # save F20
- s.d $f22, 8($sp) # save F22
- s.d $f24, 16($sp) # save F24
- s.d $f26, 24($sp) # save F26
- s.d $f28, 32($sp) # save F28
- s.d $f30, 40($sp) # save F30
- # store SP (pointing to context-data) in A0
- move $a0, $sp
- # restore SP (pointing to context-data) from A1
- move $sp, $a1
- 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
- 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, 96
- sw $a0, ($t0) # fctx of transfer_t
- sw $a2, 4($t0) # data of transfer_t
- # A0 == fctx, A1 == data
- move $a1, $a2
- # jump to context
- jr $t9
-.end jump_fcontext
-.size jump_fcontext, .-jump_fcontext
+ * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
+ * | F20 | F22 | F24 | F26 | *
+ * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
+ * | F28 | F30 | S0 | S1 | S2 | S3 | *
+ * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
+ * | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
+ * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
+ * | GP | FCTX| DATA| | | | | | *
+ * *****************************************************/
+.ent jump_fcontext
+ # reserve space on stack
+ addiu $sp, $sp, -96
+ sw $s0, 48($sp) # save S0
+ sw $s1, 52($sp) # save S1
+ sw $s2, 56($sp) # save S2
+ sw $s3, 60($sp) # save S3
+ sw $s4, 64($sp) # save S4
+ sw $s5, 68($sp) # save S5
+ sw $s6, 72($sp) # save S6
+ sw $s7, 76($sp) # save S7
+ sw $fp, 80($sp) # save FP
+ sw $a0, 84($sp) # save hidden, address of returned transfer_t
+ sw $ra, 88($sp) # save RA
+ sw $ra, 92($sp) # save RA as PC
+#if defined(__mips_hard_float)
+ s.d $f20, ($sp) # save F20
+ s.d $f22, 8($sp) # save F22
+ s.d $f24, 16($sp) # save F24
+ s.d $f26, 24($sp) # save F26
+ s.d $f28, 32($sp) # save F28
+ s.d $f30, 40($sp) # save F30
+ # store SP (pointing to context-data) in A0
+ move $a0, $sp
+ # restore SP (pointing to context-data) from A1
+ move $sp, $a1
+ 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
+ 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, 96
+ sw $a0, ($t0) # fctx of transfer_t
+ sw $a2, 4($t0) # data of transfer_t
+ # A0 == fctx, A1 == data
+ move $a1, $a2
+ # jump to context
+ jr $t9
+.end jump_fcontext
+.size jump_fcontext, .-jump_fcontext
-#if defined(__ppc__)
+#if defined(__ppc__)
@@ -1,206 +1,206 @@
-/******************************************************
- * | F14 | F15 | F16 | F17 | *
- * | F18 | F19 | F20 | F21 | *
- * | F22 | F23 | F24 | F25 | *
- * | F26 | F27 | F28 | F29 | *
- * | 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| | *
- 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)
- 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
- lwz %r0, 240(%r1)
- # restore CTR
- mtctr %r0
- addi %r1, %r1, 244
- # return transfer_t
- stw %r6, 0(%r3)
- stw %r5, 4(%r3)
- bctr
+/******************************************************
+ * | F14 | F15 | F16 | F17 | *
+ * | F18 | F19 | F20 | F21 | *
+ * | F22 | F23 | F24 | F25 | *
+ * | F26 | F27 | F28 | F29 | *
+ * | 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| | *
+ 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)
+ 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
+ lwz %r0, 240(%r1)
+ # restore CTR
+ mtctr %r0
+ addi %r1, %r1, 244
+ # return transfer_t
+ stw %r6, 0(%r3)
+ stw %r5, 4(%r3)
+ bctr
@@ -1,201 +1,201 @@
- ; 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
- mfcr r0
- stw r0, 232(r1)
- mflr r0
- stw r0, 236(r1)
- stw r0, 240(r1)
- mr r6, r1
- 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
- lwz r0, 232(r1)
- mtcr r0
- lwz r0, 236(r1)
- mtlr r0
- lwz r0, 240(r1)
- mtctr r0
- addi r1, r1, 244
- stw r6, 0(r3)
- stw r5, 4(r3)
+ ; 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
+ mfcr r0
+ stw r0, 232(r1)
+ mflr r0
+ stw r0, 236(r1)
+ stw r0, 240(r1)
+ mr r6, r1
+ 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
+ lwz r0, 232(r1)
+ mtcr r0
+ lwz r0, 236(r1)
+ mtlr r0
+ lwz r0, 240(r1)
+ mtctr r0
+ addi r1, r1, 244
+ stw r6, 0(r3)
+ stw r5, 4(r3)
@@ -1,203 +1,203 @@
-.globl .jump_fcontext
-.globl jump_fcontext[DS]
-.csect jump_fcontext[DS]
- .long .jump_fcontext
-.jump_fcontext:
+.globl .jump_fcontext
+.globl jump_fcontext[DS]
+.csect jump_fcontext[DS]
+ .long .jump_fcontext
+.jump_fcontext:
@@ -1,220 +1,220 @@
- * | TOC | R14 | R15 | R16 | *
- * | R17 | R18 | R19 | R20 | *
- * | R21 | R22 | R23 | R24 | *
- * | R25 | R26 | R27 | R28 | *
- * | R29 | R30 | R31 | hidden | *
- * | CR | LR | PC | back-chain| *
- * | cr saved | lr saved | compiler | linker | *
- * | TOC saved | FCTX | DATA | | *
-#if _CALL_ELF == 2
- .text
- .align 2
- addis %r2, %r12, .TOC.-jump_fcontext@ha
- addi %r2, %r2, .TOC.-jump_fcontext@l
- .localentry jump_fcontext, . - jump_fcontext
- .section ".opd","aw"
- .align 3
-# ifdef _CALL_LINUX
- .quad .L.jump_fcontext,.TOC.@tocbase,0
- .type jump_fcontext,@function
-.L.jump_fcontext:
-# else
- .hidden .jump_fcontext
- .globl .jump_fcontext
- .quad .jump_fcontext,.TOC.@tocbase,0
- .size jump_fcontext,24
- .type .jump_fcontext,@function
-# endif
- subi %r1, %r1, 184
-#if _CALL_ELF != 2
- std %r2, 0(%r1) # save TOC
- std %r14, 8(%r1) # save R14
- std %r15, 16(%r1) # save R15
- std %r16, 24(%r1) # save R16
- std %r17, 32(%r1) # save R17
- std %r18, 40(%r1) # save R18
- std %r19, 48(%r1) # save R19
- std %r20, 56(%r1) # save R20
- std %r21, 64(%r1) # save R21
- std %r22, 72(%r1) # save R22
- std %r23, 80(%r1) # save R23
- std %r24, 88(%r1) # save R24
- std %r25, 96(%r1) # save R25
- std %r26, 104(%r1) # save R26
- std %r27, 112(%r1) # save R27
- std %r28, 120(%r1) # save R28
- std %r29, 128(%r1) # save R29
- std %r30, 136(%r1) # save R30
- std %r31, 144(%r1) # save R31
- std %r3, 152(%r1) # save hidden
- std %r0, 160(%r1)
- std %r0, 168(%r1)
- std %r0, 176(%r1)
- # restore RSP (pointing to context-data) from R3
- mr %r1, %r3
- ld %r2, 0(%r1) # restore TOC
- 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
- ld %r0, 160(%r1)
- ld %r0, 168(%r1)
- ld %r12, 176(%r1)
- mtctr %r12
- addi %r1, %r1, 184
- # copy transfer_t into transfer_fn arg registers
- mr %r3, %r6
- # arg pointer already in %r4
- .size jump_fcontext, .-jump_fcontext
- # zero in r3 indicates first jump to context-function
- cmpdi %r3, 0
- beq use_entry_arg
- std %r6, 0(%r3)
- std %r5, 8(%r3)
-use_entry_arg:
- mr %r4, %r5
- .size .jump_fcontext, .-.L.jump_fcontext
- .size .jump_fcontext, .-.jump_fcontext
+ * | TOC | R14 | R15 | R16 | *
+ * | R17 | R18 | R19 | R20 | *
+ * | R21 | R22 | R23 | R24 | *
+ * | R25 | R26 | R27 | R28 | *
+ * | R29 | R30 | R31 | hidden | *
+ * | CR | LR | PC | back-chain| *
+ * | cr saved | lr saved | compiler | linker | *
+ * | TOC saved | FCTX | DATA | | *
+#if _CALL_ELF == 2
+ .text
+ .align 2
+ addis %r2, %r12, .TOC.-jump_fcontext@ha
+ addi %r2, %r2, .TOC.-jump_fcontext@l
+ .localentry jump_fcontext, . - jump_fcontext
+ .section ".opd","aw"
+ .align 3
+# ifdef _CALL_LINUX
+ .quad .L.jump_fcontext,.TOC.@tocbase,0
+ .type jump_fcontext,@function
+.L.jump_fcontext:
+# else
+ .hidden .jump_fcontext
+ .globl .jump_fcontext
+ .quad .jump_fcontext,.TOC.@tocbase,0
+ .size jump_fcontext,24
+ .type .jump_fcontext,@function
+# endif
+ subi %r1, %r1, 184
+#if _CALL_ELF != 2
+ std %r2, 0(%r1) # save TOC
+ std %r14, 8(%r1) # save R14
+ std %r15, 16(%r1) # save R15
+ std %r16, 24(%r1) # save R16
+ std %r17, 32(%r1) # save R17
+ std %r18, 40(%r1) # save R18
+ std %r19, 48(%r1) # save R19
+ std %r20, 56(%r1) # save R20
+ std %r21, 64(%r1) # save R21
+ std %r22, 72(%r1) # save R22
+ std %r23, 80(%r1) # save R23
+ std %r24, 88(%r1) # save R24
+ std %r25, 96(%r1) # save R25
+ std %r26, 104(%r1) # save R26
+ std %r27, 112(%r1) # save R27
+ std %r28, 120(%r1) # save R28
+ std %r29, 128(%r1) # save R29
+ std %r30, 136(%r1) # save R30
+ std %r31, 144(%r1) # save R31
+ std %r3, 152(%r1) # save hidden
+ std %r0, 160(%r1)
+ std %r0, 168(%r1)
+ std %r0, 176(%r1)
+ # restore RSP (pointing to context-data) from R3
+ mr %r1, %r3
+ ld %r2, 0(%r1) # restore TOC
+ 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
+ ld %r0, 160(%r1)
+ ld %r0, 168(%r1)
+ ld %r12, 176(%r1)
+ mtctr %r12
+ addi %r1, %r1, 184
+ # copy transfer_t into transfer_fn arg registers
+ mr %r3, %r6
+ # arg pointer already in %r4
+ .size jump_fcontext, .-jump_fcontext
+ # zero in r3 indicates first jump to context-function
+ cmpdi %r3, 0
+ beq use_entry_arg
+ std %r6, 0(%r3)
+ std %r5, 8(%r3)
+use_entry_arg:
+ mr %r4, %r5
+ .size .jump_fcontext, .-.L.jump_fcontext
+ .size .jump_fcontext, .-.jump_fcontext
@@ -1,164 +1,164 @@
- subi r1, r1, 184
- std r14, 8(r1) ; save R14
- std r15, 16(r1) ; save R15
- std r16, 24(r1) ; save R16
- std r17, 32(r1) ; save R17
- std r18, 40(r1) ; save R18
- std r19, 48(r1) ; save R19
- std r20, 56(r1) ; save R20
- std r21, 64(r1) ; save R21
- std r22, 72(r1) ; save R22
- std r23, 80(r1) ; save R23
- std r24, 88(r1) ; save R24
- std r25, 96(r1) ; save R25
- std r26, 104(r1) ; save R26
- std r27, 112(r1) ; save R27
- std r28, 120(r1) ; save R28
- std r29, 128(r1) ; save R29
- std r30, 136(r1) ; save R30
- std r31, 144(r1) ; save R31
- std r3, 152(r1) ; save hidden
- ; save CR
- std r0, 160(r1)
- ; save LR
- std r0, 168(r1)
- std r0, 176(r1)
- ; store RSP (pointing to context-data) in R6
- ; restore RSP (pointing to context-data) from 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)
- ; restore LR
- ld r0, 168(r1)
- ; load PC
- ld r12, 176(r1)
- mtctr r12
- addi r1, r1, 184
- cmpdi r3, 0
- std r6, 0(r3)
- std r5, 8(r3)
- mr r3, r6
- mr r4, r5
+ subi r1, r1, 184
+ std r14, 8(r1) ; save R14
+ std r15, 16(r1) ; save R15
+ std r16, 24(r1) ; save R16
+ std r17, 32(r1) ; save R17
+ std r18, 40(r1) ; save R18
+ std r19, 48(r1) ; save R19
+ std r20, 56(r1) ; save R20
+ std r21, 64(r1) ; save R21
+ std r22, 72(r1) ; save R22
+ std r23, 80(r1) ; save R23
+ std r24, 88(r1) ; save R24
+ std r25, 96(r1) ; save R25
+ std r26, 104(r1) ; save R26
+ std r27, 112(r1) ; save R27
+ std r28, 120(r1) ; save R28
+ std r29, 128(r1) ; save R29
+ std r30, 136(r1) ; save R30
+ std r31, 144(r1) ; save R31
+ std r3, 152(r1) ; save hidden
+ ; save CR
+ std r0, 160(r1)
+ ; save LR
+ std r0, 168(r1)
+ std r0, 176(r1)
+ ; store RSP (pointing to context-data) in R6
+ ; restore RSP (pointing to context-data) from 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)
+ ; restore LR
+ ld r0, 168(r1)
+ ; load PC
+ ld r12, 176(r1)
+ mtctr r12
+ addi r1, r1, 184
+ cmpdi r3, 0
+ std r6, 0(r3)
+ std r5, 8(r3)
+ mr r3, r6
+ mr r4, r5
@@ -1,84 +1,84 @@
- 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
- mfcr 0
- std 0, 160(1)
- mflr 0
- std 0, 168(1)
- std 0, 176(1)
- mr 6, 1
- 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
- ld 0, 160(1)
- mtcr 0
- ld 0, 168(1)
- mtlr 0
- ld 0, 176(1)
- mtctr 0
- addi 1, 1, 184
- std 6, 0(3)
- std 5, 8(3)
+ 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
+ mfcr 0
+ std 0, 160(1)
+ mflr 0
+ std 0, 168(1)
+ std 0, 176(1)
+ mr 6, 1
+ 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
+ ld 0, 160(1)
+ mtcr 0
+ ld 0, 168(1)
+ mtlr 0
+ ld 0, 176(1)
+ mtctr 0
+ addi 1, 1, 184
+ std 6, 0(3)
+ std 5, 8(3)
@@ -1,209 +1,209 @@
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* | SEE registers (XMM6-XMM15) | *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* | 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"
-.def jump_fcontext; .scl 2; .type 32; .endef
-.seh_proc 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 */
- movq %gs:(0x30), %r10
- /* save fiber local storage */
- movq 0x20(%r10), %rax
- movq %rax, 0xb0(%rsp)
- /* save current deallocation stack */
- movq 0x1478(%r10), %rax
- movq %rax, 0xb8(%rsp)
- /* save current stack limit */
- movq 0x10(%r10), %rax
- movq %rax, 0xc0(%rsp)
- /* save current stack base */
- movq 0x08(%r10), %rax
- movq %rax, 0xc8(%rsp)
- movq %r12, 0xd0(%rsp) /* save R12 */
- movq %r13, 0xd8(%rsp) /* save R13 */
- movq %r14, 0xe0(%rsp) /* save R14 */
- movq %r15, 0xe8(%rsp) /* save R15 */
- movq %rdi, 0xf0(%rsp) /* save RDI */
- movq %rsi, 0xf8(%rsp) /* save RSI */
- movq %rbx, 0x100(%rsp) /* save RBX */
- movq %rbp, 0x108(%rsp) /* save RBP */
- movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
- /* preserve RSP (pointing to context-data) in R9 */
- movq %rsp, %r9
- /* restore RSP (pointing to context-data) from RDX */
- movq %rdx, %rsp
- /* restore XMM storage */
- movaps 0x0(%rsp), %xmm6
- movaps 0x10(%rsp), %xmm7
- movaps 0x20(%rsp), %xmm8
- movaps 0x30(%rsp), %xmm9
- movaps 0x40(%rsp), %xmm10
- movaps 0x50(%rsp), %xmm11
- movaps 0x60(%rsp), %xmm12
- movaps 0x70(%rsp), %xmm13
- movaps 0x80(%rsp), %xmm14
- movaps 0x90(%rsp), %xmm15
- ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
- fldcw 0xa4(%rsp) /* restore x87 control-word */
- movq 0xb0(%rsp), %rax
- movq %rax, 0x20(%r10)
- movq 0xb8(%rsp), %rax
- movq %rax, 0x1478(%r10)
- movq 0xc0(%rsp), %rax
- movq %rax, 0x10(%r10)
- 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 */
- movq %r9, 0x0(%rax)
- movq %r8, 0x8(%rax)
- /* transport_t as 1.arg of context-function */
- movq %rax, %rcx
- /* indirect jump to context */
- jmp *%r10
-.seh_endproc
+* ---------------------------------------------------------------------------------- *
+* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
+* | SEE registers (XMM6-XMM15) | *
+* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
+* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
+* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
+* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
+* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
+* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
+* | 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"
+.def jump_fcontext; .scl 2; .type 32; .endef
+.seh_proc 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 */
+ movq %gs:(0x30), %r10
+ /* save fiber local storage */
+ movq 0x20(%r10), %rax
+ movq %rax, 0xb0(%rsp)
+ /* save current deallocation stack */
+ movq 0x1478(%r10), %rax
+ movq %rax, 0xb8(%rsp)
+ /* save current stack limit */
+ movq 0x10(%r10), %rax
+ movq %rax, 0xc0(%rsp)
+ /* save current stack base */
+ movq 0x08(%r10), %rax
+ movq %rax, 0xc8(%rsp)
+ movq %r12, 0xd0(%rsp) /* save R12 */
+ movq %r13, 0xd8(%rsp) /* save R13 */
+ movq %r14, 0xe0(%rsp) /* save R14 */
+ movq %r15, 0xe8(%rsp) /* save R15 */
+ movq %rdi, 0xf0(%rsp) /* save RDI */
+ movq %rsi, 0xf8(%rsp) /* save RSI */
+ movq %rbx, 0x100(%rsp) /* save RBX */
+ movq %rbp, 0x108(%rsp) /* save RBP */
+ movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
+ /* preserve RSP (pointing to context-data) in R9 */
+ movq %rsp, %r9
+ /* restore RSP (pointing to context-data) from RDX */
+ movq %rdx, %rsp
+ /* restore XMM storage */
+ movaps 0x0(%rsp), %xmm6
+ movaps 0x10(%rsp), %xmm7
+ movaps 0x20(%rsp), %xmm8
+ movaps 0x30(%rsp), %xmm9
+ movaps 0x40(%rsp), %xmm10
+ movaps 0x50(%rsp), %xmm11
+ movaps 0x60(%rsp), %xmm12
+ movaps 0x70(%rsp), %xmm13
+ movaps 0x80(%rsp), %xmm14
+ movaps 0x90(%rsp), %xmm15
+ ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
+ fldcw 0xa4(%rsp) /* restore x87 control-word */
+ movq 0xb0(%rsp), %rax
+ movq %rax, 0x20(%r10)
+ movq 0xb8(%rsp), %rax
+ movq %rax, 0x1478(%r10)
+ movq 0xc0(%rsp), %rax
+ movq %rax, 0x10(%r10)
+ 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 */
+ movq %r9, 0x0(%rax)
+ movq %r8, 0x8(%rax)
+ /* transport_t as 1.arg of context-function */
+ movq %rax, %rcx
+ /* indirect jump to context */
+ jmp *%r10
+.seh_endproc
@@ -1,80 +1,80 @@
- * | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
- * | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
- * | R15 | RBX | RBP | RIP | *
-.align 16
- 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
- jmp *%r8
+ * | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | *
+ * | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
+ * | R15 | RBX | RBP | RIP | *
+.align 16
+ 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
+ jmp *%r8
-.align 8
+.align 8
-.global make_fcontext
-.type make_fcontext, %function
-make_fcontext:
- # shift address in x0 (allocated stack) to lower 16 byte boundary
- and x0, x0, ~0xF
- # reserve space for context-data on context-stack
- sub x0, x0, #0xb0
- # third arg of make_fcontext() == address of context-function
- # store address as a PC to jump in
- str x2, [x0, #0xa0]
- # save address of finish as return-address for context-function
- # will be entered after context-function returns (LR register)
- adr x1, finish
- str x1, [x0, #0x98]
- ret x30 // return pointer to context-data (x0)
-finish:
- # exit code is zero
- mov x0, #0
- # exit application
- bl _exit
-.size make_fcontext,.-make_fcontext
+.global make_fcontext
+.type make_fcontext, %function
+make_fcontext:
+ # shift address in x0 (allocated stack) to lower 16 byte boundary
+ and x0, x0, ~0xF
+ # reserve space for context-data on context-stack
+ sub x0, x0, #0xb0
+ # third arg of make_fcontext() == address of context-function
+ # store address as a PC to jump in
+ str x2, [x0, #0xa0]
+ # save address of finish as return-address for context-function
+ # will be entered after context-function returns (LR register)
+ adr x1, finish
+ str x1, [x0, #0x98]
+ ret x30 // return pointer to context-data (x0)
+finish:
+ # exit code is zero
+ mov x0, #0
+ # exit application
+ bl _exit
+.size make_fcontext,.-make_fcontext
@@ -1,88 +1,88 @@
-.globl _make_fcontext
-_make_fcontext:
- ; shift address in x0 (allocated stack) to lower 16 byte boundary
- ; reserve space for context-data on context-stack
- ; third arg of make_fcontext() == address of context-function
- ; store address as a PC to jump in
- ; 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)
- ret lr ; return pointer to context-data (x0)
- ; exit code is zero
- ; exit application
- bl __exit
+.globl _make_fcontext
+_make_fcontext:
+ ; shift address in x0 (allocated stack) to lower 16 byte boundary
+ ; reserve space for context-data on context-stack
+ ; third arg of make_fcontext() == address of context-function
+ ; store address as a PC to jump in
+ ; 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)
+ ret lr ; return pointer to context-data (x0)
+ ; exit code is zero
+ ; exit application
+ bl __exit
@@ -1,79 +1,79 @@
-.globl make_fcontext
-.type make_fcontext,%function
- @ shift address in A1 to lower 16 byte boundary
- bic a1, a1, #15
- @ reserve space for context-data on context-stack
- sub a1, a1, #124
- @ third arg of make_fcontext() == address of context-function
- str a3, [a1, #104]
- @ compute address of returned transfer_t
- add a2, a1, #108
- mov a3, a2
- str a3, [a1, #64]
- @ compute abs address of label finish
- adr a2, finish
- @ save address of finish as return-address for context-function
- @ will be entered after context-function returns
- str a2, [a1, #100]
- bx lr @ return pointer to context-data
- @ exit code is zero
- mov a1, #0
- @ exit application
- bl _exit@PLT
+.globl make_fcontext
+.type make_fcontext,%function
+ @ shift address in A1 to lower 16 byte boundary
+ bic a1, a1, #15
+ @ reserve space for context-data on context-stack
+ sub a1, a1, #124
+ @ third arg of make_fcontext() == address of context-function
+ str a3, [a1, #104]
+ @ compute address of returned transfer_t
+ add a2, a1, #108
+ mov a3, a2
+ str a3, [a1, #64]
+ @ compute abs address of label finish
+ adr a2, finish
+ @ save address of finish as return-address for context-function
+ @ will be entered after context-function returns
+ str a2, [a1, #100]
+ bx lr @ return pointer to context-data
+ @ exit code is zero
+ mov a1, #0
+ @ exit application
+ bl _exit@PLT
@@ -1,71 +1,71 @@
- str a3, [a1, #108]
- add a2, a1, #112
- str a3, [a1, #68]
- str a2, [a1, #104]
+ str a3, [a1, #108]
+ add a2, a1, #112
+ str a3, [a1, #68]
+ str a2, [a1, #104]
@@ -1,77 +1,77 @@
- EXPORT make_fcontext
- IMPORT _exit
-make_fcontext PROC
- ; first arg of make_fcontext() == top of context-stack
- ; save top of context-stack (base) A4
- mov a4, a1
- ; shift address in A1 to lower 16 byte boundary
- bic a1, a1, #0x0f
- sub a1, a1, #0x48
- ; save top address of context_stack as 'base'
- str a4, [a1, #0x8]
- ; second arg of make_fcontext() == size of context-stack
- ; compute bottom address of context-stack (limit)
- sub a4, a4, a2
- ; save bottom address of context-stack as 'limit'
- str a4, [a1, #0x4]
- ; save bottom address of context-stack as 'dealloction stack'
- str a4, [a1, #0x0]
- str a3, [a1, #0x34]
- ; compute address of returned transfer_t
- add a2, a1, #0x38
- str a3, [a1, #0xc]
- ; will be entered after context-function returns
- str a2, [a1, #0x30]
- bx lr ; return pointer to context-data
-finish
+ EXPORT make_fcontext
+ IMPORT _exit
+make_fcontext PROC
+ ; first arg of make_fcontext() == top of context-stack
+ ; save top of context-stack (base) A4
+ mov a4, a1
+ ; shift address in A1 to lower 16 byte boundary
+ bic a1, a1, #0x0f
+ sub a1, a1, #0x48
+ ; save top address of context_stack as 'base'
+ str a4, [a1, #0x8]
+ ; second arg of make_fcontext() == size of context-stack
+ ; compute bottom address of context-stack (limit)
+ sub a4, a4, a2
+ ; save bottom address of context-stack as 'limit'
+ str a4, [a1, #0x4]
+ ; save bottom address of context-stack as 'dealloction stack'
+ str a4, [a1, #0x0]
+ str a3, [a1, #0x34]
+ ; compute address of returned transfer_t
+ add a2, a1, #0x38
+ str a3, [a1, #0xc]
+ ; will be entered after context-function returns
+ str a2, [a1, #0x30]
+ bx lr ; return pointer to context-data
+finish
- #include "make_i386_sysv_macho_gas.S"
- #include "make_x86_64_sysv_macho_gas.S"
- #include "make_ppc32_sysv_macho_gas.S"
- #include "make_ppc64_sysv_macho_gas.S"
+ #include "make_i386_sysv_macho_gas.S"
+ #include "make_x86_64_sysv_macho_gas.S"
+ #include "make_ppc32_sysv_macho_gas.S"
+ #include "make_ppc64_sysv_macho_gas.S"
@@ -1,147 +1,147 @@
-.file "make_i386_ms_pe_gas.asm"
-.def _make_fcontext; .scl 2; .type 32; .endef
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x04(%esp), %eax
- /* reserve space for first argument of context-function */
- /* EAX might already point to a 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
- stmxcsr (%eax)
- fnstcw 0x4(%eax)
- movl 0x4(%esp), %ecx
- /* save top address of context stack as 'base' */
- movl %ecx, 0x14(%eax)
- /* second arg of make_fcontext() == size of context-stack */
- movl 0x8(%esp), %edx
- /* negate stack size for LEA instruction (== substraction) */
- negl %edx
- /* compute bottom address of context stack (limit) */
- leal (%ecx,%edx), %ecx
- /* save bottom address of context-stack as 'limit' */
- movl %ecx, 0x10(%eax)
- /* save bottom address of context-stack as 'dealloction stack' */
- movl %ecx, 0xc(%eax)
- /* set fiber-storage to zero */
- xorl %ecx, %ecx
- movl %ecx, 0x8(%eax)
- /* third arg of make_fcontext() == address of context-function */
- /* stored in EBX */
- movl %ecx, 0x24(%eax)
- /* compute abs address of label trampoline */
- movl $trampoline, %ecx
- /* save address of trampoline as return-address for context-function */
- /* will be entered after calling jump_fcontext() first time */
- movl %ecx, 0x2c(%eax)
- /* compute abs address of label finish */
- movl $finish, %ecx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movl %ecx, 0x28(%eax)
- /* traverse current seh chain to get the last exception handler installed by Windows */
- /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
- /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
- /* at its end by RaiseException all seh andlers are disregarded if not present and the */
- /* program is aborted */
- /* load NT_TIB into ECX */
- movl %fs:(0x0), %ecx
-walk:
- /* load 'next' member of current SEH into EDX */
- movl (%ecx), %edx
- /* test if 'next' of current SEH is last (== 0xffffffff) */
- incl %edx
- jz found
- decl %edx
- /* exchange content; ECX contains address of next SEH */
- xchgl %ecx, %edx
- /* inspect next SEH */
- jmp walk
-found:
- /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
- movl 0x04(%ecx), %ecx
- /* save address in ECX as SEH handler for context */
- movl %ecx, 0x3c(%eax)
- /* set ECX to -1 */
- movl $0xffffffff, %ecx
- /* save ECX as next SEH item */
- movl %ecx, 0x38(%eax)
- /* load address of next SEH item */
- leal 0x38(%eax), %ecx
- /* save next SEH */
- movl %ecx, 0x18(%eax)
- /* return pointer to context-data */
- ret
-trampoline:
- /* move transport_t for entering context-function */
- movl %eax, (%esp)
- movl %edx, 0x4(%esp)
- /* label finish as return-address */
- pushl %ebp
- /* jump to context-function */
- jmp *%ebx
- /* ESP points to same address as ESP on entry of context function + 0x4 */
- xorl %eax, %eax
- /* exit code is zero */
- /* exit application */
- call __exit
- hlt
-.def __exit; .scl 2; .type 32; .endef /* standard C library function */
-.ascii " -export:\"make_fcontext\""
+.file "make_i386_ms_pe_gas.asm"
+.def _make_fcontext; .scl 2; .type 32; .endef
+ /* first arg of make_fcontext() == top of context-stack */
+ movl 0x04(%esp), %eax
+ /* reserve space for first argument of context-function */
+ /* EAX might already point to a 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
+ stmxcsr (%eax)
+ fnstcw 0x4(%eax)
+ movl 0x4(%esp), %ecx
+ /* save top address of context stack as 'base' */
+ movl %ecx, 0x14(%eax)
+ /* second arg of make_fcontext() == size of context-stack */
+ movl 0x8(%esp), %edx
+ /* negate stack size for LEA instruction (== substraction) */
+ negl %edx
+ /* compute bottom address of context stack (limit) */
+ leal (%ecx,%edx), %ecx
+ /* save bottom address of context-stack as 'limit' */
+ movl %ecx, 0x10(%eax)
+ /* save bottom address of context-stack as 'dealloction stack' */
+ movl %ecx, 0xc(%eax)
+ /* set fiber-storage to zero */
+ xorl %ecx, %ecx
+ movl %ecx, 0x8(%eax)
+ /* third arg of make_fcontext() == address of context-function */
+ /* stored in EBX */
+ movl %ecx, 0x24(%eax)
+ /* compute abs address of label trampoline */
+ movl $trampoline, %ecx
+ /* save address of trampoline as return-address for context-function */
+ /* will be entered after calling jump_fcontext() first time */
+ movl %ecx, 0x2c(%eax)
+ /* compute abs address of label finish */
+ movl $finish, %ecx
+ /* save address of finish as return-address for context-function */
+ /* will be entered after context-function returns */
+ movl %ecx, 0x28(%eax)
+ /* traverse current seh chain to get the last exception handler installed by Windows */
+ /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
+ /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
+ /* at its end by RaiseException all seh andlers are disregarded if not present and the */
+ /* program is aborted */
+ /* load NT_TIB into ECX */
+ movl %fs:(0x0), %ecx
+walk:
+ /* load 'next' member of current SEH into EDX */
+ movl (%ecx), %edx
+ /* test if 'next' of current SEH is last (== 0xffffffff) */
+ incl %edx
+ jz found
+ decl %edx
+ /* exchange content; ECX contains address of next SEH */
+ xchgl %ecx, %edx
+ /* inspect next SEH */
+ jmp walk
+found:
+ /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
+ movl 0x04(%ecx), %ecx
+ /* save address in ECX as SEH handler for context */
+ movl %ecx, 0x3c(%eax)
+ /* set ECX to -1 */
+ movl $0xffffffff, %ecx
+ /* save ECX as next SEH item */
+ movl %ecx, 0x38(%eax)
+ /* load address of next SEH item */
+ leal 0x38(%eax), %ecx
+ /* save next SEH */
+ movl %ecx, 0x18(%eax)
+ /* return pointer to context-data */
+ ret
+trampoline:
+ /* move transport_t for entering context-function */
+ movl %eax, (%esp)
+ movl %edx, 0x4(%esp)
+ /* label finish as return-address */
+ pushl %ebp
+ /* jump to context-function */
+ jmp *%ebx
+ /* ESP points to same address as ESP on entry of context function + 0x4 */
+ xorl %eax, %eax
+ /* exit code is zero */
+ /* exit application */
+ call __exit
+ hlt
+.def __exit; .scl 2; .type 32; .endef /* standard C library function */
+.ascii " -export:\"make_fcontext\""
@@ -1,140 +1,140 @@
-; standard C library function
-_exit PROTO, value:SDWORD
-make_fcontext PROC BOOST_CONTEXT_EXPORT
- 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
- ; on context-function entry: (ESP -0x4) % 8 == 0
- ; additional space is required for SEH
- lea eax, [eax-040h]
- stmxcsr [eax]
- fnstcw [eax+04h]
- mov ecx, [esp+04h]
- ; save top address of context stack as 'base'
- mov [eax+014h], ecx
- mov edx, [esp+08h]
- ; negate stack size for LEA instruction (== substraction)
- neg edx
- ; compute bottom address of context stack (limit)
- lea ecx, [ecx+edx]
- mov [eax+010h], ecx
- mov [eax+0ch], ecx
- ; set fiber-storage to zero
- xor ecx, ecx
- mov [eax+08h], ecx
- ; stored in EBX
- 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 jump_fcontext() first time
- mov [eax+02ch], ecx
- mov ecx, finish
- ; save address of finish as return-address for context-function in EBP
- 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
- mov ecx, fs:[0h]
- ; load 'next' member of current SEH into EDX
- mov edx, [ecx]
- ; test if 'next' of current SEH is last (== 0xffffffff)
- inc edx
- dec edx
- ; exchange content; ECX contains address of next SEH
- xchg edx, ecx
- ; inspect next SEH
- ; 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
- ; move transport_t for entering context-function
- mov [esp], eax
- mov [esp+04h], edx
- push ebp
- ; jump to context-function
- jmp ebx
- xor eax, eax
- call _exit
-make_fcontext ENDP
+; standard C library function
+_exit PROTO, value:SDWORD
+make_fcontext PROC BOOST_CONTEXT_EXPORT
+ 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
+ ; on context-function entry: (ESP -0x4) % 8 == 0
+ ; additional space is required for SEH
+ lea eax, [eax-040h]
+ stmxcsr [eax]
+ fnstcw [eax+04h]
+ mov ecx, [esp+04h]
+ ; save top address of context stack as 'base'
+ mov [eax+014h], ecx
+ mov edx, [esp+08h]
+ ; negate stack size for LEA instruction (== substraction)
+ neg edx
+ ; compute bottom address of context stack (limit)
+ lea ecx, [ecx+edx]
+ mov [eax+010h], ecx
+ mov [eax+0ch], ecx
+ ; set fiber-storage to zero
+ xor ecx, ecx
+ mov [eax+08h], ecx
+ ; stored in EBX
+ 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 jump_fcontext() first time
+ mov [eax+02ch], ecx
+ mov ecx, finish
+ ; save address of finish as return-address for context-function in EBP
+ 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
+ mov ecx, fs:[0h]
+ ; load 'next' member of current SEH into EDX
+ mov edx, [ecx]
+ ; test if 'next' of current SEH is last (== 0xffffffff)
+ inc edx
+ dec edx
+ ; exchange content; ECX contains address of next SEH
+ xchg edx, ecx
+ ; inspect next SEH
+ ; 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
+ ; move transport_t for entering context-function
+ mov [esp], eax
+ mov [esp+04h], edx
+ push ebp
+ ; jump to context-function
+ jmp ebx
+ xor eax, eax
+ call _exit
+make_fcontext ENDP
@@ -1,106 +1,106 @@
-.type make_fcontext,@function
- movl 0x4(%esp), %eax
- /* reserve space for first argument of context-function
- eax might already point to a 16byte border */
- leal -0x28(%eax), %eax
- /* return transport_t */
- /* FCTX == EDI, DATA == ESI */
- leal 0x8(%eax), %ecx
- movl %ecx, 0x1c(%eax)
- call 1f
- /* address of trampoline 1 */
-1: popl %ecx
- addl $trampoline-1b, %ecx
- /* save address of trampoline as return address */
- call 2f
- /* address of label 2 */
-2: popl %ecx
- addl $finish-2b, %ecx
- ret /* return pointer to context-data */
- movl %edi, (%esp)
- movl %esi, 0x4(%esp)
- call 3f
- /* address of label 3 */
-3: popl %ebx
- /* compute address of GOT and store it in EBX */
- addl $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
- call _exit@PLT
+.type make_fcontext,@function
+ movl 0x4(%esp), %eax
+ /* reserve space for first argument of context-function
+ eax might already point to a 16byte border */
+ leal -0x28(%eax), %eax
+ /* return transport_t */
+ /* FCTX == EDI, DATA == ESI */
+ leal 0x8(%eax), %ecx
+ movl %ecx, 0x1c(%eax)
+ call 1f
+ /* address of trampoline 1 */
+1: popl %ecx
+ addl $trampoline-1b, %ecx
+ /* save address of trampoline as return address */
+ call 2f
+ /* address of label 2 */
+2: popl %ecx
+ addl $finish-2b, %ecx
+ ret /* return pointer to context-data */
+ movl %edi, (%esp)
+ movl %esi, 0x4(%esp)
+ call 3f
+ /* address of label 3 */
+3: popl %ebx
+ /* compute address of GOT and store it in EBX */
+ addl $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+ call _exit@PLT
@@ -1,90 +1,90 @@
- leal -0x2c(%eax), %eax
+ leal -0x2c(%eax), %eax
- * | S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | *
- * | FP |hiddn| RA | PC | GP | FCTX| DATA| | *
-.ent make_fcontext
-#ifdef __PIC__
-.set noreorder
-.cpload $t9
-.set reorder
- # first arg of 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
- # including 48 byte of shadow space (sp % 16 == 0)
- addiu $v0, $v0, -112
- 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
- # will be entered after context-function returns
- sw $t9, 88($v0)
- jr $ra # return pointer to context-data
- 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
- move $a0, $zero
- # address of exit
- lw $t9, %call16(_exit)($gp)
- jalr $t9
-.end make_fcontext
-.size make_fcontext, .-make_fcontext
+ * | S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | *
+ * | FP |hiddn| RA | PC | GP | FCTX| DATA| | *
+.ent make_fcontext
+#ifdef __PIC__
+.set noreorder
+.cpload $t9
+.set reorder
+ # first arg of 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
+ # including 48 byte of shadow space (sp % 16 == 0)
+ addiu $v0, $v0, -112
+ 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
+ # will be entered after context-function returns
+ sw $t9, 88($v0)
+ jr $ra # return pointer to context-data
+ 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
+ move $a0, $zero
+ # address of exit
+ lw $t9, %call16(_exit)($gp)
+ jalr $t9
+.end make_fcontext
+.size make_fcontext, .-make_fcontext
@@ -1,142 +1,142 @@
- # save return address into R6
- mflr %r6
- # first arg of make_fcontext() == top address of context-function
- # shift address in R3 to lower 16 byte boundary
- clrrwi %r3, %r3, 4
- # including 64 byte of linkage + parameter area (R1 % 16 == 0)
- subi %r3, %r3, 336
- stw %r5, 240(%r3)
- # set back-chain to zero
- li %r0, 0
- stw %r0, 244(%r3)
- stfd %f0, 144(%r3) # save FPSCR
- addi %r0, %r3, 252
- mr %r4, %r0
- stw %r4, 228(%r3)
- # load LR
- # jump to label 1
- bl 1f
-1:
- # load LR into R4
- mflr %r4
- addi %r4, %r4, finish - 1b
- stw %r4, 236(%r3)
- # restore return address from R6
- mtlr %r6
- blr # return pointer to context-data
- # save return address into R0
- # save return address on stack, set up stack frame
- stw %r0, 4(%r1)
- # allocate stack space, R1 % 16 == 0
- stwu %r1, -16(%r1)
- li %r3, 0
- bl _exit@plt
+ # save return address into R6
+ mflr %r6
+ # first arg of make_fcontext() == top address of context-function
+ # shift address in R3 to lower 16 byte boundary
+ clrrwi %r3, %r3, 4
+ # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+ subi %r3, %r3, 336
+ stw %r5, 240(%r3)
+ # set back-chain to zero
+ li %r0, 0
+ stw %r0, 244(%r3)
+ stfd %f0, 144(%r3) # save FPSCR
+ addi %r0, %r3, 252
+ mr %r4, %r0
+ stw %r4, 228(%r3)
+ # load LR
+ # jump to label 1
+ bl 1f
+1:
+ # load LR into R4
+ mflr %r4
+ addi %r4, %r4, finish - 1b
+ stw %r4, 236(%r3)
+ # restore return address from R6
+ mtlr %r6
+ blr # return pointer to context-data
+ # save return address into R0
+ # save return address on stack, set up stack frame
+ stw %r0, 4(%r1)
+ # allocate stack space, R1 % 16 == 0
+ stwu %r1, -16(%r1)
+ li %r3, 0
+ bl _exit@plt
@@ -1,137 +1,137 @@
- mflr r6
- clrrwi r3, r3, 4
- # including 64 byte of linkage + parameter area (R1 16 == 0)
- subi r3, r3, 336
- stw r5, 240(r3)
- li r0, 0
- stw r0, 244(r3)
- stfd f0, 144(r3) # save FPSCR
- addi r0, r3, 252
- mr r4, r0
- stw r4, 228(r3)
- mflr r4
- addi r4, r4, finish - 1b
- stw r4, 236(r3)
- mtlr r6
- stw r0, 4(r1)
- # allocate stack space, R1 16 == 0
- stwu r1, -16(r1)
- li r3, 0
+ mflr r6
+ clrrwi r3, r3, 4
+ # including 64 byte of linkage + parameter area (R1 16 == 0)
+ subi r3, r3, 336
+ stw r5, 240(r3)
+ li r0, 0
+ stw r0, 244(r3)
+ stfd f0, 144(r3) # save FPSCR
+ addi r0, r3, 252
+ mr r4, r0
+ stw r4, 228(r3)
+ mflr r4
+ addi r4, r4, finish - 1b
+ stw r4, 236(r3)
+ mtlr r6
+ stw r0, 4(r1)
+ # allocate stack space, R1 16 == 0
+ stwu r1, -16(r1)
+ li r3, 0
@@ -1,138 +1,138 @@
- .globl make_fcontext[DS]
- .globl .make_fcontext[PR]
- .csect make_fcontext[DS]
- .long .make_fcontext[PR]
- .csect .make_fcontext[PR], 3
-#.make_fcontext:
- mflr 6
- clrrwi 3, 3, 4
- subi 3, 3, 336
- stw 5, 240(3)
- li 0, 0
- stw 0, 244(3)
- addi 0, 3, 252
- mr 4, 0
- stw 4, 228(3)
- bl .Label
-.Label:
- mflr 4
- # compute abs address of label .L_finish
- addi 4, 4, .L_finish - .Label
- stw 4, 236(3)
- mtlr 6
-.L_finish:
- stw 0, 4(1)
- stwu 1, -16(1)
- li 3, 0
- bl ._exit
- nop
+ .globl make_fcontext[DS]
+ .globl .make_fcontext[PR]
+ .csect make_fcontext[DS]
+ .long .make_fcontext[PR]
+ .csect .make_fcontext[PR], 3
+#.make_fcontext:
+ mflr 6
+ clrrwi 3, 3, 4
+ subi 3, 3, 336
+ stw 5, 240(3)
+ li 0, 0
+ stw 0, 244(3)
+ addi 0, 3, 252
+ mr 4, 0
+ stw 4, 228(3)
+ bl .Label
+.Label:
+ mflr 4
+ # compute abs address of label .L_finish
+ addi 4, 4, .L_finish - .Label
+ stw 4, 236(3)
+ mtlr 6
+.L_finish:
+ stw 0, 4(1)
+ stwu 1, -16(1)
+ li 3, 0
+ bl ._exit
+ nop
@@ -1,176 +1,176 @@
- addis %r2, %r12, .TOC.-make_fcontext@ha
- addi %r2, %r2, .TOC.-make_fcontext@l
- .localentry make_fcontext, . - make_fcontext
- .quad .L.make_fcontext,.TOC.@tocbase,0
- .type make_fcontext,@function
-.L.make_fcontext:
- .hidden .make_fcontext
- .globl .make_fcontext
- .quad .make_fcontext,.TOC.@tocbase,0
- .size make_fcontext,24
- .type .make_fcontext,@function
-.make_fcontext:
- clrrdi %r3, %r3, 4
- subi %r3, %r3, 248
- # entry point (ELFv2) or descriptor (ELFv1)
- # save address of context-function entry point
- std %r5, 176(%r3)
- ld %r4, 0(%r5)
- std %r4, 176(%r3)
- # save TOC of context-function
- ld %r4, 8(%r5)
- std %r4, 0(%r3)
- std %r0, 184(%r3)
- std %r0, 152(%r3)
- std %r4, 168(%r3)
- std %r0, 8(%r1)
- stdu %r1, -32(%r1)
- .size make_fcontext, .-make_fcontext
- .size .make_fcontext, .-.L.make_fcontext
- .size .make_fcontext, .-.make_fcontext
+ addis %r2, %r12, .TOC.-make_fcontext@ha
+ addi %r2, %r2, .TOC.-make_fcontext@l
+ .localentry make_fcontext, . - make_fcontext
+ .quad .L.make_fcontext,.TOC.@tocbase,0
+ .type make_fcontext,@function
+.L.make_fcontext:
+ .hidden .make_fcontext
+ .globl .make_fcontext
+ .quad .make_fcontext,.TOC.@tocbase,0
+ .size make_fcontext,24
+ .type .make_fcontext,@function
+.make_fcontext:
+ clrrdi %r3, %r3, 4
+ subi %r3, %r3, 248
+ # entry point (ELFv2) or descriptor (ELFv1)
+ # save address of context-function entry point
+ std %r5, 176(%r3)
+ ld %r4, 0(%r5)
+ std %r4, 176(%r3)
+ # save TOC of context-function
+ ld %r4, 8(%r5)
+ std %r4, 0(%r3)
+ std %r0, 184(%r3)
+ std %r0, 152(%r3)
+ std %r4, 168(%r3)
+ std %r0, 8(%r1)
+ stdu %r1, -32(%r1)
+ .size make_fcontext, .-make_fcontext
+ .size .make_fcontext, .-.L.make_fcontext
+ .size .make_fcontext, .-.make_fcontext
@@ -1,126 +1,126 @@
- ; save return address into R6
- ; first arg of make_fcontext() == top address of context-function
- ; shift address in R3 to lower 16 byte boundary
- ; including 64 byte of linkage + parameter area (R1 16 == 0)
- subi r3, r3, 248
- stw r5, 176(r3)
- ; set back-chain to zero
- addi %r0, %r3, 232
- std %r4, 152(%r3)
- ; load LR
- ; jump to label 1
- bl l1
-l1:
- ; load LR into R4
- addi r4, r4, lo16((finish - .) + 4)
- std r4, 168(r3)
- ; restore return address from R6
- blr ; return pointer to context-data
- ; save return address into 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
+ ; save return address into R6
+ ; first arg of make_fcontext() == top address of context-function
+ ; shift address in R3 to lower 16 byte boundary
+ ; including 64 byte of linkage + parameter area (R1 16 == 0)
+ subi r3, r3, 248
+ stw r5, 176(r3)
+ ; set back-chain to zero
+ addi %r0, %r3, 232
+ std %r4, 152(%r3)
+ ; load LR
+ ; jump to label 1
+ bl l1
+l1:
+ ; load LR into R4
+ addi r4, r4, lo16((finish - .) + 4)
+ std r4, 168(r3)
+ ; restore return address from R6
+ blr ; return pointer to context-data
+ ; save return address into 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
@@ -1,62 +1,62 @@
- .globl _make_fcontext
-#._make_fcontext:
- subi 3, 3, 248
- stw 5, 176(3)
- std 0, 184(3)
- addi 0, 3, 232
- std 4, 152(3)
- stw 4, 168(3)
- stw 0, 8(1)
- stwu 1, -32(1)
+ .globl _make_fcontext
+#._make_fcontext:
+ subi 3, 3, 248
+ stw 5, 176(3)
+ std 0, 184(3)
+ addi 0, 3, 232
+ std 4, 152(3)
+ stw 4, 168(3)
+ stw 0, 8(1)
+ stwu 1, -32(1)
@@ -1,174 +1,174 @@
-.file "make_x86_64_ms_pe_gas.asm"
-.def make_fcontext; .scl 2; .type 32; .endef
-.seh_proc make_fcontext
- movq %rcx, %rax
- /* shift address in RAX to lower 16 byte boundary */
- /* == pointer to fcontext_t and address of context stack */
- andq $-16, %rax
- /* on context-function entry: (RSP -0x8) % 16 == 0 */
- leaq -0x150(%rax), %rax
- movq %r8, 0x100(%rax)
- movq %rcx, 0xc8(%rax)
- negq %rdx
- 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)
- xorq %rcx, %rcx
- movq %rcx, 0xb0(%rax)
- stmxcsr 0xa0(%rax)
- fnstcw 0xa4(%rax)
- /* compute address of transport_t */
- leaq 0x140(%rax), %rcx
- /* store address of transport_t in hidden field */
- movq %rcx, 0x110(%rax)
- leaq trampoline(%rip), %rcx
- /* will be entered after jump_fcontext() first time */
- movq %rcx, 0x118(%rax)
- leaq finish(%rip), %rcx
- movq %rcx, 0x108(%rax)
- /* store return address on stack */
- /* fix stack alignment */
- pushq %rbp
- jmp *%rbx
- /* 32byte shadow-space for _exit() */
- andq $-32, %rsp
- /* 32byte shadow-space for _exit() are */
- /* already reserved by make_fcontext() */
-.def _exit; .scl 2; .type 32; .endef /* standard C library function */
+.file "make_x86_64_ms_pe_gas.asm"
+.def make_fcontext; .scl 2; .type 32; .endef
+.seh_proc make_fcontext
+ movq %rcx, %rax
+ /* shift address in RAX to lower 16 byte boundary */
+ /* == pointer to fcontext_t and address of context stack */
+ andq $-16, %rax
+ /* on context-function entry: (RSP -0x8) % 16 == 0 */
+ leaq -0x150(%rax), %rax
+ movq %r8, 0x100(%rax)
+ movq %rcx, 0xc8(%rax)
+ negq %rdx
+ 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)
+ xorq %rcx, %rcx
+ movq %rcx, 0xb0(%rax)
+ stmxcsr 0xa0(%rax)
+ fnstcw 0xa4(%rax)
+ /* compute address of transport_t */
+ leaq 0x140(%rax), %rcx
+ /* store address of transport_t in hidden field */
+ movq %rcx, 0x110(%rax)
+ leaq trampoline(%rip), %rcx
+ /* will be entered after jump_fcontext() first time */
+ movq %rcx, 0x118(%rax)
+ leaq finish(%rip), %rcx
+ movq %rcx, 0x108(%rax)
+ /* store return address on stack */
+ /* fix stack alignment */
+ pushq %rbp
+ jmp *%rbx
+ /* 32byte shadow-space for _exit() */
+ andq $-32, %rsp
+ /* 32byte shadow-space for _exit() are */
+ /* already reserved by make_fcontext() */
+.def _exit; .scl 2; .type 32; .endef /* standard C library function */
@@ -1,163 +1,163 @@
-; ----------------------------------------------------------------------------------
-; | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c |
-; | SEE registers (XMM6-XMM15) |
-; | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c |
-; | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
-; | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c |
-; | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
-; | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c |
-; | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
-; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
-; | 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 | |
-EXTERN _exit:PROC
-; generate function table entry in .pdata and unwind information in
-make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
- ; .xdata for a function's structured exception handling unwind behavior
- .endprolog
- mov rax, rcx
- ; shift address in RAX to lower 16 byte boundary
- ; == pointer to fcontext_t and address of context stack
- and rax, -16
- ; on context-function entry: (RSP -0x8) % 16 == 0
- sub rax, 0150h
- ; stored in RBX
- mov [rax+0100h], r8
- mov [rax+0c8h], rcx
- neg rdx
- 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
- xor rcx, rcx
- mov [rax+0b0h], rcx
- stmxcsr [rax+0a0h]
- fnstcw [rax+0a4h]
- ; compute address of transport_t
- lea rcx, [rax+0140h]
- ; store address of transport_t in hidden field
- mov [rax+0110h], rcx
- lea rcx, trampoline
- mov [rax+0118h], rcx
- lea rcx, finish
- ; save address of finish as return-address for context-function in RBP
- mov [rax+0108h], rcx
- ; store return address on stack
- ; fix stack alignment
- push rbp
- jmp rbx
+; ----------------------------------------------------------------------------------
+; | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c |
+; | SEE registers (XMM6-XMM15) |
+; | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c |
+; | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
+; | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c |
+; | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
+; | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c |
+; | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
+; | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c |
+; | 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 | |
+EXTERN _exit:PROC
+; generate function table entry in .pdata and unwind information in
+make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+ ; .xdata for a function's structured exception handling unwind behavior
+ .endprolog
+ mov rax, rcx
+ ; shift address in RAX to lower 16 byte boundary
+ ; == pointer to fcontext_t and address of context stack
+ and rax, -16
+ ; on context-function entry: (RSP -0x8) % 16 == 0
+ sub rax, 0150h
+ ; stored in RBX
+ mov [rax+0100h], r8
+ mov [rax+0c8h], rcx
+ neg rdx
+ 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
+ xor rcx, rcx
+ mov [rax+0b0h], rcx
+ stmxcsr [rax+0a0h]
+ fnstcw [rax+0a4h]
+ ; compute address of transport_t
+ lea rcx, [rax+0140h]
+ ; store address of transport_t in hidden field
+ mov [rax+0110h], rcx
+ lea rcx, trampoline
+ mov [rax+0118h], rcx
+ lea rcx, finish
+ ; save address of finish as return-address for context-function in RBP
+ mov [rax+0108h], rcx
+ ; store return address on stack
+ ; fix stack alignment
+ push rbp
+ jmp rbx
- movq %rdi, %rax
- leaq -0x40(%rax), %rax
- /* stored in RBX */
- movq %rdx, 0x28(%rax)
- stmxcsr (%rax)
- fnstcw 0x4(%rax)
- movq %rcx, 0x38(%rax)
- movq %rcx, 0x30(%rax)
- push %rbp
- xorq %rdi, %rdi
+ movq %rdi, %rax
+ leaq -0x40(%rax), %rax
+ /* stored in RBX */
+ movq %rdx, 0x28(%rax)
+ stmxcsr (%rax)
+ fnstcw 0x4(%rax)
+ movq %rcx, 0x38(%rax)
+ movq %rcx, 0x30(%rax)
+ push %rbp
+ xorq %rdi, %rdi
@@ -1,76 +1,76 @@
@@ -1,112 +1,112 @@
-.global ontop_fcontext
-.type ontop_fcontext, %function
-ontop_fcontext:
- # store RSP (pointing to context-data) in X5
- # skip pc
- # jump to ontop-function
- ret x2
-.size ontop_fcontext,.-ontop_fcontext
+.global ontop_fcontext
+.type ontop_fcontext, %function
+ontop_fcontext:
+ # store RSP (pointing to context-data) in X5
+ # skip pc
+ # jump to ontop-function
+ ret x2
+.size ontop_fcontext,.-ontop_fcontext
@@ -1,108 +1,108 @@
-.global _ontop_fcontext
-_ontop_fcontext:
- ; store RSP (pointing to context-data) in X5
- ; skip pc
- ; jump to ontop-function
+.global _ontop_fcontext
+_ontop_fcontext:
+ ; store RSP (pointing to context-data) in X5
+ ; skip pc
+ ; jump to ontop-function
@@ -1,91 +1,91 @@
-.globl ontop_fcontext
-.type ontop_fcontext,%function
- @ store parent context in A2
- mov a2, a1
- pop {a1,v1-v8,lr}
- str a2, [a1, #0]
- str a3, [a1, #4]
- @ A1 == hidden, A2 == FCTX, A3 == DATA
- @ skip PC
- add sp, sp, #4
- @ jump to ontop-function
- bx a4
+.globl ontop_fcontext
+.type ontop_fcontext,%function
+ @ store parent context in A2
+ mov a2, a1
+ pop {a1,v1-v8,lr}
+ str a2, [a1, #0]
+ str a3, [a1, #4]
+ @ A1 == hidden, A2 == FCTX, A3 == DATA
+ @ skip PC
+ add sp, sp, #4
+ @ jump to ontop-function
+ bx a4
@@ -1,100 +1,100 @@
-.globl _ontop_fcontext
- @ restore SjLj handler
+.globl _ontop_fcontext
+ @ restore SjLj handler
- EXPORT ontop_fcontext
-ontop_fcontext PROC
- ldr a1, [v1, #0x04]
- push {a1}
- ldr a1, [v1, #0x08]
- ldr a1, [v1, #0xe0c]
- pop {a1}
- str a1, [v1, #0x04]
- str a1, [v1, #0x08]
- str a1, [v1, #0xe0c]
- ; store parent context in A2
- ; A1 == hidden, A2 == FCTX, A3 == DATA
- ; skip PC
+ EXPORT ontop_fcontext
+ontop_fcontext PROC
+ ldr a1, [v1, #0x04]
+ push {a1}
+ ldr a1, [v1, #0x08]
+ ldr a1, [v1, #0xe0c]
+ pop {a1}
+ str a1, [v1, #0x04]
+ str a1, [v1, #0x08]
+ str a1, [v1, #0xe0c]
+ ; store parent context in A2
+ ; A1 == hidden, A2 == FCTX, A3 == DATA
+ ; skip PC
- #include "ontop_i386_sysv_macho_gas.S"
- #include "ontop_x86_64_sysv_macho_gas.S"
- #include "ontop_ppc32_sysv_macho_gas.S"
- #include "ontop_ppc64_sysv_macho_gas.S"
+ #include "ontop_i386_sysv_macho_gas.S"
+ #include "ontop_x86_64_sysv_macho_gas.S"
+ #include "ontop_ppc32_sysv_macho_gas.S"
+ #include "ontop_ppc64_sysv_macho_gas.S"
@@ -1,125 +1,125 @@
-.file "ontop_i386_ms_pe_gas.asm"
-.def _ontop_fcontext; .scl 2; .type 32; .endef
- /* first arg of ontop_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %eax
- /* pass parent fcontext_t */
- movl %ecx, 0x30(%eax)
- /* second arg of ontop_fcontext() == data to be transferred */
- movl 0x34(%esp), %ecx
- /* pass data */
- movl %ecx, 0x34(%eax)
- /* third arg of ontop_fcontext() == ontop-function */
- movl 0x38(%esp), %ecx
- /* restore ESP (pointing to context-data) from EDX */
- movl 0x8(%esp), %eax
- movl %eax, 0x10(%edx)
- movl 0xc(%esp), %eax
- movl %eax, 0xe0c(%edx)
- movl 0x10(%esp), %eax
- movl %eax, 0x08(%edx)
- movl 0x14(%esp), %eax
- movl %eax, 0x04(%edx)
- movl 0x18(%esp), %eax
- movl %eax, (%edx)
- leal 0x2c(%esp), %esp
- /* keep return-address on stack */
-.ascii " -export:\"ontop_fcontext\""
+.file "ontop_i386_ms_pe_gas.asm"
+.def _ontop_fcontext; .scl 2; .type 32; .endef
+ /* first arg of ontop_fcontext() == fcontext to jump to */
+ movl 0x30(%esp), %eax
+ /* pass parent fcontext_t */
+ movl %ecx, 0x30(%eax)
+ /* second arg of ontop_fcontext() == data to be transferred */
+ movl 0x34(%esp), %ecx
+ /* pass data */
+ movl %ecx, 0x34(%eax)
+ /* third arg of ontop_fcontext() == ontop-function */
+ movl 0x38(%esp), %ecx
+ /* restore ESP (pointing to context-data) from EDX */
+ movl 0x8(%esp), %eax
+ movl %eax, 0x10(%edx)
+ movl 0xc(%esp), %eax
+ movl %eax, 0xe0c(%edx)
+ movl 0x10(%esp), %eax
+ movl %eax, 0x08(%edx)
+ movl 0x14(%esp), %eax
+ movl %eax, 0x04(%edx)
+ movl 0x18(%esp), %eax
+ movl %eax, (%edx)
+ leal 0x2c(%esp), %esp
+ /* keep return-address on stack */
+.ascii " -export:\"ontop_fcontext\""
@@ -1,124 +1,124 @@
-ontop_fcontext PROC BOOST_CONTEXT_EXPORT
- ; store ESP (pointing to context-data) in ECX
- mov ecx, esp
- ; first arg of ontop_fcontext() == fcontext to jump to
- mov eax, [esp+030h]
- ; pass parent fcontext_t
- mov [eax+030h], ecx
- ; second arg of ontop_fcontext() == data to be transferred
- mov ecx, [esp+034h]
- ; pass data
- mov [eax+034h], ecx
- ; third arg of ontop_fcontext() == ontop-function
- mov ecx, [esp+038h]
- ; restore ESP (pointing to context-data) from EAX
- mov esp, eax
- mov eax, [esp+08h]
- mov [edx+010h], eax
- mov eax, [esp+0ch]
- mov [edx+0e0ch], eax
- mov eax, [esp+010h]
- mov [edx+08h], eax
- mov eax, [esp+014h]
- mov [edx+04h], eax
- mov eax, [esp+018h]
- mov [edx], eax
- lea esp, [esp+02ch]
- ; keep return-address on stack
-ontop_fcontext ENDP
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT
+ ; store ESP (pointing to context-data) in ECX
+ mov ecx, esp
+ ; first arg of ontop_fcontext() == fcontext to jump to
+ mov eax, [esp+030h]
+ ; pass parent fcontext_t
+ mov [eax+030h], ecx
+ ; second arg of ontop_fcontext() == data to be transferred
+ mov ecx, [esp+034h]
+ ; pass data
+ mov [eax+034h], ecx
+ ; third arg of ontop_fcontext() == ontop-function
+ mov ecx, [esp+038h]
+ ; restore ESP (pointing to context-data) from EAX
+ mov esp, eax
+ mov eax, [esp+08h]
+ mov [edx+010h], eax
+ mov eax, [esp+0ch]
+ mov [edx+0e0ch], eax
+ mov eax, [esp+010h]
+ mov [edx+08h], eax
+ mov eax, [esp+014h]
+ mov [edx+04h], eax
+ mov eax, [esp+018h]
+ mov [edx], eax
+ lea esp, [esp+02ch]
+ ; keep return-address on stack
+ontop_fcontext ENDP
@@ -1,89 +1,89 @@
-.type ontop_fcontext,@function
- movl %ecx, 0x20(%eax)
- movl 0x24(%esp), %ecx
- movl 0x28(%esp), %ecx
- leal 0x18(%esp), %esp /* prepare stack */
+.type ontop_fcontext,@function
+ movl %ecx, 0x20(%eax)
+ movl 0x24(%esp), %ecx
+ movl 0x28(%esp), %ecx
+ leal 0x18(%esp), %esp /* prepare stack */
- movl 0x20(%esp), %ecx
+ movl 0x20(%esp), %ecx
@@ -1,119 +1,119 @@
-.ent ontop_fcontext
- lw $t9, 44($sp)
- # A0 == hidden, A1 == fctx, A2 == data
- move $a1, $a0
- move $a0, $t0
- jr $a3
-.end ontop_fcontext
-.size ontop_fcontext, .-ontop_fcontext
+.ent ontop_fcontext
+ lw $t9, 44($sp)
+ # A0 == hidden, A1 == fctx, A2 == data
+ move $a1, $a0
+ move $a0, $t0
+ jr $a3
+.end ontop_fcontext
+.size ontop_fcontext, .-ontop_fcontext
- # store RSP (pointing to context-data) in R7
- mr %r7, %r1
- lwz %r4, 228(%r1) # restore hidden
- # ignore PC
- stw %r7, 0(%r4)
- stw %r5, 4(%r4)
- mtctr %r6
+ # store RSP (pointing to context-data) in R7
+ mr %r7, %r1
+ lwz %r4, 228(%r1) # restore hidden
+ # ignore PC
+ stw %r7, 0(%r4)
+ stw %r5, 4(%r4)
+ mtctr %r6
- mr r7, r1
- lwz r4, 228(r1) # restore hidden
- stw r7, 0(r4)
- stw r5, 4(r4)
- mtctr r6
+ mr r7, r1
+ lwz r4, 228(r1) # restore hidden
+ stw r7, 0(r4)
+ stw r5, 4(r4)
+ mtctr r6
-.globl .ontop_fcontext
-.globl ontop_fcontext[DS]
-.csect ontop_fcontext[DS]
- .long .ontop_fcontext
-.ontop_fcontext:
+.globl .ontop_fcontext
+.globl ontop_fcontext[DS]
+.csect ontop_fcontext[DS]
+ .long .ontop_fcontext
+.ontop_fcontext:
@@ -1,240 +1,240 @@
- addis %r2, %r12, .TOC.-ontop_fcontext@ha
- addi %r2, %r2, .TOC.-ontop_fcontext@l
- .localentry ontop_fcontext, . - ontop_fcontext
- .quad .L.ontop_fcontext,.TOC.@tocbase,0
- .type ontop_fcontext,@function
-.L.ontop_fcontext:
- .hidden .ontop_fcontext
- .globl .ontop_fcontext
- .quad .ontop_fcontext,.TOC.@tocbase,0
- .size ontop_fcontext,24
- .type .ontop_fcontext,@function
- mtctr %r5
- # copy transfer_t into ontop_fn arg registers
- mr %r3, %r7
- mr %r4, %r7
- # arg pointer already in %r5
- # hidden arg already in %r3
- ld %r7, 0(%r6)
- mtctr %r7
- # restore TOC
- ld %r2, 8(%r6)
-return_to_ctx:
- .size ontop_fcontext, .-ontop_fcontext
- # compute return-value struct address
- # (passed has hidden arg to ontop_fn)
- addi %r3, %r1, 8
- # jump to context and update LR
- bctrl
- ld %r7, 176(%r1)
- ld %r2, 0(%r1)
- # copy returned transfer_t into entry_fn arg registers
- ld %r3, 8(%r1)
- ld %r4, 16(%r1)
- b return_to_ctx
- .size .ontop_fcontext, .-.L.ontop_fcontext
- .size .ontop_fcontext, .-.ontop_fcontext
+ addis %r2, %r12, .TOC.-ontop_fcontext@ha
+ addi %r2, %r2, .TOC.-ontop_fcontext@l
+ .localentry ontop_fcontext, . - ontop_fcontext
+ .quad .L.ontop_fcontext,.TOC.@tocbase,0
+ .type ontop_fcontext,@function
+.L.ontop_fcontext:
+ .hidden .ontop_fcontext
+ .globl .ontop_fcontext
+ .quad .ontop_fcontext,.TOC.@tocbase,0
+ .size ontop_fcontext,24
+ .type .ontop_fcontext,@function
+ mtctr %r5
+ # copy transfer_t into ontop_fn arg registers
+ mr %r3, %r7
+ mr %r4, %r7
+ # arg pointer already in %r5
+ # hidden arg already in %r3
+ ld %r7, 0(%r6)
+ mtctr %r7
+ # restore TOC
+ ld %r2, 8(%r6)
+return_to_ctx:
+ .size ontop_fcontext, .-ontop_fcontext
+ # compute return-value struct address
+ # (passed has hidden arg to ontop_fn)
+ addi %r3, %r1, 8
+ # jump to context and update LR
+ bctrl
+ ld %r7, 176(%r1)
+ ld %r2, 0(%r1)
+ # copy returned transfer_t into entry_fn arg registers
+ ld %r3, 8(%r1)
+ ld %r4, 16(%r1)
+ b return_to_ctx
+ .size .ontop_fcontext, .-.L.ontop_fcontext
+ .size .ontop_fcontext, .-.ontop_fcontext
@@ -1,151 +1,151 @@
- ; store RSP (pointing to context-data) in R7
- ld r4, 152(r1) ; restore hidden
- ; ignore PC
- ; adjust stack
- std r7, 0(r4)
- std r5, 8(r4)
- ; restore CTR
+ ; store RSP (pointing to context-data) in R7
+ ld r4, 152(r1) ; restore hidden
+ ; ignore PC
+ ; adjust stack
+ std r7, 0(r4)
+ std r5, 8(r4)
+ ; restore CTR
@@ -1,83 +1,83 @@
- mr 7, 1
- ld 4, 152(1) # restore hidden
- std 7, 0(4)
- std 5, 8(4)
- mtctr 6
+ mr 7, 1
+ ld 4, 152(1) # restore hidden
+ std 7, 0(4)
+ std 5, 8(4)
+ mtctr 6
@@ -1,211 +1,211 @@
-.file "ontop_x86_64_ms_pe_gas.asm"
-.def ontop_fcontext; .scl 2; .type 32; .endef
-.seh_proc ontop_fcontext
- /* preserve RSP (pointing to context-data) in RCX */
- movq %rsp, %rcx
- movq %rcx, 0x0(%rax)
- /* RCX contains address of returned (hidden) transfer_t */
- /* RDX contains address of passed transfer_t */
- movq %rax, %rdx
- jmp *%r9
+.file "ontop_x86_64_ms_pe_gas.asm"
+.def ontop_fcontext; .scl 2; .type 32; .endef
+.seh_proc ontop_fcontext
+ /* preserve RSP (pointing to context-data) in RCX */
+ movq %rsp, %rcx
+ movq %rcx, 0x0(%rax)
+ /* RCX contains address of returned (hidden) transfer_t */
+ /* RDX contains address of passed transfer_t */
+ movq %rax, %rdx
+ jmp *%r9
@@ -1,207 +1,207 @@
-ontop_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
- 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
- stmxcsr [rsp+0a0h]
- fnstcw [rsp+0a4h]
- ; load NT_TIB
- mov r10, gs:[030h]
- ; save fiber local storage
- mov rax, [r10+020h]
- mov [rsp+0b0h], rax
- mov rax, [r10+01478h]
- mov [rsp+0b8h], rax
- mov rax, [r10+010h]
- mov [rsp+0c0h], rax
- 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]
- ldmxcsr [rsp+0a0h]
- fldcw [rsp+0a4h]
- mov rax, [rsp+0b0h]
- mov [r10+020h], rax
- mov rax, [rsp+0b8h]
- mov [r10+01478h], rax
- mov rax, [rsp+0c0h]
- mov [r10+010h], rax
- 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
- lea rsp, [rsp+0118h]
- ; 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
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+ 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
+ stmxcsr [rsp+0a0h]
+ fnstcw [rsp+0a4h]
+ ; load NT_TIB
+ mov r10, gs:[030h]
+ ; save fiber local storage
+ mov rax, [r10+020h]
+ mov [rsp+0b0h], rax
+ mov rax, [r10+01478h]
+ mov [rsp+0b8h], rax
+ mov rax, [r10+010h]
+ mov [rsp+0c0h], rax
+ 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]
+ ldmxcsr [rsp+0a0h]
+ fldcw [rsp+0a4h]
+ mov rax, [rsp+0b0h]
+ mov [r10+020h], rax
+ mov rax, [rsp+0b8h]
+ mov [r10+01478h], rax
+ mov rax, [rsp+0c0h]
+ mov [r10+010h], rax
+ 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
+ lea rsp, [rsp+0118h]
+ ; 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
- /* preserve ontop-function in R8 */
- movq %rdx, %r8
- leaq 0x38(%rsp), %rsp /* prepare stack */
+ /* preserve ontop-function in R8 */
+ movq %rdx, %r8
+ leaq 0x38(%rsp), %rsp /* prepare stack */
@@ -1,78 +1,78 @@