| /* |
| Copyright Oliver Kowalke 2009. |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| |
| /**************************************************************************************** |
| * * |
| * ---------------------------------------------------------------------------------- * |
| * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * |
| * ---------------------------------------------------------------------------------- * |
| * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | * |
| * ---------------------------------------------------------------------------------- * |
| * | fc_mxcsr|fc_x87_cw| R12 | R13 | R14 | * |
| * ---------------------------------------------------------------------------------- * |
| * ---------------------------------------------------------------------------------- * |
| * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * |
| * ---------------------------------------------------------------------------------- * |
| * | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | * |
| * ---------------------------------------------------------------------------------- * |
| * | R15 | RBX | RBP | RIP | * |
| * ---------------------------------------------------------------------------------- * |
| * ---------------------------------------------------------------------------------- * |
| * | 16 | 17 | | * |
| * ---------------------------------------------------------------------------------- * |
| * | 0x40 | 0x44 | | * |
| * ---------------------------------------------------------------------------------- * |
| * | EXIT | | * |
| * ---------------------------------------------------------------------------------- * |
| * * |
| ****************************************************************************************/ |
| |
| .text |
| .globl jump_fcontext |
| .type jump_fcontext,@function |
| .align 16 |
| jump_fcontext: |
| pushq %rbp /* save RBP */ |
| pushq %rbx /* save RBX */ |
| pushq %r15 /* save R15 */ |
| pushq %r14 /* save R14 */ |
| pushq %r13 /* save R13 */ |
| pushq %r12 /* save R12 */ |
| |
| /* prepare stack for FPU */ |
| leaq -0x8(%rsp), %rsp |
| |
| /* test for flag preserve_fpu */ |
| cmp $0, %rcx |
| je 1f |
| |
| /* save MMX control- and status-word */ |
| stmxcsr (%rsp) |
| /* save x87 control-word */ |
| fnstcw 0x4(%rsp) |
| |
| 1: |
| /* store RSP (pointing to context-data) in RDI */ |
| movq %rsp, (%rdi) |
| |
| /* restore RSP (pointing to context-data) from RSI */ |
| movq %rsi, %rsp |
| |
| /* test for flag preserve_fpu */ |
| cmp $0, %rcx |
| je 2f |
| |
| /* restore MMX control- and status-word */ |
| ldmxcsr (%rsp) |
| /* restore x87 control-word */ |
| fldcw 0x4(%rsp) |
| |
| 2: |
| /* prepare stack for FPU */ |
| leaq 0x8(%rsp), %rsp |
| |
| popq %r12 /* restrore R12 */ |
| popq %r13 /* restrore R13 */ |
| popq %r14 /* restrore R14 */ |
| popq %r15 /* restrore R15 */ |
| popq %rbx /* restrore RBX */ |
| popq %rbp /* restrore RBP */ |
| |
| /* restore return-address */ |
| popq %r8 |
| |
| /* use third arg as return-value after jump */ |
| movq %rdx, %rax |
| /* use third arg as first arg in context function */ |
| movq %rdx, %rdi |
| |
| /* indirect jump to context */ |
| jmp *%r8 |
| .size jump_fcontext,.-jump_fcontext |
| |
| /* Mark that we don't need executable stack. */ |
| .section .note.GNU-stack,"",%progbits |