diff options
author | Lars Kanis <lars@greiz-reinsdorf.de> | 2019-07-06 14:32:39 +0200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2019-07-07 21:33:47 +1200 |
commit | 68e580402272cea7f98145c3c562cab565a37046 (patch) | |
tree | 8e8df649d383f3de1c37c82b9aca565486cf0dcf | |
parent | a13636e756662e563e4c4dc802c6fa21cb6d7b52 (diff) |
Add coroutine context switch for i386-mingw32
It's essentially a translation of Context.asm from Intel
to AT&T syntax.
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | coroutine/win32/Context.S | 47 |
2 files changed, 50 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index ce2630dd9d..bc678cdc2d 100644 --- a/configure.ac +++ b/configure.ac @@ -2273,6 +2273,9 @@ AS_CASE(["$rb_cv_fiber_coroutine"], [yes|''], [ [x64-mingw32], [ rb_cv_fiber_coroutine=win64 ], + [*86-mingw32], [ + rb_cv_fiber_coroutine=win32 + ], [armv7*-linux-*], [ rb_cv_fiber_coroutine=ucontext ], diff --git a/coroutine/win32/Context.S b/coroutine/win32/Context.S new file mode 100644 index 0000000000..d14bf435e8 --- /dev/null +++ b/coroutine/win32/Context.S @@ -0,0 +1,47 @@ +## +## This file is part of the "Coroutine" project and released under the MIT License. +## +## Created by Lars Kanis on 06/06/2019. +## + +.text + +# Using fastcall is a big win (and it's the same as how x64 works). +# In coroutine transfer, the arguments are passed in ecx and edx. We don't need +# to touch these in order to pass them to the destination coroutine. + +.globl @coroutine_transfer@8 +@coroutine_transfer@8: + # Save the thread information block: + pushl %fs:0 + pushl %fs:4 + pushl %fs:8 + + # Save caller registers: + pushl %ebp + pushl %ebx + pushl %edi + pushl %esi + + # Save caller stack pointer: + movl %esp, (%ecx) + + # Restore callee stack pointer: + movl (%edx), %esp + + # Restore callee stack: + popl %esi + popl %edi + popl %ebx + popl %ebp + + # Restore the thread information block: + popl %fs:8 + popl %fs:4 + popl %fs:0 + + # Save the first argument as the return value: + movl %ecx, %eax + + # Jump to the address on the stack: + ret |