Clean up the PTE() macro (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 17 Dec 2015 19:31:19 +0000 (14:31 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 17 Dec 2015 19:31:19 +0000 (14:31 -0500)
The PTE macro was a bit of a mess.  Every user of it had the PA handy.  But
they always converted to the PPN.  Plus, x86's kpte_write() wasn't even
using it.

It also didn't need to be in a kernel header, which was causing some
collisions for some applications.  The mmu header is so that userspace can
be aware of their address space and walk their own page tables.  PTE() was
something that could build a page table entry, which they don't need.

I didn't compile the RISC-V stuff.  It's slowly rotting.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/cboot.c
kern/arch/riscv/mmu.h
kern/arch/riscv/pmap_ops.h
kern/arch/riscv/ros/mmu.h
kern/arch/x86/kpt.h
kern/arch/x86/mmu.h
kern/arch/x86/pmap64.c
kern/arch/x86/ros/mmu64.h

index 6161de5..cd6717b 100644 (file)
@@ -27,7 +27,7 @@ void pagetable_init(uint32_t memsize_mb, pte_t* l1pt, pte_t* l1pt_boot,
        uint64_t memsize = mem_size(memsize_mb);
        for(uint64_t pa = 0; pa < memsize+L1PGSIZE-1; pa += L1PGSIZE)
        {
-               pte_t pte = PTE(LA2PPN(pa), PTE_KERN_RW | PTE_E);
+               pte_t pte = build_pte(pa, PTE_KERN_RW | PTE_E);
 
                l1pt_boot[L1X(pa)] = pte; // identity mapping
                l1pt_boot[L1X(KERNBASE+pa)] = pte; // KERNBASE mapping
@@ -48,7 +48,7 @@ void pagetable_init(uint32_t memsize_mb, pte_t* l1pt, pte_t* l1pt_boot,
        l1pt_boot[L1X(KERN_LOAD_ADDR)] = PTD(l2pt);
 
        for (uintptr_t pa = 0; pa < (uintptr_t)(-KERN_LOAD_ADDR); pa += L2PGSIZE)
-               l2pt[L2X(KERN_LOAD_ADDR+pa)] = PTE(LA2PPN(pa), PTE_KERN_RW | PTE_E);
+               l2pt[L2X(KERN_LOAD_ADDR+pa)] = build_pte(pa, PTE_KERN_RW | PTE_E);
 #else
        (void) l2pt; // don't need this for rv32
 #endif
index 5d046ab..a950613 100644 (file)
@@ -1,4 +1,12 @@
 #pragma once
 
-/* til we remove this file, unless we have some kernel-only stuff later */
 #include <ros/arch/mmu.h>
+
+#ifndef __ASSEMBLER__
+
+static inline pte_t build_pte(uintptr_t pa, int flags)
+{
+       return LA2PPN(pa) << PTE_PPN_SHIFT | PGOFF(flags);
+}
+
+#endif /* __ASSEMBLER__ */
index 22768db..9fd78ef 100644 (file)
@@ -4,6 +4,8 @@
  *
  * Arch-specific operations for page tables and PTEs */
 
+#warning "These are the x86 ops.  Adopt them for RISC-V"
+
 #pragma once
 
 static inline bool pte_walk_okay(pte_t pte)
@@ -70,7 +72,7 @@ static inline unsigned long pte_print(pte_t pte)
 
 static inline void pte_write(pte_t pte, physaddr_t pa, int settings)
 {
-       *(kpte_t*)pte = PTE(pa2ppn(pa), settings);
+       *(kpte_t*)pte = build_pte(pa, settings);
 }
 
 static inline void pte_clear_present(pte_t pte)
index f6e5d9d..9bdcaab 100644 (file)
@@ -79,9 +79,6 @@
 // offset in page
 #define PGOFF(la)      (((uintptr_t) (la)) & (PGSIZE-1))
 
-// construct PTE from PPN and flags
-#define PTE(ppn, flags) ((ppn) << PTE_PPN_SHIFT | (flags))
-
 // construct PTD from physical address
 #define PTD(pa) (((uintptr_t)(pa) >> PGSHIFT << PTE_PPN_SHIFT) | PTE_T)
 
index 56a584f..1af3d6e 100644 (file)
@@ -58,7 +58,7 @@ static inline void kpte_write(kpte_t *kpte, physaddr_t pa, int settings)
 {
        assert(!PGOFF(pa));
        /* The arch-bits like PTE_D, PTE_PS, etc are all in the native KPT format */
-       *kpte = pa | settings;
+       *kpte = build_kpte(pa, settings);
 }
 
 static inline void kpte_clear_present(kpte_t *kpte)
index 5d046ab..4e1dc63 100644 (file)
@@ -1,4 +1,12 @@
 #pragma once
 
-/* til we remove this file, unless we have some kernel-only stuff later */
 #include <ros/arch/mmu.h>
+
+#ifndef __ASSEMBLER__
+
+static inline kpte_t build_kpte(uintptr_t pa, int flags)
+{
+       return LA2PPN(pa) << PGSHIFT | PGOFF(flags);
+}
+
+#endif /* __ASSEMBLER__ */
index f8ccc76..7d91345 100644 (file)
@@ -590,8 +590,8 @@ int arch_pgdir_setup(pgdir_t boot_copy, pgdir_t *new_pd)
        memset(ept, 0, PGSIZE);
 
        /* VPT and UVPT map the proc's page table, with different permissions. */
-       kpt[PML4(VPT)]  = PTE(LA2PPN(PADDR(kpt)), PTE_KERN_RW);
-       kpt[PML4(UVPT)] = PTE(LA2PPN(PADDR(kpt)), PTE_USER_RO);
+       kpt[PML4(VPT)]  = build_kpte(PADDR(kpt), PTE_KERN_RW);
+       kpt[PML4(UVPT)] = build_kpte(PADDR(kpt), PTE_USER_RO);
 
        new_pd->kpte = kpt;
        new_pd->eptp = construct_eptp(PADDR(ept));
index 637d72c..84a4941 100644 (file)
@@ -251,9 +251,6 @@ typedef struct x86_pgdir {
 #define PGOFF(la)              ((uintptr_t)(la) & (PGSIZE - 1))
 #define NPTENTRIES             512
 
-/* construct PTE from PPN and flags */
-#define PTE(ppn, flags) ((ppn) << PGSHIFT | PGOFF(flags))
-
 /* This is used in places (procinfo) meaning "size of smallest jumbo page" */
 #define PTSIZE PML2_PTE_REACH