--- src.o/sys/i386/i386/pmap.c Sun Mar 25 17:03:16 2007 +++ src/sys/i386/i386/pmap.c Mon Mar 26 12:30:46 2007 @@ -104,6 +104,7 @@ */ #include "opt_cpu.h" +#include "opt_ddb.h" #include "opt_pmap.h" #include "opt_msgbuf.h" #include "opt_smp.h" @@ -3482,17 +3483,19 @@ } -#if defined(PMAP_DEBUG) -pmap_pid_dump(int pid) +#ifdef DDB +#include + +static void +pmap_proc_dump(struct proc *paddr) { pmap_t pmap; struct proc *p; int npte = 0; int index; - sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { - if (p->p_pid != pid) + if (p != paddr) continue; if (p->p_vmspace) { @@ -3511,10 +3514,9 @@ if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) { if (index) { index = 0; - printf("\n"); + db_printf("\n"); } - sx_sunlock(&allproc_lock); - return npte; + return; } pte = pmap_pte(pmap, va); if (pte && pmap_pte_v(pte)) { @@ -3522,31 +3524,24 @@ vm_page_t m; pa = *pte; m = PHYS_TO_VM_PAGE(pa); - printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x", + db_printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x", va, pa, m->hold_count, m->wire_count, m->flags); npte++; index++; if (index >= 2) { index = 0; - printf("\n"); + db_printf("\n"); } else { - printf(" "); + db_printf(" "); } } + pmap_pte_release(pte); } } } } } - sx_sunlock(&allproc_lock); - return npte; } -#endif - -#if defined(DEBUG) - -static void pads(pmap_t pm); -void pmap_pvdump(vm_offset_t pa); /* print address space of pmap*/ static void @@ -3568,25 +3563,63 @@ continue; ptep = pmap_pte(pm, va); if (pmap_pte_v(ptep)) - printf("%x:%x ", va, *ptep); + db_printf("%x:%x ", va, *ptep); + pmap_pte_release(ptep); }; } -void +static void pmap_pvdump(vm_paddr_t pa) { pv_entry_t pv; pmap_t pmap; vm_page_t m; - printf("pa %x", pa); + db_printf("pa %x\n", pa); m = PHYS_TO_VM_PAGE(pa); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { pmap = PV_PMAP(pv); - printf(" -> pmap %p, va %x", (void *)pmap, pv->pv_va); + db_printf(" -> pmap %p, va %x\n", (void *)pmap, pv->pv_va); pads(pmap); } - printf(" "); + db_printf(" "); +} + +DB_SHOW_COMMAND(pmap, db_show_pmap) +{ + pmap_t pm; + + if (!have_addr) { + db_printf("usage: show pmap \n"); + return; + } + pm = (pmap_t)addr; + pads(pm); +} + +DB_SHOW_COMMAND(procpmap, db_show_procpmap) +{ + struct proc *p; + + if (!have_addr) { + db_printf("usage: show procpmap \n"); + return; + } + p = (struct proc *)addr; + pmap_proc_dump(p); +} + +DB_SHOW_COMMAND(pvdump, db_show_pvdump) +{ + vm_paddr_t pa; + + if (!have_addr) { + db_printf("usage: show pvdump \n"); + return; + } + pa = (vm_paddr_t)addr; + pmap_pvdump(pa); } + #endif --- src.o/sys/conf/options.i386 Sat Jul 29 18:38:53 2006 +++ src/sys/conf/options.i386 Mon Mar 26 11:19:46 2007 @@ -14,6 +14,7 @@ MP_WATCHDOG PERFMON PMAP_SHPGPERPROC opt_pmap.h +PMAP_DEBUG opt_pmap.h POWERFAIL_NMI opt_trap.h # Options for emulators. These should only be used at config time, so