diff options
Diffstat (limited to 'coroutine/win64')
-rw-r--r-- | coroutine/win64/Context.asm | 21 | ||||
-rw-r--r-- | coroutine/win64/Context.h | 7 |
2 files changed, 20 insertions, 8 deletions
diff --git a/coroutine/win64/Context.asm b/coroutine/win64/Context.asm index a9f819a8c6..4031c613fe 100644 --- a/coroutine/win64/Context.asm +++ b/coroutine/win64/Context.asm @@ -8,6 +8,12 @@ .code coroutine_transfer proc + ; Save the thread information block: + push gs:[0x00] + push gs:[0x08] + push gs:[0x10] + + ; Save caller registers: push rbp push rbx push rdi @@ -17,13 +23,13 @@ coroutine_transfer proc push r14 push r15 - ; Save caller stack pointer + ; Save caller stack pointer: mov [rcx], rsp - ; Restore callee stack pointer + ; Restore callee stack pointer: mov rsp, [rdx] - ; Restore callee stack + ; Restore callee stack: pop r15 pop r14 pop r13 @@ -33,10 +39,15 @@ coroutine_transfer proc pop rbx pop rbp - ; Put the first argument into the return value + ; Restore the thread information block: + pop gs:[0x10] + pop gs:[0x08] + pop gs:[0x00] + + ; Put the first argument into the return value: mov rax, rcx - ; We pop the return address and jump to it + ; We pop the return address and jump to it: ret coroutine_transfer endp diff --git a/coroutine/win64/Context.h b/coroutine/win64/Context.h index 3b6ffb2175..32d6e1038b 100644 --- a/coroutine/win64/Context.h +++ b/coroutine/win64/Context.h @@ -40,9 +40,10 @@ static inline void coroutine_initialize( } /* Windows Thread Information Block */ - *--context->stack_pointer = 0; - *--context->stack_pointer = stack_pointer; - *--context->stack_pointer = (void*)stack_size; + *--context->stack_pointer = 0; /* gs:[0x00] */ + *--context->stack_pointer = stack_pointer + stack_size; /* gs:[0x08] */ + *--context->stack_pointer = (void*)stack_pointer; /* gs:[0x10] */ + *--context->stack_pointer = (void*)start; |