diff options
author | samuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-20 10:17:39 +0000 |
---|---|---|
committer | samuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-20 10:17:39 +0000 |
commit | d97c9280671444215da845bb71c2d624a08be4df (patch) | |
tree | 6f2a00145bf000f8cb2bf22c1a7e7ae7d7b183e3 /coroutine/win64 | |
parent | 904af4aef28709933bf54e5f73761c4b1cf6169d (diff) |
Better (?) support for Windows TIB.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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; |