1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Add coroutine context switch for i386-mingw32

It's essentially a translation of Context.asm from Intel
to AT&T syntax.
This commit is contained in:
Lars Kanis 2019-07-06 14:32:39 +02:00 committed by Samuel Williams
parent a13636e756
commit 68e5804022
No known key found for this signature in database
GPG key ID: A0765423A44728FB
2 changed files with 50 additions and 0 deletions

View file

@ -2273,6 +2273,9 @@ AS_CASE(["$rb_cv_fiber_coroutine"], [yes|''], [
[x64-mingw32], [ [x64-mingw32], [
rb_cv_fiber_coroutine=win64 rb_cv_fiber_coroutine=win64
], ],
[*86-mingw32], [
rb_cv_fiber_coroutine=win32
],
[armv7*-linux-*], [ [armv7*-linux-*], [
rb_cv_fiber_coroutine=ucontext rb_cv_fiber_coroutine=ucontext
], ],

47
coroutine/win32/Context.S Normal file
View file

@ -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