From 1476736018853ef96ad17eee6752068002b436f9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Jul 2011 17:16:51 +0000 Subject: [PATCH] {KERNEL32] - move BaseFiberStartup to fiber.S - add FPO debug info for MSVC builds - remove excessive END directives (fixes msvc build) - add a stub for amd64 svn path=/trunk/; revision=52810 --- .../dll/win32/kernel32/client/amd64/fiber.S | 18 +++++-- .../dll/win32/kernel32/client/i386/fiber.S | 48 ++++++++++++------- .../dll/win32/kernel32/client/i386/thread.S | 11 +---- 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/amd64/fiber.S b/reactos/dll/win32/kernel32/client/amd64/fiber.S index 09ea635d23c..14fdfa5f713 100644 --- a/reactos/dll/win32/kernel32/client/amd64/fiber.S +++ b/reactos/dll/win32/kernel32/client/amd64/fiber.S @@ -1,19 +1,27 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: lib/kernel32/thread/i386/fiber.S - * PURPOSE: Fiber context switch code for the x86 architecture - * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) - * KJK::Hyperion + * FILE: dll/win32//kernel32/client/amd64/fiber.S + * PURPOSE: Fiber context switch code for the amd64 architecture + * PROGRAMMER: */ #include +PUBLIC BaseFiberStartup +.PROC BaseFiberStartup + UNIMPLEMENTED BaseFiberStartup + /* FIXME: TODO */ + ret + +.ENDP BaseFiberStartup + PUBLIC SwitchToFiber SwitchToFiber: + UNIMPLEMENTED BaseFiberStartup /* FIXME: TODO */ - ret 4 + ret END diff --git a/reactos/dll/win32/kernel32/client/i386/fiber.S b/reactos/dll/win32/kernel32/client/i386/fiber.S index 1bd972726a8..d8bc8f28a3b 100644 --- a/reactos/dll/win32/kernel32/client/i386/fiber.S +++ b/reactos/dll/win32/kernel32/client/i386/fiber.S @@ -10,16 +10,32 @@ #include #include +EXTERN _BaseThreadStartup@8:PROC + .code +PUBLIC _BaseFiberStartup@0 +.PROC BaseFiberStartup@0 + /* Frame pointer is zeroed */ + FPO 0, 0, 0, 0, 0, FRAME_FPO + + /* Get the fiber data */ + mov eax, fs:[TEB_FIBER_DATA] + + push dword ptr [eax+FIBER_CONTEXT_EBX] /* Parameter */ + push dword ptr [eax+FIBER_CONTEXT_EAX] /* Start Address */ + call _BaseThreadStartup@8 +.ENDP BaseFiberStartup@0 + + PUBLIC _SwitchToFiber@4 _SwitchToFiber@4: /* Get the TEB */ mov edx, fs:[TEB_SELF] - + /* Get the Fiber */ mov eax, [edx+TEB_FIBER_DATA] - + /* Save the non-volatile registers */ mov [eax+FIBER_CONTEXT_EBX], ebx mov [eax+FIBER_CONTEXT_ESI], esi @@ -29,27 +45,27 @@ _SwitchToFiber@4: /* 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] fnstcw [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD] - + /* Check if the CPU supports SIMD MXCSR State Save */ cmp byte ptr ds:[PF_XMMI_INSTRUCTIONS_AVAILABLE], 1 jnz NoFpuStateSave stmxcsr [eax+FIBER_CONTEXT_DR6] - + NoFpuStateSave: /* Save stack since we're not touching it anymore */ mov [eax+FIBER_CONTEXT_ESP], esp - + /* Transfer some data from the TEB */ mov ecx, [edx+TEB_FLS_DATA] mov [eax+FIBER_FLS_DATA], ecx mov ecx, [edx+TEB_ACTIVATION_CONTEXT_STACK_POINTER] mov [eax+FIBER_ACTIVATION_CONTEXT_STACK], ecx - + /* Transfer some data related to the Stack */ mov ecx, [edx+TEB_EXCEPTION_LIST] mov [eax+FIBER_EXCEPTION_LIST], ecx @@ -57,11 +73,11 @@ NoFpuStateSave: mov [eax+FIBER_STACK_LIMIT], ecx mov ecx, [edx+TEB_GUARANTEED_STACK_BYTES] mov [eax+FIBER_GUARANTEED_STACK_BYTES], ecx - + /* Switch to the new fiber */ mov ecx, [esp+4] mov [edx+TEB_FIBER_DATA], ecx - + /* Switch Fiber Data */ mov esi, [ecx+FIBER_EXCEPTION_LIST] mov [edx+TEB_EXCEPTION_LIST], esi @@ -75,34 +91,34 @@ NoFpuStateSave: mov [edx+TEB_GUARANTEED_STACK_BYTES], esi mov esi, [ecx+FIBER_ACTIVATION_CONTEXT_STACK] mov [edx+TEB_ACTIVATION_CONTEXT_STACK_POINTER], esi - + /* Restore FPU State */ cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL OR CONTEXT_FLOATING_POINT jnz NoFpuStateRestore - + /* Check if the Status Word Changed */ mov esi, [eax+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD] cmp si, word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD] jnz StatusWordChanged - + /* Check if the Control Word Changed */ mov esi, [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD] cmp si, word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD] jz ControlWordEqual - + StatusWordChanged: /* Load the new one */ mov word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD], HEX(0FFFF) fldenv [ecx+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD] - + ControlWordEqual: /* Load the new one */ cmp byte ptr ds:[PF_XMMI_INSTRUCTIONS_AVAILABLE], 1 jnz NoFpuStateRestore ldmxcsr [ecx+FIBER_CONTEXT_DR6] - + NoFpuStateRestore: /* Restore non-volatile registers */ @@ -111,7 +127,7 @@ NoFpuStateRestore: mov ebx, [ecx+FIBER_CONTEXT_EBX] mov ebp, [ecx+FIBER_CONTEXT_EBP] mov esp, [ecx+FIBER_CONTEXT_ESP] - + /* Restore FLS Data */ mov eax, [ecx+FIBER_FLS_DATA] mov [edx+TEB_FLS_DATA], eax diff --git a/reactos/dll/win32/kernel32/client/i386/thread.S b/reactos/dll/win32/kernel32/client/i386/thread.S index adc2f3442ae..f6964572246 100644 --- a/reactos/dll/win32/kernel32/client/i386/thread.S +++ b/reactos/dll/win32/kernel32/client/i386/thread.S @@ -24,7 +24,7 @@ _BaseThreadStartupThunk@0: push eax /* lpStartAddress */ push 0 /* Return EIP */ jmp _BaseThreadStartup@8 -END + PUBLIC _BaseProcessStartThunk@0 _BaseProcessStartThunk@0: @@ -35,16 +35,7 @@ _BaseProcessStartThunk@0: push 0 /* Return EIP */ jmp _BaseProcessStartup@4 -END -PUBLIC _BaseFiberStartup@0 -_BaseFiberStartup@0: - /* Get the fiber data */ - mov eax, fs:[TEB_FIBER_DATA] - - push dword ptr [eax+FIBER_CONTEXT_EBX] /* Parameter */ - push dword ptr [eax+FIBER_CONTEXT_EAX] /* Start Address */ - call _BaseThreadStartup@8 END /* EOF */