static int __spurious_page_fault(
unsigned long addr, struct cpu_user_regs *regs)
{
- unsigned long mfn = read_cr3() >> PAGE_SHIFT;
+ unsigned long mfn, cr3 = read_cr3();
#if CONFIG_PAGING_LEVELS >= 4
l4_pgentry_t l4e, *l4t;
#endif
if ( regs->error_code & PGERR_instr_fetch )
disallowed_flags |= _PAGE_NX;
+ mfn = cr3 >> PAGE_SHIFT;
+
#if CONFIG_PAGING_LEVELS >= 4
l4t = map_domain_page(mfn);
l4e = l4t[l4_table_offset(addr)];
#endif
#if CONFIG_PAGING_LEVELS >= 3
- l3t = map_domain_page(mfn);
+ l3t = map_domain_page(mfn);
+#ifdef CONFIG_X86_PAE
+ l3t += (cr3 & 0xFE0UL) >> 3;
+#endif
l3e = l3t[l3_table_offset(addr)];
mfn = l3e_get_pfn(l3e);
unmap_domain_page(l3t);
void show_page_walk(unsigned long addr)
{
- unsigned long pfn, mfn = read_cr3() >> PAGE_SHIFT;
+ unsigned long pfn, mfn, cr3 = read_cr3();
#ifdef CONFIG_X86_PAE
l3_pgentry_t l3e, *l3t;
#endif
printk("Pagetable walk from %08lx:\n", addr);
+ mfn = cr3 >> PAGE_SHIFT;
+
#ifdef CONFIG_X86_PAE
- l3t = map_domain_page(mfn);
+ l3t = map_domain_page(mfn);
+ l3t += (cr3 & 0xFE0UL) >> 3;
l3e = l3t[l3_table_offset(addr)];
mfn = l3e_get_pfn(l3e);
pfn = get_gpfn_from_mfn(mfn);