diff options
author | johannst <johannes.stoelp@gmail.com> | 2020-09-17 00:06:28 +0200 |
---|---|---|
committer | johannst <johannes.stoelp@gmail.com> | 2020-09-17 00:06:28 +0200 |
commit | dfa05a97e083122a788c0ffb5c9e26888fe3dcd1 (patch) | |
tree | 7655b3c4ff7ff5bda43a6a26bcbb406e9bf2999f /lib/thread_create.s | |
parent | 4e784fc5668909789fa90b8448116b096130740f (diff) | |
download | matcha-threads-dfa05a97e083122a788c0ffb5c9e26888fe3dcd1.tar.gz matcha-threads-dfa05a97e083122a788c0ffb5c9e26888fe3dcd1.zip |
setup new stack + basic yielding between two stacks
Diffstat (limited to 'lib/thread_create.s')
-rw-r--r-- | lib/thread_create.s | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/thread_create.s b/lib/thread_create.s new file mode 100644 index 0000000..6d6fa96 --- /dev/null +++ b/lib/thread_create.s @@ -0,0 +1,65 @@ +# SysV AMD64 ABI +# int/ptr args : rdi, rsi, rdx, rcx, r8, r9 +# int/ptr ret : rax + + .intel_syntax noprefix + .section .text ,"ax",@progbits + + # extern "C" void thread_create(); + .global thread_create + .type thread_create, @function +thread_create: + .cfi_startproc + mov rdi, qword ptr [rsp+0x8] + mov rsi, qword ptr [rsp] + + call rsi + + # FIXME: no return from thread after user fn finished. +1: + jmp 1b + .cfi_endproc + .size thread_create, .-thread_create + + + + # extern "C" void yield(void* new_stack, void** 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 + |