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 [email protected]:
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 */





_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to