parlib: Add synchronization objects
[akaros.git] / kern / arch / riscv / pmap.c
index 8c85245..f44f92b 100644 (file)
@@ -15,9 +15,9 @@
 #include <kmalloc.h>
 #include <page_alloc.h>
 
-pde_t* boot_pgdir;             // Virtual address of boot time page directory
+#warning "convert pgdir* to pgdir_t"
+pgdir_t* boot_pgdir;           // Virtual address of boot time page directory
 physaddr_t boot_cr3;           // Physical address of boot time page directory
-page_t* pages = NULL;          // Virtual address of physical page array
 
 // --------------------------------------------------------------
 // Set up initial memory mappings and turn on MMU.
@@ -47,7 +47,7 @@ vm_init(void)
 // This is boot_pgdir_walk, but using page_alloc() instead of boot_alloc().
 // Unlike boot_pgdir_walk, pgdir_walk can fail.
 pte_t*
-pgdir_walk(pde_t *pgdir, const void *SNT va, int create)
+pgdir_walk(pgdir_t *pgdir, const void *va, int create)
 {
        pte_t* ppte;
        pte_t* pt;
@@ -87,7 +87,7 @@ pgdir_walk(pde_t *pgdir, const void *SNT va, int create)
 
 /* Returns the effective permissions for PTE_U, PTE_W, and PTE_P on a given
  * virtual address. */
-int get_va_perms(pde_t *pgdir, const void *SNT va)
+int get_va_perms(pgdir_t *pgdir, const void *va)
 {
        pte_t* pte = pgdir_walk(pgdir, va, 0);
        return pte == NULL ? 0 : (*pte & (PTE_PERM | PTE_E));
@@ -98,7 +98,56 @@ page_check(void)
 {
 }
 
-void* mmio_alloc(physaddr_t pa, size_t size)
+uintptr_t gva2gpa(struct proc *p, uintptr_t cr3, uintptr_t gva)
 {
-       return NULL;
+       panic("Unimplemented");
+       return 0;
+}
+
+int arch_pgdir_setup(pgdir_t boot_copy, pgdir_t *new_pd)
+{
+       pte_t *kpt = kpage_alloc_addr();
+       if (!kpt)
+               return -ENOMEM;
+       memcpy(kpt, (pte_t*)boot_copy, PGSIZE);
+
+       /* TODO: VPT/UVPT mappings */
+
+       *new_pd = (pgdir_t)kpt;
+       return 0;
+}
+
+physaddr_t arch_pgdir_get_cr3(pgdir_t pd)
+{
+       return PADDR((pte_t*)pd);
+}
+
+void arch_pgdir_clear(pgdir_t *pd)
+{
+       *pd = 0;
+}
+
+/* Returns the page shift of the largest jumbo supported */
+int arch_max_jumbo_page_shift(void)
+{
+       #warning "What jumbo page sizes does RISC support?"
+       return PGSHIFT;
+}
+
+#warning "Not sure where you do your PT destruction.  Be sure to not unmap any intermediate page tables for kernel mappings.  At least not the PML(n-1) maps"
+
+void arch_add_intermediate_pts(pgdir_t pgdir, uintptr_t va, size_t len)
+{
+       #error "Implement me"
+}
+
+void map_segment(pgdir_t pgdir, uintptr_t va, size_t size, physaddr_t pa,
+                 int perm, int pml_shift)
+{
+       #error "Implement me"
+}
+
+int unmap_segment(pgdir_t pgdir, uintptr_t va, size_t size)
+{
+       #error "Implement me"
 }