vfs: Remove ext2 support
[akaros.git] / kern / include / pmap.h
index cabf615..92500e1 100644 (file)
@@ -10,8 +10,7 @@
  * management, and other things related to virtual->physical mappings.
  */
 
-#ifndef ROS_KERN_PMAP_H
-#define ROS_KERN_PMAP_H
+#pragma once
 
 #include <ros/memlayout.h>
 #include <sys/queue.h>
        size_t __m_ppn = LA2PPN(__m_pa);                        \
        if (__m_ppn > max_nr_pages)                                     \
                warn("KADDR called with invalid pa %p", __m_pa);\
-       (void*TRUSTED) (__m_pa + KERNBASE);                             \
+       (void*) (__m_pa + KERNBASE);                            \
 })
 
 #define KADDR_NOCHECK(pa) ((void*)(pa + KERNBASE))
 #define KBASEADDR(kla) KADDR(PADDR(kla))
 
-extern char (SNT RO bootstacktop)[], (SNT RO bootstack)[];
+extern char bootstacktop[], bootstack[];
 
 extern physaddr_t max_pmem;            /* Total amount of physical memory */
 extern size_t max_nr_pages;            /* Total number of physical memory pages */
@@ -72,7 +71,7 @@ extern uintptr_t boot_freelimit;
  * counted, and free pages are kept on a linked list. */
 extern struct page *pages;
 
-extern physaddr_t RO boot_cr3;
+extern physaddr_t boot_cr3;
 extern pgdir_t boot_pgdir;
 
 bool enable_pse(void);
@@ -83,26 +82,32 @@ void *boot_alloc(size_t amt, size_t align);
 void *boot_zalloc(size_t amt, size_t align);
 
 void page_check(void);
-int     page_insert(pgdir_t pgdir, struct page *page, void *SNT va,
+int     page_insert(pgdir_t pgdir, struct page *page, void *va,
                        int perm);
-void page_remove(pgdir_t pgdir, void *SNT va);
+void page_remove(pgdir_t pgdir, void *va);
 page_t* page_lookup(pgdir_t pgdir, void *va, pte_t *pte_store);
-error_t        pagetable_remove(pgdir_t pgdir, void *SNT va);
-void   page_decref(page_t *COUNT(1) pp);
+error_t        pagetable_remove(pgdir_t pgdir, void *va);
+void   page_decref(page_t *pp);
 
-void   tlb_invalidate(pgdir_t pgdir, void *SNT va);
+void   tlb_invalidate(pgdir_t pgdir, void *ga);
 void tlb_flush_global(void);
-bool regions_collide_unsafe(uintptr_t start1, uintptr_t end1, 
+void tlb_shootdown_global(void);
+bool regions_collide_unsafe(uintptr_t start1, uintptr_t end1,
                             uintptr_t start2, uintptr_t end2);
 
 /* Arch specific implementations for these */
+void map_segment(pgdir_t pgdir, uintptr_t va, size_t size, physaddr_t pa,
+                 int perm, int pml_shift);
+int unmap_segment(pgdir_t pgdir, uintptr_t va, size_t size);
 pte_t pgdir_walk(pgdir_t pgdir, const void *va, int create);
 int get_va_perms(pgdir_t pgdir, const void *va);
 int arch_pgdir_setup(pgdir_t boot_copy, pgdir_t *new_pd);
 physaddr_t arch_pgdir_get_cr3(pgdir_t pd);
 void arch_pgdir_clear(pgdir_t *pd);
+int arch_max_jumbo_page_shift(void);
+void arch_add_intermediate_pts(pgdir_t pgdir, uintptr_t va, size_t len);
 
-static inline page_t *SAFE ppn2page(size_t ppn)
+static inline page_t *ppn2page(size_t ppn)
 {
        if (ppn >= max_nr_pages)
                warn("ppn2page called with ppn (%08lu) larger than max_nr_pages", ppn);
@@ -119,7 +124,7 @@ static inline physaddr_t page2pa(page_t *pp)
        return page2ppn(pp) << PGSHIFT;
 }
 
-static inline page_t*COUNT(1) pa2page(physaddr_t pa)
+static inline page_t *pa2page(physaddr_t pa)
 {
        if (LA2PPN(pa) >= max_nr_pages)
                warn("pa2page called with pa (%p) larger than max_nr_pages", pa);
@@ -131,22 +136,22 @@ static inline ppn_t pa2ppn(physaddr_t pa)
        return pa >> PGSHIFT;
 }
 
-static inline void*COUNT(PGSIZE) page2kva(page_t *pp)
+static inline void *page2kva(page_t *pp)
 {
        return KADDR(page2pa(pp));
 }
 
-static inline void*COUNT(PGSIZE) ppn2kva(size_t pp)
+static inline void *ppn2kva(size_t pp)
 {
        return page2kva(ppn2page(pp));
 }
 
-static inline page_t* kva2page(void* addr) 
+static inline page_t* kva2page(void* addr)
 {
        return pa2page(PADDR(addr));
 }
 
-static inline ppn_t kva2ppn(void* addr) 
+static inline ppn_t kva2ppn(void* addr)
 {
        return page2ppn(kva2page(addr));
 }
@@ -161,109 +166,7 @@ static inline unsigned long nr_pages(size_t nr_bytes)
        return (nr_bytes >> PGSHIFT) + (PGOFF(nr_bytes) ? 1 : 0);
 }
 
-static inline bool pte_walk_okay(pte_t pte)
-{
-       return pte ? TRUE : FALSE;
-}
-
-/* PTE states:
- *  - present: the PTE is involved in a valid page table walk, with the physaddr
- *  part pointing to a physical page.
- *
- *     - mapped: the PTE is involved in some sort of mapping, e.g. a VMR.  We're
- *     storing something in the PTE, but it is isn't necessarily present and
- *     pointing to an actual physical page.  All present are mapped, but not vice
- *     versa.  Mapped could also include paged-out, if we support that later.
- *
- *     - unmapped: completely unused. (0 value) */
-static inline bool pte_is_present(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_P ? TRUE : FALSE;
-}
-
-static inline bool pte_is_unmapped(pte_t pte)
-{
-       return PAGE_UNMAPPED(*(kpte_t*)pte);
-}
-
-static inline bool pte_is_mapped(pte_t pte)
-{
-       return !PAGE_UNMAPPED(*(kpte_t*)pte);
-}
-
-static inline bool pte_is_paged_out(pte_t pte)
-{
-       return PAGE_PAGED_OUT(*(kpte_t*)pte);
-}
-
-static inline bool pte_is_dirty(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_D ? TRUE : FALSE;
-}
-
-static inline bool pte_is_accessed(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_A ? TRUE : FALSE;
-}
-
-/* Used in debugging code - want something better involving the walk */
-static inline bool pte_is_jumbo(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_PS ? TRUE : FALSE;
-}
-
-static inline physaddr_t pte_get_paddr(pte_t pte)
-{
-       return PTE_ADDR(*(kpte_t*)pte);
-}
-
-/* Returns the PTE in an unsigned long, for debugging mostly. */
-static inline unsigned long pte_print(pte_t pte)
-{
-       return *(kpte_t*)pte;
-}
-
-static inline void pte_write(pte_t pte, physaddr_t pa, int perm)
-{
-       *(kpte_t*)pte = PTE(pa2ppn(pa), perm);
-}
-
-static inline void pte_clear_present(pte_t pte)
-{
-       *(kpte_t*)pte &= ~PTE_P;
-}
-
-static inline void pte_clear(pte_t pte)
-{
-       *(kpte_t*)pte = 0;
-}
-
-/* These are used by memcpy_*_user, but are very dangerous (and possibly used
- * incorrectly there).  These aren't the overall perms for a VA.  For U and W,
- * we need the intersection of the PTEs along the walk and not just the last
- * one.  It just so happens that the W is only cleared on the last PTE, so the
- * check works for that.  But if there was a page under ULIM that wasn't U due
- * to an intermediate PTE, we'd miss that. */
-static inline bool pte_has_perm_ur(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_USER_RO ? TRUE : FALSE;
-}
-
-static inline bool pte_has_perm_urw(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_USER_RW ? TRUE : FALSE;
-}
-
-/* return the arch-independent format for prots - whatever you'd expect to
- * receive for pte_write.  Careful with the ret, since a valid type is 0. */
-static inline int pte_get_perm(pte_t pte)
-{
-       return *(kpte_t*)pte & PTE_PERM;
-}
-
-static inline void pte_replace_perm(pte_t pte, int perm)
-{
-       *(kpte_t*)pte = (*(kpte_t*)pte & ~PTE_PERM) | perm;
-}
-
-#endif /* !ROS_KERN_PMAP_H */
+/* Including here, since these ops often rely on pmap.h helpers, which rely on
+ * the generic arch/pmap.h.  It's likely that many of these ops will be inlined
+ * for speed in pmap_ops. */
+#include <arch/pmap_ops.h>