fiber_continue_x86_64.s 1.78 KB
Newer Older
1 2
	.file	"fiber_continue_x86_64.s"
	.text
3 4
	.global	__fiber_continue
	.type	__fiber_continue, @function
5 6

.align 16
7 8 9
__fiber_continue:
        # Parameter List (in order)
        # rdi = pointer to continuation (should hold value of target stack will be filled with this continuation)
10

11 12 13 14 15 16 17 18
        # Return
        # rax = continuation that returned control back to the caller (null if fallthrough)

        # Variables
        # r12 = temporary for the old stack pointer

        ############### Save State ###############
        # Make space for all register state we will store.
19 20
        leaq -0x38(%rsp), %rsp

21
        # Store calee saved general registers.
22 23 24 25 26 27
        movq %r12, 0x00(%rsp)
        movq %r13, 0x08(%rsp)
        movq %r14, 0x10(%rsp)
        movq %r15, 0x18(%rsp)
        movq %rbx, 0x20(%rsp)
        movq %rbp, 0x28(%rsp)
28
        # Store MMX control- and status-word
29
        stmxcsr 0x30(%rsp)
30
        # Store x87 control-word
31
        fnstcw 0x34(%rsp)
32
        ############### Save State ###############
33

34
        # Perform change to new stack.
35
        # Keep old stack as result from this function
36 37
        movq %rsp, %r12
        # switch to new stack pointer
38
        movq %rdi, %rsp
39

40
        ############ Restore State  ############
41 42 43 44 45 46 47 48 49 50 51 52 53 54
        # restore calee saved general registers
        movq 0x00(%rsp), %r12
        movq 0x08(%rsp), %r13
        movq 0x10(%rsp), %r14
        movq 0x18(%rsp), %r15
        movq 0x20(%rsp), %rbx
        movq 0x28(%rsp), %rbp
        # restore MMX control- and status-word
        ldmxcsr 0x30(%rsp)
        # restore x87 control-word
        fldcw 0x34(%rsp)

        # Free space for restored state
        leaq 0x38(%rsp), %rsp
55
        ############ Restore State  ############
56

57 58
        # Return the context we came from as a continuation.
        movq %r12, %rax
59
        ret