Do not crash on software breakpoint in kdb.

svn path=/trunk/; revision=41264
This commit is contained in:
Dmitry Gorbachev 2009-06-02 22:14:46 +00:00
parent 81fa6557af
commit 877b413520

View file

@ -15,16 +15,24 @@
#define PAGE_TABLE_MASK 0x3ff #define PAGE_TABLE_MASK 0x3ff
#define BIG_PAGE_SIZE (1<<22) #define BIG_PAGE_SIZE (1<<22)
#define CR4_PAGE_SIZE_BIT 0x10 #define CR4_PAGE_SIZE_BIT 0x10
#define PDE_PRESENT_BIT 1 #define PDE_PRESENT_BIT 0x01
#define PDE_W_BIT 2 #define PDE_W_BIT 0x02
#define PDE_PWT_BIT 0x08
#define PDE_PCD_BIT 0x10
#define PDE_ACCESSED_BIT 0x20
#define PDE_DIRTY_BIT 0x40
#define PDE_PS_BIT 0x80 #define PDE_PS_BIT 0x80
#define MI_KDBG_TMP_PAGE_1 (HYPER_SPACE + 0x400000 - PAGE_SIZE)
#define MI_KDBG_TMP_PAGE_0 (MI_KDBG_TMP_PAGE_1 - PAGE_SIZE)
/* VARIABLES ***************************************************************/ /* VARIABLES ***************************************************************/
extern ULONG MmGlobalKernelPageDirectory[1024];
static BOOLEAN KdpPhysAccess = FALSE; static BOOLEAN KdpPhysAccess = FALSE;
#if 0
extern ULONG MmGlobalKernelPageDirectory[1024];
ULONG_PTR IdentityMapAddrHigh, IdentityMapAddrLow; ULONG_PTR IdentityMapAddrHigh, IdentityMapAddrLow;
extern PFN_TYPE NTAPI MmAllocEarlyPage();
ULONGLONG ULONGLONG
FASTCALL FASTCALL
@ -66,7 +74,6 @@ KdpPhysRead(ULONG_PTR Addr, LONG Len)
return Result; return Result;
} }
VOID VOID
NTAPI NTAPI
KdpPhysWrite(ULONG_PTR Addr, LONG Len, ULONGLONG Value) KdpPhysWrite(ULONG_PTR Addr, LONG Len, ULONGLONG Value)
@ -104,6 +111,91 @@ KdpPhysWrite(ULONG_PTR Addr, LONG Len, ULONGLONG Value)
__invlpg((PVOID)Addr); __invlpg((PVOID)Addr);
} }
#else
static
ULONG_PTR
KdpPhysMap(ULONG_PTR PhysAddr, LONG Len)
{
MMPTE TempPte;
PMMPTE PointerPte;
ULONG_PTR VirtAddr;
TempPte.u.Long = PDE_PRESENT_BIT | PDE_W_BIT | PDE_PWT_BIT |
PDE_PCD_BIT | PDE_ACCESSED_BIT | PDE_DIRTY_BIT;
if ((PhysAddr & (PAGE_SIZE - 1)) + Len > PAGE_SIZE)
{
TempPte.u.Hard.PageFrameNumber = (PhysAddr >> PAGE_SHIFT) + 1;
PointerPte = MiAddressToPte(MI_KDBG_TMP_PAGE_1);
*PointerPte = TempPte;
VirtAddr = (ULONG_PTR)PointerPte << 10;
__invlpg((PVOID)VirtAddr);
}
TempPte.u.Hard.PageFrameNumber = PhysAddr >> PAGE_SHIFT;
PointerPte = MiAddressToPte(MI_KDBG_TMP_PAGE_0);
*PointerPte = TempPte;
VirtAddr = (ULONG_PTR)PointerPte << 10;
__invlpg((PVOID)VirtAddr);
return VirtAddr + (PhysAddr & (PAGE_SIZE - 1));
}
static
ULONGLONG
KdpPhysRead(ULONG_PTR PhysAddr, LONG Len)
{
ULONG_PTR Addr;
ULONGLONG Result = 0;
Addr = KdpPhysMap(PhysAddr, Len);
switch (Len)
{
case 8:
Result = *((PULONGLONG)Addr);
break;
case 4:
Result = *((PULONG)Addr);
break;
case 2:
Result = *((PUSHORT)Addr);
break;
case 1:
Result = *((PUCHAR)Addr);
break;
}
return Result;
}
static
VOID
KdpPhysWrite(ULONG_PTR PhysAddr, LONG Len, ULONGLONG Value)
{
ULONG_PTR Addr;
Addr = KdpPhysMap(PhysAddr, Len);
switch (Len)
{
case 8:
*((PULONGLONG)Addr) = Value;
break;
case 4:
*((PULONG)Addr) = Value;
break;
case 2:
*((PUSHORT)Addr) = Value;
break;
case 1:
*((PUCHAR)Addr) = Value;
break;
}
}
#endif
BOOLEAN BOOLEAN
NTAPI NTAPI
KdpTranslateAddress(ULONG_PTR Addr, PULONG_PTR ResultAddr) KdpTranslateAddress(ULONG_PTR Addr, PULONG_PTR ResultAddr)
@ -199,6 +291,7 @@ KdpSafeWriteMemory(ULONG_PTR Addr, LONG Len, ULONGLONG Value)
return TRUE; return TRUE;
} }
#if 0
VOID VOID
NTAPI NTAPI
KdpEnableSafeMem() KdpEnableSafeMem()
@ -245,3 +338,13 @@ KdpEnableSafeMem()
KdpPhysAccess = TRUE; KdpPhysAccess = TRUE;
} }
#else
VOID
NTAPI
KdpEnableSafeMem(VOID)
{
KdpPhysAccess = TRUE;
}
#endif