diff options
author | johannst <johannes.stoelp@gmail.com> | 2020-09-22 23:48:09 +0200 |
---|---|---|
committer | johannst <johannes.stoelp@gmail.com> | 2020-09-22 23:48:09 +0200 |
commit | 33f286000db35fe50639c237caa736deea304585 (patch) | |
tree | ddb74ebd1f626b200cbb5050545ded484dde4787 /lib/arch/x86_64/yield.s | |
parent | 488d4c6237c3f713077fe93e2745ba5defde0aa5 (diff) | |
download | matcha-threads-33f286000db35fe50639c237caa736deea304585.tar.gz matcha-threads-33f286000db35fe50639c237caa736deea304585.zip |
split classes into separate files, add arch specific subdir
Diffstat (limited to 'lib/arch/x86_64/yield.s')
-rw-r--r-- | lib/arch/x86_64/yield.s | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/arch/x86_64/yield.s b/lib/arch/x86_64/yield.s new file mode 100644 index 0000000..d40bcd7 --- /dev/null +++ b/lib/arch/x86_64/yield.s @@ -0,0 +1,44 @@ +# Copyright (c) 2020 Johannes Stoelp + + .intel_syntax noprefix + .section .text, "ax", @progbits + + # extern "C" void yield(const void* new_stack, void* const* old_stack); + # ^^^^^^^^^ ^^^^^^^^^ + # rdi rsi + .global yield + .type yield, @function +yield: + .cfi_startproc + // prologue + push rbp + mov rbp, rsp + + // push callee saved registers + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + + // arg0: rdi holds new stack + // arg1: rsi holds addr to location current stack must be saved + mov [rsi], rsp # save current stack ptr + mov rsp, rdi # switch to new stack ptr + + // pop callee saved registers + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + + // epilogue + mov rsp, rbp + pop rbp + + ret + .cfi_endproc + .size yield, .-yield |