From dfa05a97e083122a788c0ffb5c9e26888fe3dcd1 Mon Sep 17 00:00:00 2001 From: johannst Date: Thu, 17 Sep 2020 00:06:28 +0200 Subject: setup new stack + basic yielding between two stacks --- lib/thread_create.s | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 lib/thread_create.s (limited to 'lib/thread_create.s') 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 + -- cgit v1.2.3