Skip to content

Commit

Permalink
Add coroutine context switch for i386-mingw32
Browse files Browse the repository at this point in the history
It's essentially a translation of Context.asm from Intel
to AT&T syntax.
  • Loading branch information
larskanis authored and ioquatix committed Jul 7, 2019
1 parent a13636e commit 68e5804
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
3 changes: 3 additions & 0 deletions configure.ac
Expand Up @@ -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
],
Expand Down
47 changes: 47 additions & 0 deletions 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

0 comments on commit 68e5804

Please sign in to comment.