[NTOS:KE]
[reactos.git] / reactos / ntoskrnl / include / internal / i386 / trap_x.h
index d83276f..06443c9 100644 (file)
@@ -1,36 +1,27 @@
 /*
  * PROJECT:         ReactOS Kernel
  * LICENSE:         BSD - See COPYING.ARM in the top level directory
- * FILE:            ntoskrnl/include/i386/trap_x.h
+ * FILE:            ntoskrnl/include/internal/i386/trap_x.h
  * PURPOSE:         Internal Inlined Functions for the Trap Handling Code
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
 #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 */
@@ -40,8 +31,8 @@ KiUserTrap(IN PKTRAP_FRAME TrapFrame)
 //
 // Debug Macros
 //
-VOID
 FORCEINLINE
+VOID
 KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame)
 {
     /* Dump the whole thing */
@@ -82,9 +73,9 @@ KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame)
     DbgPrint("V86Gs: %x\n", TrapFrame->V86Gs);
 }
 
-#if TRAP_DEBUG
-VOID
+#if DBG
 FORCEINLINE
+VOID
 KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame)
 {
     /* Set the debug information */
@@ -92,7 +83,7 @@ KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame)
     TrapFrame->DbgArgMark = 0xBADB0D00;
     TrapFrame->DbgEip = TrapFrame->Eip;
     TrapFrame->DbgEbp = TrapFrame->Ebp;
-    TrapFrame->PreviousPreviousMode = -1;
+    TrapFrame->PreviousPreviousMode = (ULONG)-1;
 }
 
 #define DR7_RESERVED_READ_AS_1 0x400
@@ -110,8 +101,8 @@ KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame)
 
 extern BOOLEAN StopChecking;
 
-VOID
 FORCEINLINE
+VOID
 KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame,
                       IN BOOLEAN SkipPreviousMode)
 {
@@ -162,8 +153,10 @@ KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame,
         __debugbreak();
     }
 
+    /* FIXME: KDBG messes around with these improperly */
+#if !defined(KDBG)
     /* Check DR values */
-    if (TrapFrame->SegCs & MODE_MASK)
+    if (KiUserTrap(TrapFrame))
     {
         /* Check for active debugging */
         if (KeGetCurrentThread()->Header.DebugActive)
@@ -184,14 +177,20 @@ KiExitTrapDebugChecks(IN PKTRAP_FRAME 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); // Disabled, see CORE-10165 for more details.
     }
+#endif
 
     StopChecking = FALSE;
 }
 
-VOID
+#else
+#define KiExitTrapDebugChecks(x, y)
+#define KiFillTrapFrameDebug(x)
+#endif
+
 FORCEINLINE
+VOID
 KiExitSystemCallDebugChecks(IN ULONG SystemCall,
                             IN PKTRAP_FRAME TrapFrame)
 {
@@ -229,11 +228,6 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall,
         }
     }
 }
-#else
-#define KiExitTrapDebugChecks(x, y)
-#define KiFillTrapFrameDebug(x)
-#define KiExitSystemCallDebugChecks(x, y)
-#endif
 
 //
 // Generic Exit Routine
@@ -244,9 +238,9 @@ 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);
+DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegmentsRet8(IN PKTRAP_FRAME TrapFrame);
 
 typedef
-ATTRIB_NORETURN
 VOID
 (FASTCALL *PFAST_SYSTEM_CALL_EXIT)(
     IN PKTRAP_FRAME TrapFrame
@@ -257,8 +251,8 @@ extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
 //
 // Save user mode debug registers and restore kernel values
 //
-VOID
 FORCEINLINE
+VOID
 KiHandleDebugRegistersOnTrapEntry(
     IN PKTRAP_FRAME TrapFrame)
 {
@@ -284,8 +278,8 @@ KiHandleDebugRegistersOnTrapEntry(
     __writedr(7, Prcb->ProcessorState.SpecialRegisters.KernelDr7);
 }
 
-VOID
 FORCEINLINE
+VOID
 KiHandleDebugRegistersOnTrapExit(
     PKTRAP_FRAME TrapFrame)
 {
@@ -304,9 +298,9 @@ KiHandleDebugRegistersOnTrapExit(
 //
 // Virtual 8086 Mode Optimized Trap Exit
 //
-VOID
 FORCEINLINE
 DECLSPEC_NORETURN
+VOID
 KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
 {
     PKTHREAD Thread;
@@ -351,8 +345,8 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
 //
 // Virtual 8086 Mode Optimized Trap Entry
 //
-VOID
 FORCEINLINE
+VOID
 KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame)
 {
     /* Save exception list */
@@ -370,8 +364,8 @@ KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame)
 //
 // Interrupt Trap Entry
 //
-VOID
 FORCEINLINE
+VOID
 KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
 {
     /* Save exception list and terminate it */
@@ -382,7 +376,7 @@ KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
     TrapFrame->Dr7 = 0;
 
     /* Check if the frame was from user mode or v86 mode */
-    if ((TrapFrame->SegCs & MODE_MASK) ||
+    if (KiUserTrap(TrapFrame) ||
         (TrapFrame->EFlags & EFLAGS_V86_MASK))
     {
         /* Check for active debugging */
@@ -400,8 +394,8 @@ KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
 //
 // Generic Trap Entry
 //
-VOID
 FORCEINLINE
+VOID
 KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
 {
     /* Save exception list */
@@ -411,7 +405,7 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
     TrapFrame->Dr7 = 0;
 
     /* Check if the frame was from user mode or v86 mode */
-    if ((TrapFrame->SegCs & MODE_MASK) ||
+    if (KiUserTrap(TrapFrame) ||
         (TrapFrame->EFlags & EFLAGS_V86_MASK))
     {
         /* Check for active debugging */