[ros-dev] [ros-diffs] [ion] 52807: [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 ...
Timo Kreuzer
timo.kreuzer at web.de
Sat Jul 23 15:18:53 UTC 2011
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 at 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/i386/fiber.S?rev=52807&r1=52806&r2=52807&view=diff
> ==============================================================================
> --- 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 */
>
>
>
More information about the Ros-dev
mailing list