diff -rN -u -p old-xen-unstable/xen/arch/x86/x86_32/traps.c new-xen-unstable/xen/arch/x86/x86_32/traps.c --- old-xen-unstable/xen/arch/x86/x86_32/traps.c 2005-04-27 20:19:53.000000000 +0000 +++ new-xen-unstable/xen/arch/x86/x86_32/traps.c 2005-04-30 08:45:13.000000000 +0000 @@ -159,17 +159,32 @@ void show_registers(struct xen_regs *reg void show_page_walk(unsigned long addr) { -#if defined(__i386__) && defined(CONFIG_X86_PAE) - printk("FIXME: PAE code needed here: %s:%d (%s)\n", - __FILE__, __LINE__, __FUNCTION__); -#else - unsigned long page; - if ( addr < PAGE_OFFSET ) return; printk("Pagetable walk from %08lx:\n", addr); +#if defined(__i386__) && defined(CONFIG_X86_PAE) + l3_pgentry_t *pl3e; + l2_pgentry_t *pl2e; + l1_pgentry_t *pl1e; + + pl3e = &idle_pg_table[l3_table_offset(addr)]; + printk(" L3 = 0x%016llx\n", l3e_get_value(*pl3e)); + + pl2e = l3e_to_l2e(*pl3e) + l2_table_offset(addr); + + printk(" L2 = 0x%016llx %s\n", l2e_get_value(*pl2e), + (l2e_get_flags(*pl2e) & _PAGE_PSE) ? "(2MB)" : ""); + if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) || + (l2e_get_flags(*pl2e) & _PAGE_PSE) ) + return; + + pl1e = l2e_to_l1e(*pl2e) + l1_table_offset(addr); + printk(" L1 = 0x%016llx\n", l1e_get_value(*pl1e)); +#else + unsigned long page; + page = l2e_get_value(idle_pg_table[l2_table_offset(addr)]); printk(" L2 = %08lx %s\n", page, (page & _PAGE_PSE) ? "(4MB)" : ""); if ( !(page & _PAGE_PRESENT) || (page & _PAGE_PSE) )