x86: Fixes 64 bit VPT mapping
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 14 Sep 2013 18:06:04 +0000 (11:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 01:57:15 +0000 (17:57 -0800)
You can't have global entries on certain interior PML PTEs.  For
instance, in the 4K walk (which we're doing for VPT/VPD), PML4 and PML3
both need the global bit to be 0.

kern/arch/x86/pmap64.c

index a0b4e79..775f228 100644 (file)
@@ -440,9 +440,9 @@ void vm_init(void)
        map_segment(boot_pgdir, IOAPIC_BASE, PGSIZE, IOAPIC_PBASE,
                    PTE_PCD | PTE_PWT | PTE_W | PTE_G, max_jumbo_shift);
        /* VPT mapping: recursive PTE inserted at the VPT spot */
        map_segment(boot_pgdir, IOAPIC_BASE, PGSIZE, IOAPIC_PBASE,
                    PTE_PCD | PTE_PWT | PTE_W | PTE_G, max_jumbo_shift);
        /* VPT mapping: recursive PTE inserted at the VPT spot */
-       boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_W | PTE_P | PTE_G;
+       boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_W | PTE_P;
        /* same for UVPT, accessible by userspace (RO). */
        /* same for UVPT, accessible by userspace (RO). */
-       boot_pgdir[PDX(UVPT)] = PADDR(boot_pgdir) | PTE_U | PTE_P | PTE_G;
+       boot_pgdir[PDX(UVPT)] = PADDR(boot_pgdir) | PTE_U | PTE_P;
        /* set up core0s now (mostly for debugging) */
        setup_default_mtrrs(0);
        /* Our current gdt_pd (gdt64desc) is pointing to a physical address for the
        /* set up core0s now (mostly for debugging) */
        setup_default_mtrrs(0);
        /* Our current gdt_pd (gdt64desc) is pointing to a physical address for the