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/Context.asm | |
parent | 904af4aef28709933bf54e5f73761c4b1cf6169d (diff) | |
download | ruby-d97c9280671444215da845bb71c2d624a08be4df.tar.gz |
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/Context.asm')
-rw-r--r-- | coroutine/win64/Context.asm | 21 |
1 files changed, 16 insertions, 5 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 |