NTAPI
KiEspToTrapFrame(
IN PKTRAP_FRAME TrapFrame,
- IN ULONG_PTR Esp);
+ IN ULONG Esp);
/* ROS Internal. Please deprecate */
NTHALAPI
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"
"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;
//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;
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 */
}
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) */
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
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??? */
}
/* 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;
{
PETHREAD Thread;
PVOID SavedInitialStack, SavedStackBase, SavedKernelStack;
- ULONG_PTR SavedStackLimit;
+ ULONG SavedStackLimit;
KbdDisableMouse();
if (KdpDebugMode.Screen)
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);
ULONGLONG ull;
BOOLEAN Resume = FALSE;
BOOLEAN EnterConditionMet = TRUE;
- ULONG_PTR OldEflags;
+ ULONG OldEflags;
KIRQL OldIrql;
NTSTATUS ExceptionCode;
/* 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)) ||
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" :
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
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)
/* Clear dr6 status flags. */
TrapFrame->Dr6 &= ~0x0000e00f;
- /* Skip the current instruction */
- Context->Eip++;
+ if (!KdbEnteredOnSingleStep && KdbSingleStepOver)
+ {
+ /* Skip the current instruction */
+ Context->Eip++;
+ }
}
return ContinueType;
while (p1 && (p2 = strchr(p1, ' ')))
{
- p2++;
+ p2 += 2;
if (!_strnicmp(p2, "KDSERIAL", 8))
{
p2 += 8;
KdbDebugState |= KD_DEBUG_KDNOECHO;
}
+ else if (!_strnicmp(p2, "FIRSTCHANCE", 11))
+ {
+ p2 += 11;
+ KdbpSetEnterCondition(-1, TRUE, KdbEnterAlways);
+ }
p1 = p2;
}
Result = FALSE;
return Result ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION;
-}
\ No newline at end of file
+}