forgot to remove '0x' from FMT_ADDRX fro mingw
fix dump_table function to use CPU paging translation method instead of old debugger method which not supported PAE and other paging features
This commit is contained in:
parent
cb58d08c11
commit
a0345031cf
bochs
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: dbg_main.cc,v 1.43 2006-01-27 19:50:00 sshwarts Exp $
|
// $Id: dbg_main.cc,v 1.44 2006-01-28 15:10:33 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -3100,120 +3100,48 @@ int bx_dbg_symbolic_output(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BW added to dump page table
|
|
||||||
static void dbg_lin2phys(BX_CPU_C *cpu, Bit32u laddress, Bit32u *phy, bx_bool *valid, Bit32u *tlb_phy, bx_bool *tlb_valid)
|
|
||||||
{
|
|
||||||
Bit32u lpf, ppf, poffset, TLB_index, paddress;
|
|
||||||
Bit32u pde, pde_addr;
|
|
||||||
Bit32u pte, pte_addr;
|
|
||||||
|
|
||||||
*tlb_valid = 0;
|
|
||||||
|
|
||||||
if (cpu->cr0.pg == 0) {
|
|
||||||
*phy = laddress;
|
|
||||||
*valid = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
lpf = laddress & 0xfffff000; // linear page frame
|
|
||||||
poffset = laddress & 0x00000fff; // physical offset
|
|
||||||
TLB_index = BX_TLB_INDEX_OF(lpf);
|
|
||||||
|
|
||||||
// see if page is in the TLB first
|
|
||||||
#if BX_USE_QUICK_TLB_INVALIDATE
|
|
||||||
if (cpu->TLB.entry[TLB_index].lpf == (lpf | cpu->TLB.tlb_invalidate)) {
|
|
||||||
#else
|
|
||||||
if (cpu->TLB.entry[TLB_index].lpf == (lpf)) {
|
|
||||||
#endif
|
|
||||||
*tlb_phy = cpu->TLB.entry[TLB_index].ppf | poffset;
|
|
||||||
*tlb_valid = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get page dir entry
|
|
||||||
pde_addr = (cpu->cr3 & 0xfffff000) |
|
|
||||||
((laddress & 0xffc00000) >> 20);
|
|
||||||
BX_MEM(0)->readPhysicalPage(cpu, pde_addr, 4, &pde);
|
|
||||||
if ( !(pde & 0x01) ) {
|
|
||||||
// Page Directory Entry NOT present
|
|
||||||
goto page_fault;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get page table entry
|
|
||||||
pte_addr = (pde & 0xfffff000) | ((laddress & 0x003ff000) >> 10);
|
|
||||||
BX_MEM(0)->readPhysicalPage(cpu, pte_addr, 4, &pte);
|
|
||||||
if ( !(pte & 0x01) ) {
|
|
||||||
// Page Table Entry NOT present
|
|
||||||
goto page_fault;
|
|
||||||
}
|
|
||||||
|
|
||||||
ppf = pte & 0xfffff000;
|
|
||||||
paddress = ppf | poffset;
|
|
||||||
|
|
||||||
*phy = paddress;
|
|
||||||
*valid = 1;
|
|
||||||
return;
|
|
||||||
|
|
||||||
page_fault:
|
|
||||||
*phy = 0;
|
|
||||||
*valid = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dbg_dump_table(bx_bool all)
|
static void dbg_dump_table(bx_bool all)
|
||||||
{
|
{
|
||||||
Bit32u lina;
|
bx_address lin;
|
||||||
Bit32u phy, tlb_phy;
|
Bit32u phy;
|
||||||
bx_bool valid, tlb_valid;
|
bx_bool valid;
|
||||||
|
|
||||||
Bit32u start_lina, start_phy; // start of a valid translation interval
|
Bit32u start_lin, start_phy; // start of a valid translation interval
|
||||||
|
|
||||||
if (BX_CPU(dbg_cpu)->cr0.pg == 0) {
|
if (BX_CPU(dbg_cpu)->cr0.pg == 0) {
|
||||||
printf("paging off\n");
|
printf("paging off\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("cr3: %08x \n", BX_CPU(dbg_cpu)->cr3);
|
printf("cr3: " FMT_ADDRX "\n", BX_CPU(dbg_cpu)->cr3);
|
||||||
|
|
||||||
lina = 0;
|
lin = 0;
|
||||||
start_lina = 1;
|
start_lin = 1;
|
||||||
start_phy = 2;
|
start_phy = 2;
|
||||||
while(1) {
|
while(1) {
|
||||||
dbg_lin2phys(BX_CPU(dbg_cpu), lina, &phy, &valid, &tlb_phy, &tlb_valid);
|
BX_CPU(dbg_cpu)->dbg_xlate_linear2phy(lin, &phy, &valid);
|
||||||
if(valid) {
|
if(valid) {
|
||||||
if( (lina - start_lina != phy - start_phy) || tlb_valid) {
|
if((lin - start_lin) != (phy - start_phy)) {
|
||||||
if(all && (start_lina != 1))
|
if(all && (start_lin != 1))
|
||||||
printf("%08x - %08x: %8x - %8x\n",
|
dbg_printf("%08x - %08x: %8x - %8x\n",
|
||||||
start_lina, lina - 0x1000, start_phy, start_phy + (lina-0x1000-start_lina));
|
start_lin, lin - 0x1000, start_phy, start_phy + (lin-0x1000-start_lin));
|
||||||
start_lina = lina;
|
start_lin = lin;
|
||||||
start_phy = phy;
|
start_phy = phy;
|
||||||
}
|
}
|
||||||
if(tlb_valid) {
|
} else {
|
||||||
if(all && tlb_phy == phy)
|
if(all && start_lin != 1)
|
||||||
printf("%08x : %8x (%8x) in TLB\n", lina, phy, tlb_phy);
|
dbg_printf("%08x - %08x: %8x - %8x\n",
|
||||||
if(tlb_phy != phy)
|
start_lin, lin - 0x1000, start_phy, start_phy + (lin-0x1000-start_lin));
|
||||||
printf("%08x : %8x (%8x) in TLB Phys differs!!!\n", lina, phy, tlb_phy);
|
start_lin = 1;
|
||||||
start_lina = 1;
|
|
||||||
start_phy = 2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(all && start_lina != 1)
|
|
||||||
printf("%08x - %08x: %8x - %8x\n",
|
|
||||||
start_lina, lina - 0x1000, start_phy, start_phy + (lina-0x1000-start_lina));
|
|
||||||
if(tlb_valid) {
|
|
||||||
printf("%08x : (%8x) in TLB Table not valid!!!\n",
|
|
||||||
lina, tlb_phy);
|
|
||||||
}
|
|
||||||
start_lina = 1;
|
|
||||||
start_phy = 2;
|
start_phy = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lina == 0xfffff000)
|
if(lin == 0xfffff000) break;
|
||||||
break;
|
lin += 0x1000;
|
||||||
lina += 0x1000;
|
|
||||||
}
|
}
|
||||||
if(all && start_lina != 1)
|
if(all && start_lin != 1)
|
||||||
printf("%08x - %08x: %8x - %8x\n",
|
dbg_printf("%08x - %08x: %8x - %8x\n",
|
||||||
start_lina, 0xfffff000, start_phy, start_phy + (0xfffff000-start_lina));
|
start_lin, 0xfffff000, start_phy, start_phy + (0xfffff000-start_lin));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*form RB list*/
|
/*form RB list*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: osdep.h,v 1.25 2006-01-27 21:35:45 sshwarts Exp $
|
// $Id: osdep.h,v 1.26 2006-01-28 15:10:32 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -98,7 +98,7 @@ extern "C" {
|
|||||||
#else /* not WIN32 definitions */
|
#else /* not WIN32 definitions */
|
||||||
#define FMT_LL "%ll"
|
#define FMT_LL "%ll"
|
||||||
#define FMT_TICK "%011llu"
|
#define FMT_TICK "%011llu"
|
||||||
#define FMT_ADDRX64 "0x%016llx"
|
#define FMT_ADDRX64 "%016llx"
|
||||||
#endif /* not WIN32 definitions */
|
#endif /* not WIN32 definitions */
|
||||||
|
|
||||||
#define FMT_ADDRX32 "0x%08x"
|
#define FMT_ADDRX32 "0x%08x"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user