diff options
Diffstat (limited to 'coroutine/amd64/Context.S')
-rw-r--r-- | coroutine/amd64/Context.S | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/coroutine/amd64/Context.S b/coroutine/amd64/Context.S new file mode 100644 index 0000000000..641bd016ab --- /dev/null +++ b/coroutine/amd64/Context.S @@ -0,0 +1,42 @@ +## +## This file is part of the "Coroutine" project and released under the MIT License. +## +## Created by Samuel Williams on 10/5/2018. +## Copyright, 2018, by Samuel Williams. All rights reserved. +## + +.text + +# For older linkers +.globl _coroutine_transfer +_coroutine_transfer: + +.globl coroutine_transfer +coroutine_transfer: + # Save caller state + pushq %rbp + pushq %rbx + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + + # Save caller stack pointer + movq %rsp, (%rdi) + + # Restore callee stack pointer + movq (%rsi), %rsp + + # Restore callee stack + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbx + popq %rbp + + # Put the first argument into the return value + movq %rdi, %rax + + # We pop the return address and jump to it + ret |