x86: Fix KERNBASE mapping for > 512 GB RAM
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 10 May 2017 15:36:46 +0000 (11:36 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 10 May 2017 15:39:27 +0000 (11:39 -0400)
The mapping was setting PTE_W, but not PTE_P.  This would have caused
faults whenever we tried to access those pages, which would have been
really nasty to track down.  I found this because of the panic in
__pte_to_epte_perm() (wasn't expected PTE_W only).

To be more clear in the code, we should be setting PTE_KERN_RW, which is
PTE_W | PTE_P.  Same goes for the VPT/UVPT mapping.  Those latter changes
were just in the naming of the flags.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/pmap64.c

index e8d36b5..55c6329 100644 (file)
@@ -468,16 +468,16 @@ void vm_init(void)
        if (KERNBASE + PML3_REACH < (uintptr_t)KADDR(max_paddr)) {
                map_segment(boot_pgdir, KERNBASE + PML3_REACH,
                            max_paddr - PML3_REACH, 0x0 + PML3_REACH,
-                           PTE_W | PTE_G, max_jumbo_shift);
+                           PTE_KERN_RW | PTE_G, max_jumbo_shift);
        }
        /* For the LAPIC and IOAPIC, we use PAT (but not *the* PAT flag) to make
         * these type UC */
        map_segment(boot_pgdir, IOAPIC_BASE, APIC_SIZE, IOAPIC_PBASE,
                    PTE_NOCACHE | PTE_KERN_RW | PTE_G, max_jumbo_shift);
        /* VPT mapping: recursive PTE inserted at the VPT spot */
-       boot_kpt[PML4(VPT)] = PADDR(boot_kpt) | PTE_W | PTE_P;
+       boot_kpt[PML4(VPT)] = PADDR(boot_kpt) | PTE_KERN_RW;
        /* same for UVPT, accessible by userspace (RO). */
-       boot_kpt[PML4(UVPT)] = PADDR(boot_kpt) | PTE_U | PTE_P;
+       boot_kpt[PML4(UVPT)] = PADDR(boot_kpt) | PTE_USER_RO;
        /* set up core0s now (mostly for debugging) */
        setup_default_mtrrs(0);
        /* Our current gdt_pd (gdt64desc) is pointing to a physical address for the