[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / kdbg / kdb.c
index 65d6134..bc7e018 100644 (file)
@@ -125,7 +125,7 @@ VOID
 NTAPI
 KiEspToTrapFrame(
     IN PKTRAP_FRAME TrapFrame,
-    IN ULONG_PTR Esp);
+    IN ULONG Esp);
 
 /* ROS Internal. Please deprecate */
 NTHALAPI
@@ -140,18 +140,14 @@ KdbpTrapFrameToKdbTrapFrame(
     PKTRAP_FRAME TrapFrame,
     PKDB_KTRAP_FRAME KdbTrapFrame)
 {
-    ULONG_PTR TrapCr0, TrapCr2, TrapCr3, TrapCr4;
+    ULONG TrapCr0, TrapCr2, TrapCr3, TrapCr4;
 
-#if defined(_M_IX86)
     /* Copy the TrapFrame only up to Eflags and zero the rest*/
     RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
     RtlZeroMemory((PVOID)((ULONG_PTR)&KdbTrapFrame->Tf + FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)),
                   sizeof(KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
-#elif defined(_M_AMD64)
-    RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, sizeof(KTRAP_FRAME));
-#endif
 
-#if defined(__GNUC__) && defined(_M_IX86)
+#ifndef _MSC_VER
    asm volatile(
       "movl %%cr0, %0"    "\n\t"
       "movl %%cr2, %1"    "\n\t"
@@ -159,7 +155,7 @@ KdbpTrapFrameToKdbTrapFrame(
       "movl %%cr4, %3"    "\n\t"
       : "=r"(TrapCr0), "=r"(TrapCr2),
         "=r"(TrapCr3), "=r"(TrapCr4));
-#elif defined(_MSC_VER) && defined(_M_IX86)
+#else
    __asm
    {
        mov eax, cr0;
@@ -174,16 +170,6 @@ KdbpTrapFrameToKdbTrapFrame(
        //mov eax, cr4;
        //mov TrapCr4, eax;
    }
-#elif defined(__GNUC__) && defined(_M_AMD64)
-   asm volatile(
-      "movq %%cr0, %0"    "\n\t"
-      "movq %%cr2, %1"    "\n\t"
-      "movq %%cr3, %2"    "\n\t"
-      "movq %%cr4, %3"    "\n\t"
-      : "=r"(TrapCr0), "=r"(TrapCr2),
-        "=r"(TrapCr3), "=r"(TrapCr4));
-#else
-#error UNSUPPORTED ARCHITECTURE
 #endif
 
     KdbTrapFrame->Cr0 = TrapCr0;
@@ -191,13 +177,9 @@ KdbpTrapFrameToKdbTrapFrame(
     KdbTrapFrame->Cr3 = TrapCr3;
     KdbTrapFrame->Cr4 = TrapCr4;
 
-#ifdef _M_IX86
     KdbTrapFrame->Tf.HardwareEsp = KiEspFromTrapFrame(TrapFrame);
     KdbTrapFrame->Tf.HardwareSegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
-#elif defined(_M_AMD64)
-    //KdbTrapFrame->Tf.Rsp = KiEspFromTrapFrame(TrapFrame);
-    //KdbTrapFrame->Tf.SegGs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
-#endif
+
 
     /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
 }
@@ -208,7 +190,6 @@ KdbpKdbTrapFrameToTrapFrame(
     PKTRAP_FRAME TrapFrame)
 {
     /* Copy the TrapFrame only up to Eflags and zero the rest*/
-#ifdef _M_IX86
     RtlCopyMemory(TrapFrame, &KdbTrapFrame->Tf, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
 
     /* FIXME: write cr0, cr2, cr3 and cr4 (not needed atm) */
@@ -217,13 +198,6 @@ KdbpKdbTrapFrameToTrapFrame(
     KiEspToTrapFrame(TrapFrame, KdbTrapFrame->Tf.HardwareEsp);
 
     /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
-
-#elif defined(_M_AMD64)
-    RtlCopyMemory(TrapFrame, &KdbTrapFrame->Tf, sizeof(KTRAP_FRAME));
-    //KiSsToTrapFrame(TrapFrame, KdbTrapFrame->Tf.SegSs);
-    //KiEspToTrapFrame(TrapFrame, KdbTrapFrame->Tf.Rsp);
-
-#endif
 }
 
 static VOID
@@ -247,18 +221,6 @@ KdbpKdbTrapFrameFromKernelStack(
     KdbTrapFrame->Tf.SegDs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegEs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegGs = KGDT_R0_DATA;
-#elif defined(_M_AMD64)
-    KdbTrapFrame->Tf.Rbp = StackPtr[3];
-    KdbTrapFrame->Tf.Rdi = StackPtr[4];
-    KdbTrapFrame->Tf.Rsi = StackPtr[5];
-    KdbTrapFrame->Tf.Rbx = StackPtr[6];
-    KdbTrapFrame->Tf.Rip = StackPtr[7];
-    KdbTrapFrame->Tf.Rsp = (ULONG_PTR) (StackPtr + 16);
-    KdbTrapFrame->Tf.SegSs = KGDT_64_R0_SS;
-    KdbTrapFrame->Tf.SegCs = KGDT_64_R0_CODE;
-    KdbTrapFrame->Tf.SegDs = KGDT_64_DATA;
-    KdbTrapFrame->Tf.SegEs = KGDT_64_DATA;
-    KdbTrapFrame->Tf.SegGs = KGDT_64_DATA;
 #endif
 
     /* FIXME: what about the other registers??? */
@@ -461,7 +423,7 @@ KdbpStepIntoInstruction(
     }
 
     /* Get the interrupt descriptor */
-    if (!NT_SUCCESS(KdbpSafeReadMemory(IntDesc, (PVOID)((ULONG_PTR)Idtr.Base + (IntVect * 8)), sizeof (IntDesc))))
+    if (!NT_SUCCESS(KdbpSafeReadMemory(IntDesc, (PVOID)(ULONG_PTR)(Idtr.Base + (IntVect * 8)), sizeof (IntDesc))))
     {
         /*KdbpPrint("Couldn't access memory at 0x%p\n", (ULONG_PTR)Idtr.Base + (IntVect * 8));*/
         return FALSE;
@@ -1282,7 +1244,7 @@ KdbpInternalEnter()
 {
     PETHREAD Thread;
     PVOID SavedInitialStack, SavedStackBase, SavedKernelStack;
-    ULONG_PTR SavedStackLimit;
+    ULONG SavedStackLimit;
 
     KbdDisableMouse();
     if (KdpDebugMode.Screen)
@@ -1300,7 +1262,7 @@ KdbpInternalEnter()
     Thread->Tcb.StackLimit = (ULONG_PTR)KdbStack;
     Thread->Tcb.KernelStack = (char*)KdbStack + KDB_STACK_SIZE;
 
-    //KdbpPrint("Switching to KDB stack 0x%p-0x%p\n", Thread->Tcb.StackLimit, Thread->Tcb.StackBase);
+    /*KdbpPrint("Switching to KDB stack 0x%08x-0x%08x (Current Stack is 0x%08x)\n", Thread->Tcb.StackLimit, Thread->Tcb.StackBase, Esp);*/
 
     KdbpStackSwitchAndCall(KdbStack + KDB_STACK_SIZE - sizeof(ULONG), KdbpCallMainLoop);
 
@@ -1389,7 +1351,7 @@ KdbEnterDebuggerException(
     ULONGLONG ull;
     BOOLEAN Resume = FALSE;
     BOOLEAN EnterConditionMet = TRUE;
-    ULONG_PTR OldEflags;
+    ULONG OldEflags;
     KIRQL OldIrql;
     NTSTATUS ExceptionCode;
 
@@ -1451,6 +1413,8 @@ KdbEnterDebuggerException(
             /* Delete the temporary breakpoint which was used to step over or into the instruction. */
             KdbpDeleteBreakPoint(-1, BreakPoint);
 
+            TrapFrame->Eip--;
+
             if (--KdbNumSingleSteps > 0)
             {
                 if ((KdbSingleStepOver && !KdbpStepOverInstruction(TrapFrame->Eip)) ||
@@ -1502,12 +1466,12 @@ KdbEnterDebuggerException(
 
         if (BreakPoint->Type == KdbBreakPointSoftware)
         {
-            KdbpPrint("Entered debugger on breakpoint #%d: EXEC 0x%04x:0x%p\n",
+            KdbpPrint("Entered debugger on breakpoint #%d: EXEC 0x%04x:0x%08x\n",
                       KdbLastBreakPointNr, TrapFrame->SegCs & 0xffff, TrapFrame->Eip);
         }
         else if (BreakPoint->Type == KdbBreakPointHardware)
         {
-            KdbpPrint("Entered debugger on breakpoint #%d: %s 0x%p\n",
+            KdbpPrint("Entered debugger on breakpoint #%d: %s 0x%08x\n",
                       KdbLastBreakPointNr,
                      (BreakPoint->Data.Hw.AccessType == KdbAccessRead) ? "READ" :
                      ((BreakPoint->Data.Hw.AccessType == KdbAccessWrite) ? "WRITE" :
@@ -1590,7 +1554,7 @@ KdbEnterDebuggerException(
             return kdHandleException;
         }
 
-        KdbpPrint("Entered debugger on embedded INT3 at 0x%04x:0x%p.\n",
+        KdbpPrint("Entered debugger on embedded INT3 at 0x%04x:0x%08x.\n",
                   TrapFrame->SegCs & 0xffff, TrapFrame->Eip - 1);
     }
     else
@@ -1615,12 +1579,8 @@ KdbEnterDebuggerException(
             ULONG Err;
 
             TrapCr2 = __readcr2();
-#ifdef _M_IX86
-            Err = TrapFrame->ErrCode;
-#elif defined(_M_AMD64)
-            Err = TrapFrame->ErrorCode;
-#endif
 
+            Err = TrapFrame->ErrCode;
             KdbpPrint("Memory at 0x%p could not be %s: ", TrapCr2, (Err & (1 << 1)) ? "written" : "read");
 
             if ((Err & (1 << 0)) == 0)
@@ -1723,8 +1683,11 @@ continue_execution:
         /* Clear dr6 status flags. */
         TrapFrame->Dr6 &= ~0x0000e00f;
 
-        /* Skip the current instruction */
-        Context->Eip++;
+        if (!(KdbEnteredOnSingleStep && KdbSingleStepOver))
+        {
+            /* Skip the current instruction */
+            Context->Eip++;
+        }
     }
 
     return ContinueType;
@@ -1739,7 +1702,7 @@ KdbpGetCommandLineSettings(
 
     while (p1 && (p2 = strchr(p1, ' ')))
     {
-        p2++;
+        p2 += 2;
 
         if (!_strnicmp(p2, "KDSERIAL", 8))
         {
@@ -1752,6 +1715,11 @@ KdbpGetCommandLineSettings(
             p2 += 8;
             KdbDebugState |= KD_DEBUG_KDNOECHO;
         }
+        else if (!_strnicmp(p2, "FIRSTCHANCE", 11))
+        {
+            p2 += 11;
+            KdbpSetEnterCondition(-1, TRUE, KdbEnterAlways);
+        }
 
         p1 = p2;
     }
@@ -1811,4 +1779,4 @@ KdbpSafeWriteMemory(
             Result = FALSE;
 
     return Result ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION;
-}
\ No newline at end of file
+}