1/* 2 Copyright Oliver Kowalke 2009. 3 Copyright Thomas Sailer 2013. 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE_1_0.txt or copy at 6 http://www.boost.org/LICENSE_1_0.txt) 7*/ 8 9/************************************************************************************* 10* --------------------------------------------------------------------------------- * 11* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * 12* --------------------------------------------------------------------------------- * 13* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | * 14* --------------------------------------------------------------------------------- * 15* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | * 16* --------------------------------------------------------------------------------- * 17* --------------------------------------------------------------------------------- * 18* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * 19* --------------------------------------------------------------------------------- * 20* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | * 21* --------------------------------------------------------------------------------- * 22* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| * 23* --------------------------------------------------------------------------------- * 24**************************************************************************************/ 25 26.file "ontop_i386_ms_pe_gas.asm" 27.text 28.p2align 4,,15 29 30/* mark as using no unregistered SEH handlers */ 31.globl @feat.00 32.def @feat.00; .scl 3; .type 0; .endef 33.set @feat.00, 1 34 35.globl _ontop_fcontext 36.def _ontop_fcontext; .scl 2; .type 32; .endef 37_ontop_fcontext: 38 /* prepare stack */ 39 leal -0x2c(%esp), %esp 40 41#if !defined(BOOST_USE_TSX) 42 /* save MMX control- and status-word */ 43 stmxcsr (%esp) 44 /* save x87 control-word */ 45 fnstcw 0x4(%esp) 46#endif 47 48 /* load NT_TIB */ 49 movl %fs:(0x18), %edx 50 /* load fiber local storage */ 51 movl 0x10(%edx), %eax 52 movl %eax, 0x8(%esp) 53 /* load current dealloction stack */ 54 movl 0xe0c(%edx), %eax 55 movl %eax, 0xc(%esp) 56 /* load current stack limit */ 57 movl 0x8(%edx), %eax 58 movl %eax, 0x10(%esp) 59 /* load current stack base */ 60 movl 0x4(%edx), %eax 61 movl %eax, 0x14(%esp) 62 /* load current SEH exception list */ 63 movl (%edx), %eax 64 movl %eax, 0x18(%esp) 65 66 movl %edi, 0x1c(%esp) /* save EDI */ 67 movl %esi, 0x20(%esp) /* save ESI */ 68 movl %ebx, 0x24(%esp) /* save EBX */ 69 movl %ebp, 0x28(%esp) /* save EBP */ 70 71 /* store ESP (pointing to context-data) in ECX */ 72 movl %esp, %ecx 73 74 /* first arg of ontop_fcontext() == fcontext to jump to */ 75 movl 0x30(%esp), %eax 76 77 /* pass parent fcontext_t */ 78 movl %ecx, 0x30(%eax) 79 80 /* second arg of ontop_fcontext() == data to be transferred */ 81 movl 0x34(%esp), %ecx 82 83 /* pass data */ 84 movl %ecx, 0x34(%eax) 85 86 /* third arg of ontop_fcontext() == ontop-function */ 87 movl 0x38(%esp), %ecx 88 89 /* restore ESP (pointing to context-data) from EDX */ 90 movl %eax, %esp 91 92#if !defined(BOOST_USE_TSX) 93 /* restore MMX control- and status-word */ 94 ldmxcsr (%esp) 95 /* restore x87 control-word */ 96 fldcw 0x4(%esp) 97#endif 98 99 /* restore NT_TIB into EDX */ 100 movl %fs:(0x18), %edx 101 /* restore fiber local storage */ 102 movl 0x8(%esp), %eax 103 movl %eax, 0x10(%edx) 104 /* restore current deallocation stack */ 105 movl 0xc(%esp), %eax 106 movl %eax, 0xe0c(%edx) 107 /* restore current stack limit */ 108 movl 0x10(%esp), %eax 109 movl %eax, 0x08(%edx) 110 /* restore current stack base */ 111 movl 0x14(%esp), %eax 112 movl %eax, 0x04(%edx) 113 /* restore current SEH exception list */ 114 movl 0x18(%esp), %eax 115 movl %eax, (%edx) 116 117 movl 0x1c(%esp), %edi /* restore EDI */ 118 movl 0x20(%esp), %esi /* restore ESI */ 119 movl 0x24(%esp), %ebx /* restore EBX */ 120 movl 0x28(%esp), %ebp /* restore EBP */ 121 122 /* prepare stack */ 123 leal 0x2c(%esp), %esp 124 125 /* keep return-address on stack */ 126 127 /* jump to context */ 128 jmp *%ecx 129 130.section .drectve 131.ascii " -export:\"_ontop_fcontext\"" 132