summaryrefslogtreecommitdiff
path: root/coroutine/win64/Context.asm
diff options
context:
space:
mode:
authorsamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 10:17:39 +0000
committersamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 10:17:39 +0000
commitd97c9280671444215da845bb71c2d624a08be4df (patch)
tree6f2a00145bf000f8cb2bf22c1a7e7ae7d7b183e3 /coroutine/win64/Context.asm
parent904af4aef28709933bf54e5f73761c4b1cf6169d (diff)
downloadruby-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.asm21
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