#pragma once
-#define TRAP_DEBUG 0
-
-//
-// Unreachable code hint for GCC 4.5.x, older GCC versions, and MSVC
-//
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 405
-#define UNREACHABLE __builtin_unreachable()
-#else
-#define UNREACHABLE __builtin_trap()
-#endif
-#elif _MSC_VER
-#define UNREACHABLE __assume(0)
-#define __builtin_expect(a,b) (a)
+#if defined(_MSC_VER)
+#define UNREACHABLE __assume(0)
+#define __builtin_expect(a,b) (a)
+#elif defined(__GNUC__)
+#define UNREACHABLE __builtin_unreachable()
#else
-#define UNREACHABLE
+#error
#endif
//
// Helper Code
//
-BOOLEAN
FORCEINLINE
+BOOLEAN
KiUserTrap(IN PKTRAP_FRAME TrapFrame)
{
/* Anything else but Ring 0 is Ring 3 */
//
// Debug Macros
//
-VOID
FORCEINLINE
+VOID
KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame)
{
/* Dump the whole thing */
DbgPrint("V86Gs: %x\n", TrapFrame->V86Gs);
}
-#if TRAP_DEBUG
-VOID
+#if DBG
FORCEINLINE
+VOID
KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame)
{
/* Set the debug information */
extern BOOLEAN StopChecking;
-VOID
FORCEINLINE
+VOID
KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame,
IN BOOLEAN SkipPreviousMode)
{
__debugbreak();
}
+ /* FIXME: KDBG messes around with these improperly */
+#if !defined(KDBG)
/* Check DR values */
if (KiUserTrap(TrapFrame))
{
CheckDr(1, Prcb->ProcessorState.SpecialRegisters.KernelDr1);
CheckDr(2, Prcb->ProcessorState.SpecialRegisters.KernelDr2);
CheckDr(3, Prcb->ProcessorState.SpecialRegisters.KernelDr3);
- //CheckDr(7, Prcb->ProcessorState.SpecialRegisters.KernelDr7);
+ CheckDr(7, Prcb->ProcessorState.SpecialRegisters.KernelDr7);
}
+#endif
StopChecking = FALSE;
}
-VOID
+#else
+#define KiExitTrapDebugChecks(x, y)
+#define KiFillTrapFrameDebug(x)
+#endif
+
FORCEINLINE
+VOID
KiExitSystemCallDebugChecks(IN ULONG SystemCall,
IN PKTRAP_FRAME TrapFrame)
{
}
}
}
-#else
-#define KiExitTrapDebugChecks(x, y)
-#define KiFillTrapFrameDebug(x)
-#define KiExitSystemCallDebugChecks(x, y)
-#endif
//
// Generic Exit Routine
DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegmentsRet8(IN PKTRAP_FRAME TrapFrame);
typedef
-ATTRIB_NORETURN
VOID
(FASTCALL *PFAST_SYSTEM_CALL_EXIT)(
IN PKTRAP_FRAME TrapFrame
//
// Save user mode debug registers and restore kernel values
//
-VOID
FORCEINLINE
+VOID
KiHandleDebugRegistersOnTrapEntry(
IN PKTRAP_FRAME TrapFrame)
{
__writedr(7, Prcb->ProcessorState.SpecialRegisters.KernelDr7);
}
-VOID
FORCEINLINE
+VOID
KiHandleDebugRegistersOnTrapExit(
PKTRAP_FRAME TrapFrame)
{
//
// Virtual 8086 Mode Optimized Trap Exit
//
-VOID
FORCEINLINE
DECLSPEC_NORETURN
+VOID
KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
{
PKTHREAD Thread;
//
// Virtual 8086 Mode Optimized Trap Entry
//
-VOID
FORCEINLINE
+VOID
KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame)
{
/* Save exception list */
//
// Interrupt Trap Entry
//
-VOID
FORCEINLINE
+VOID
KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
{
/* Save exception list and terminate it */
//
// Generic Trap Entry
//
-VOID
FORCEINLINE
+VOID
KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
{
/* Save exception list */