From 98ca38a88cbfcce0919a27511da9715c17c49a02 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Mon, 31 May 2010 12:52:16 +0000 Subject: [PATCH] [NTOS] Re-enable the APC debug check in the system call exit code that somehow got removed in 46247. [NTOS] Use an inline for emitting the iret instruction in C code for portability. [NTOS] Simplify the MSC assembly in KiSwitchToBootStack. svn path=/trunk/; revision=47487 --- reactos/ntoskrnl/include/internal/i386/ke.h | 27 +++++++++++++++++++-- reactos/ntoskrnl/include/internal/trap_x.h | 15 ++++++------ reactos/ntoskrnl/ke/i386/traphdlr.c | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 701688ead1f..dda0cf88eb8 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -774,8 +774,7 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) VOID NTAPI KiSystemStartupBootStack(VOID); __asm { - mov ecx, InitialStack - mov esp, ecx + mov esp, InitialStack sub esp, (NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH) push (CR0_EM | CR0_TS | CR0_MP) jmp KiSystemStartupBootStack @@ -785,6 +784,30 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) #endif } +// +// Emits the iret instruction for C code +// +DECLSPEC_NORETURN +VOID +FORCEINLINE +KiIret(VOID) +{ +#if defined(__GNUC__) + __asm__ __volatile__ + ( + "iret\n" + ); +#elif defined(_MSC_VER) + __asm + { + iret + } +#else +#error Unsupported compiler +#endif + UNREACHABLE; +} + // // Normally this is done by the HAL, but on x86 as an optimization, the kernel // initiates the end by calling back into the HAL and exiting the trap here. diff --git a/reactos/ntoskrnl/include/internal/trap_x.h b/reactos/ntoskrnl/include/internal/trap_x.h index 3da69917d70..0d61dd6f78b 100644 --- a/reactos/ntoskrnl/include/internal/trap_x.h +++ b/reactos/ntoskrnl/include/internal/trap_x.h @@ -8,7 +8,7 @@ #pragma once -//#define TRAP_DEBUG 1 +#define TRAP_DEBUG 0 // // Unreachable code hint for GCC 4.5.x, older GCC versions, and MSVC @@ -81,7 +81,7 @@ KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame) DbgPrint("V86Gs: %x\n", TrapFrame->V86Gs); } -#ifdef TRAP_DEBUG +#if TRAP_DEBUG VOID FORCEINLINE KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame) @@ -168,7 +168,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, 0, 0); } -#if 0 + /* Make sure we're not attached and that APCs are not disabled */ if ((KeGetCurrentThread()->ApcStateIndex != CurrentApcEnvironment) || (KeGetCurrentThread()->CombinedApcDisable != 0)) @@ -180,7 +180,6 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, KeGetCurrentThread()->CombinedApcDisable, 0); } -#endif } } #else @@ -200,9 +199,11 @@ DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame); DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame); typedef +DECLSPEC_NORETURN VOID -(FASTCALL -*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame); +(FASTCALL *PFAST_SYSTEM_CALL_EXIT)( + IN PKTRAP_FRAME TrapFrame +); extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler; @@ -222,7 +223,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) while (TRUE) { /* Return if this isn't V86 mode anymore */ - if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame);; + if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame); /* Turn off the alerted state for kernel mode */ Thread->Alerted[KernelMode] = FALSE; diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index 8c535103123..7e960432bd2 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -547,7 +547,7 @@ KiTrap02(VOID) // // Handled, return from interrupt // - __asm__ __volatile__ ("iret\n"); + KiIret(); } //