From 5024944fa7116fd9fbc95a971f9ea2896018043c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 18 Mar 2010 16:30:54 +0000 Subject: [PATCH] [NTOS] Fix compilation with MSVC. Dedicated to Stefan. svn path=/trunk/; revision=46264 --- reactos/ntoskrnl/include/internal/i386/ke.h | 55 +++++++++++++++++++-- reactos/ntoskrnl/include/internal/ke.h | 2 +- reactos/ntoskrnl/include/internal/trap_x.h | 14 +++--- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index ebe474890ea..701688ead1f 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -397,9 +397,9 @@ Ki386HandleOpcodeV86( IN PKTRAP_FRAME TrapFrame ); +DECLSPEC_NORETURN VOID FASTCALL -DECLSPEC_NORETURN KiEoiHelper( IN PKTRAP_FRAME TrapFrame ); @@ -416,9 +416,9 @@ KiExitV86Mode( IN PKTRAP_FRAME TrapFrame ); +DECLSPEC_NORETURN VOID NTAPI -DECLSPEC_NORETURN KiDispatchExceptionFromTrapFrame( IN NTSTATUS Code, IN ULONG_PTR Address, @@ -620,6 +620,7 @@ KiSystemCallTrampoline(IN PVOID Handler, * later to function like this as well. * */ +#ifdef __GNUC__ __asm__ __volatile__ ( "subl %1, %%esp\n" @@ -635,7 +636,23 @@ KiSystemCallTrampoline(IN PVOID Handler, "r"(Handler) : "%esp", "%esi", "%edi" ); - +#elif defined(_MSC_VER) + __asm + { + mov ecx, StackBytes + mov edx, Arguments + sub esp, ecx + mov edi, esp + mov esi, edx + shr ecx, 2 + rep movsd + call Handler + mov Result, eax + } +#else +#error Unknown Compiler +#endif + return Result; } @@ -702,6 +719,7 @@ KiConvertToGuiThread(VOID) * on its merry way. * */ +#ifdef __GNUC__ __asm__ __volatile__ ( "movl %%ebp, %1\n" @@ -714,7 +732,20 @@ KiConvertToGuiThread(VOID) : : "%esp", "%ecx", "%edx", "memory" ); - +#elif defined(_MSC_VER) + NTSTATUS NTAPI PsConvertToGuiThread(VOID); + __asm + { + mov StackFrame, ebp + sub StackFrame, esp + call PsConvertToGuiThread + add StackFrame, esp + mov ebp, StackFrame + mov Result, eax + } +#else +#error Unknown Compiler +#endif return Result; } @@ -726,7 +757,8 @@ FORCEINLINE KiSwitchToBootStack(IN ULONG_PTR InitialStack) { /* We have to switch to a new stack before continuing kernel initialization */ - __asm__ __volatile__ +#ifdef __GNUC__ + __asm__ ( "movl %0, %%esp\n" "subl %1, %%esp\n" @@ -738,6 +770,19 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) "i"(CR0_EM | CR0_TS | CR0_MP) : "%esp" ); +#elif defined(_MSC_VER) + VOID NTAPI KiSystemStartupBootStack(VOID); + __asm + { + mov ecx, InitialStack + mov esp, ecx + sub esp, (NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH) + push (CR0_EM | CR0_TS | CR0_MP) + jmp KiSystemStartupBootStack + } +#else +#error Unknown Compiler +#endif } // diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index b1752aff4da..c7aa3038e8e 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -1092,9 +1092,9 @@ KiIdleLoop( VOID ); +DECLSPEC_NORETURN VOID FASTCALL -DECLSPEC_NORETURN KiSystemFatalException( IN ULONG ExceptionCode, IN PKTRAP_FRAME TrapFrame diff --git a/reactos/ntoskrnl/include/internal/trap_x.h b/reactos/ntoskrnl/include/internal/trap_x.h index 93c5d1fc6c0..3da69917d70 100644 --- a/reactos/ntoskrnl/include/internal/trap_x.h +++ b/reactos/ntoskrnl/include/internal/trap_x.h @@ -192,17 +192,17 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, // // Generic Exit Routine // -VOID FASTCALL DECLSPEC_NORETURN KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame); -VOID FASTCALL DECLSPEC_NORETURN KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame); -VOID FASTCALL DECLSPEC_NORETURN KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame); -VOID FASTCALL DECLSPEC_NORETURN KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame); -VOID FASTCALL DECLSPEC_NORETURN KiTrapReturn(IN PKTRAP_FRAME TrapFrame); -VOID FASTCALL DECLSPEC_NORETURN KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame); typedef VOID (FASTCALL -*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame) DECLSPEC_NORETURN; +*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame); extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;