[前][次][番号順一覧][スレッド一覧]

ruby-changes:53664

From: samuel <ko1@a...>
Date: Wed, 21 Nov 2018 00:07:40 +0900 (JST)
Subject: [ruby-changes:53664] samuel:r65867 (trunk): Better (?) support for Windows TIB.

samuel	2018-11-20 19:17:39 +0900 (Tue, 20 Nov 2018)

  New Revision: 65867

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65867

  Log:
    Better (?) support for Windows TIB.

  Modified files:
    trunk/coroutine/win32/Context.asm
    trunk/coroutine/win32/Context.h
    trunk/coroutine/win64/Context.asm
    trunk/coroutine/win64/Context.h
Index: coroutine/win64/Context.asm
===================================================================
--- coroutine/win64/Context.asm	(revision 65866)
+++ coroutine/win64/Context.asm	(revision 65867)
@@ -8,6 +8,12 @@ https://github.com/ruby/ruby/blob/trunk/coroutine/win64/Context.asm#L8
 .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 https://github.com/ruby/ruby/blob/trunk/coroutine/win64/Context.asm#L23
 	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 https://github.com/ruby/ruby/blob/trunk/coroutine/win64/Context.asm#L39
 	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
 
Index: coroutine/win64/Context.h
===================================================================
--- coroutine/win64/Context.h	(revision 65866)
+++ coroutine/win64/Context.h	(revision 65867)
@@ -40,9 +40,10 @@ static inline void coroutine_initialize( https://github.com/ruby/ruby/blob/trunk/coroutine/win64/Context.h#L40
 	}
 
 	/* Windows Thread Information Block */
-	*--context->stack_pointer = 0;
-	*--context->stack_pointer = stack_pointer;
-	*--context->stack_pointer = (void*)stack_size;
+	*--context->stack_pointer = 0; /* gs:[0x00] */
+	*--context->stack_pointer = stack_pointer + stack_size; /* gs:[0x08] */
+	*--context->stack_pointer = (void*)stack_pointer;  /* gs:[0x10] */
+
 
 	*--context->stack_pointer = (void*)start;
 
Index: coroutine/win32/Context.asm
===================================================================
--- coroutine/win32/Context.asm	(revision 65866)
+++ coroutine/win32/Context.asm	(revision 65867)
@@ -14,28 +14,38 @@ https://github.com/ruby/ruby/blob/trunk/coroutine/win32/Context.asm#L14
 ; to touch these in order to pass them to the destination coroutine.
 
 @coroutine_transfer@8 proc
-	; Save caller registers
+	; Save the thread information block:
+	push fs:[0]
+	push fs:[4]
+	push fs:[8]
+
+	; Save caller registers:
 	push ebp
 	push ebx
 	push edi
 	push esi
 
-	; Save caller stack pointer
+	; Save caller stack pointer:
 	mov dword ptr [ecx], esp
 
-	; Restore callee stack pointer
+	; Restore callee stack pointer:
 	mov esp, dword ptr [edx]
 
-	; Restore callee stack
+	; Restore callee stack:
 	pop esi
 	pop edi
 	pop ebx
 	pop ebp
 
-	; Save the first argument as the return value
+	; Restore the thread information block:
+	pop fs:[8]
+	pop fs:[4]
+	pop fs:[0]
+
+	; Save the first argument as the return value:
 	mov eax, dword ptr ecx
 
-	; Jump to the address on the stack
+	; Jump to the address on the stack:
 	ret
 @coroutine_transfer@8 endp
 
Index: coroutine/win32/Context.h
===================================================================
--- coroutine/win32/Context.h	(revision 65866)
+++ coroutine/win32/Context.h	(revision 65867)
@@ -16,6 +16,7 @@ extern "C" { https://github.com/ruby/ruby/blob/trunk/coroutine/win32/Context.h#L16
 
 #define COROUTINE __declspec(noreturn) void __fastcall
 
+/* This doesn't include thread information block */
 const size_t COROUTINE_REGISTERS = 4;
 
 struct coroutine_context
@@ -40,9 +41,9 @@ static inline void coroutine_initialize( https://github.com/ruby/ruby/blob/trunk/coroutine/win32/Context.h#L41
 	}
 
 	/* Windows Thread Information Block */
-	*--context->stack_pointer = 0;
-	*--context->stack_pointer = stack_pointer;
-	*--context->stack_pointer = (void*)stack_size;
+	*--context->stack_pointer = 0; /* fs:[0] */
+	*--context->stack_pointer = stack_pointer + stack_size; /* fs:[4] */
+	*--context->stack_pointer = (void*)stack_pointer;  /* fs:[8] */
 
 	*--context->stack_pointer = (void*)start;
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]