Index: ntoskrnl/include/internal/i386/trap_x.h =================================================================== --- ntoskrnl/include/internal/i386/trap_x.h (revision 69220) +++ ntoskrnl/include/internal/i386/trap_x.h (working copy) @@ -175,7 +175,7 @@ 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); } StopChecking = FALSE; Index: ntoskrnl/kdbg/kdb.c =================================================================== --- ntoskrnl/kdbg/kdb.c (revision 69220) +++ ntoskrnl/kdbg/kdb.c (working copy) @@ -136,7 +136,7 @@ PKTRAP_FRAME TrapFrame, PKDB_KTRAP_FRAME KdbTrapFrame) { - ULONG TrapCr0, TrapCr2, TrapCr3, TrapCr4; + PKPRCB Prcb; /* Copy the TrapFrame only up to Eflags and zero the rest*/ RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)); @@ -143,36 +143,35 @@ RtlZeroMemory((PVOID)((ULONG_PTR)&KdbTrapFrame->Tf + FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)), sizeof(KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)); -#ifndef _MSC_VER - asm volatile( - "movl %%cr0, %0" "\n\t" - "movl %%cr2, %1" "\n\t" - "movl %%cr3, %2" "\n\t" - "movl %%cr4, %3" "\n\t" - : "=r"(TrapCr0), "=r"(TrapCr2), - "=r"(TrapCr3), "=r"(TrapCr4)); -#else - __asm - { - mov eax, cr0; - mov TrapCr0, eax; - mov eax, cr2; - mov TrapCr2, eax; - mov eax, cr3; - mov TrapCr3, eax; -/* FIXME: What's the problem with cr4? */ - //mov eax, cr4; - //mov TrapCr4, eax; - } -#endif + /* Get CR0, CR2 and CR3 */ + KdbTrapFrame->Cr0 = __readcr0(); + KdbTrapFrame->Cr2 = __readcr2(); + KdbTrapFrame->Cr3 = __readcr3(); - KdbTrapFrame->Cr0 = TrapCr0; - KdbTrapFrame->Cr2 = TrapCr2; - KdbTrapFrame->Cr3 = TrapCr3; - KdbTrapFrame->Cr4 = TrapCr4; + /* Check if CR4 exists */ + if (KeFeatureBits & KF_CR4) + { + /* Get it */ + KdbTrapFrame->Cr4 = __readcr4(); + } + else + { + /* Just clear it */ + KdbTrapFrame->Cr4 = 0; + } + /* Save current debug registers for kernel */ + Prcb = KeGetCurrentPrcb(); + Prcb->ProcessorState.SpecialRegisters.KernelDr0 = __readdr(0); + Prcb->ProcessorState.SpecialRegisters.KernelDr1 = __readdr(1); + Prcb->ProcessorState.SpecialRegisters.KernelDr2 = __readdr(2); + Prcb->ProcessorState.SpecialRegisters.KernelDr3 = __readdr(3); + Prcb->ProcessorState.SpecialRegisters.KernelDr6 = __readdr(6); + Prcb->ProcessorState.SpecialRegisters.KernelDr7 = __readdr(7); + + /* Get SS and Stack */ KdbTrapFrame->Tf.HardwareEsp = KiEspFromTrapFrame(TrapFrame); KdbTrapFrame->Tf.HardwareSegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF); @@ -185,11 +184,23 @@ PKDB_KTRAP_FRAME KdbTrapFrame, PKTRAP_FRAME TrapFrame) { + PKPRCB Prcb; + /* Copy the TrapFrame only up to Eflags and zero the rest*/ RtlCopyMemory(TrapFrame, &KdbTrapFrame->Tf, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)); /* FIXME: write cr0, cr2, cr3 and cr4 (not needed atm) */ + /* We may have altered debug registers, update PRCB */ + Prcb = KeGetCurrentPrcb(); + Prcb->ProcessorState.SpecialRegisters.KernelDr0 = TrapFrame->Dr0; + Prcb->ProcessorState.SpecialRegisters.KernelDr1 = TrapFrame->Dr1; + Prcb->ProcessorState.SpecialRegisters.KernelDr2 = TrapFrame->Dr2; + Prcb->ProcessorState.SpecialRegisters.KernelDr3 = TrapFrame->Dr3; + Prcb->ProcessorState.SpecialRegisters.KernelDr6 = TrapFrame->Dr6; + Prcb->ProcessorState.SpecialRegisters.KernelDr7 = TrapFrame->Dr7; + + /* Save SS and Stack */ KiSsToTrapFrame(TrapFrame, KdbTrapFrame->Tf.HardwareSegSs); KiEspToTrapFrame(TrapFrame, KdbTrapFrame->Tf.HardwareEsp); @@ -1405,7 +1416,7 @@ BreakPoint->Data.SavedInstruction, NULL))) { KdbpPrint("Couldn't restore original instruction after INT3! Cannot continue execution.\n"); - KeBugCheck(0); // FIXME: Proper bugcode! + for (;;); } } @@ -1687,7 +1698,7 @@ continue_execution: /* Clear debug status */ - if (ExceptionCode == STATUS_BREAKPOINT) /* FIXME: Why clear DR6 on INT3? */ + if (ExceptionCode == STATUS_BREAKPOINT) { /* Set the RF flag so we don't trigger the same breakpoint again. */ if (Resume) @@ -1695,9 +1706,6 @@ TrapFrame->EFlags |= EFLAGS_RF; } - /* Clear dr6 status flags. */ - TrapFrame->Dr6 &= ~0x0000e00f; - if (!(KdbEnteredOnSingleStep && KdbSingleStepOver)) { /* Skip the current instruction */