This won't work, since new Fibers, created with CreateFiber(Ex) don't push a "return address" on the stack, but set the Eip member to BaseFiberStartup.
Am 23.07.2011 14:08, schrieb ion@svn.reactos.org:
Author: ion Date: Sat Jul 23 12:08:36 2011 New Revision: 52807
URL: http://svn.reactos.org/svn/reactos?rev=52807&view=rev Log: [KERNEL32]: Optimize SwitchToFiber to simply use "ret" to jump between fibers, instead of saving EIP and doing a JMP. Bug #50: SwitchToFiber needs to check if FXSR is *NOT* present in order to skip using ldmxcsr/stmxcsr. Previously, it would check if it's unsupported, and jump past the instruction if it was (resulting in invalid opcode instructions on older systems) 50 bugs. Penance has been paid.
Modified: trunk/reactos/dll/win32/kernel32/client/i386/fiber.S
Modified: trunk/reactos/dll/win32/kernel32/client/i386/fiber.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/i... ============================================================================== --- trunk/reactos/dll/win32/kernel32/client/i386/fiber.S [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/client/i386/fiber.S [iso-8859-1] Sat Jul 23 12:08:36 2011 @@ -26,20 +26,16 @@ mov [eax+FIBER_CONTEXT_EDI], edi mov [eax+FIBER_CONTEXT_EBP], ebp
/* Save the return address */
mov ebx, [esp]
mov [eax+FIBER_CONTEXT_EIP], ebx
/* Check if we're to save FPU State */ cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL OR CONTEXT_FLOATING_POINT jnz NoFpuStateSave /* Save the FPU State (Status and Control)*/ fstsw [eax+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD]fstcw [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
fnstcw [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
/* Check if the CPU supports SIMD MXCSR State Save */
- cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 0
- cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 1 jnz NoFpuStateSave stmxcsr [eax+FIBER_CONTEXT_DR6]
@@ -103,7 +99,7 @@ ControlWordEqual:
/* Load the new one */
- cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 0
- cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 1 jnz NoFpuStateRestore ldmxcsr [ecx+FIBER_CONTEXT_DR6]
@@ -121,7 +117,8 @@ mov [edx+TEB_FLS_DATA], eax
/* Jump to new fiber */
- jmp dword ptr [ecx+FIBER_CONTEXT_EIP]
- mov esp, [ecx+FIBER_CONTEXT_ESP]
- ret 4
+END
-END /* EOF */