| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
- */
- /****************************************************************************************
- * *
- * ---------------------------------------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ---------------------------------------------------------------------------------- *
- * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
- * ---------------------------------------------------------------------------------- *
- * | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ---------------------------------------------------------------------------------- *
- * | 0x20 | 0x24 | | *
- * ---------------------------------------------------------------------------------- *
- * | to | data | | *
- * ---------------------------------------------------------------------------------- *
- * *
- ****************************************************************************************/
- .text
- .globl make_fcontext
- .align 2
- .type make_fcontext,@function
- make_fcontext:
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x4(%esp), %eax
- /* reserve space for first argument of context-function
- eax might already point to a 16byte border */
- leal -0x8(%eax), %eax
- /* shift address in EAX to lower 16 byte boundary */
- andl $-16, %eax
- /* reserve space for context-data on context-stack */
- leal -0x28(%eax), %eax
- /* third arg of make_fcontext() == address of context-function */
- /* stored in EBX */
- movl 0xc(%esp), %ecx
- movl %ecx, 0x10(%eax)
- /* save MMX control- and status-word */
- stmxcsr (%eax)
- /* save x87 control-word */
- fnstcw 0x4(%eax)
- /* return transport_t */
- /* FCTX == EDI, DATA == ESI */
- leal 0x8(%eax), %ecx
- movl %ecx, 0x1c(%eax)
- /* compute abs address of label trampoline */
- call 1f
- /* address of trampoline 1 */
- 1: popl %ecx
- /* compute abs address of label trampoline */
- addl $trampoline-1b, %ecx
- /* save address of trampoline as return address */
- /* will be entered after calling jump_fcontext() first time */
- movl %ecx, 0x18(%eax)
- /* compute abs address of label finish */
- call 2f
- /* address of label 2 */
- 2: popl %ecx
- /* compute abs address of label finish */
- addl $finish-2b, %ecx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movl %ecx, 0x14(%eax)
- ret /* return pointer to context-data */
- trampoline:
- /* move transport_t for entering context-function */
- movl %edi, (%esp)
- movl %esi, 0x4(%esp)
- pushl %ebp
- /* jump to context-function */
- jmp *%ebx
- finish:
- call 3f
- /* address of label 3 */
- 3: popl %ebx
- /* compute address of GOT and store it in EBX */
- addl $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
- /* exit code is zero */
- xorl %eax, %eax
- movl %eax, (%esp)
- /* exit application */
- call _exit@PLT
- hlt
- .size make_fcontext,.-make_fcontext
- /* Mark that we don't need executable stack. */
- .section .note.GNU-stack,"",%progbits
|