new 64b kernel memory map (not userspace yet)
[akaros.git] / kern / include / pmap.h
index a43b5b0..bddd3be 100644 (file)
  */
 #define PADDR(kva)                                             \
 ({                                                             \
  */
 #define PADDR(kva)                                             \
 ({                                                             \
-       physaddr_t __m_kva = (physaddr_t) (kva);                \
+       physaddr_t __m_pa, __m_kva = (physaddr_t) (kva);                \
        if (__m_kva < KERNBASE)                                 \
        if (__m_kva < KERNBASE)                                 \
-               panic("PADDR called with invalid kva %08lx", __m_kva);\
-       __m_kva - KERNBASE;                                     \
+               panic("PADDR called with invalid kva %p", __m_kva);\
+       if(__m_kva >= KERN_LOAD_ADDR)                                   \
+               __m_pa = __m_kva - KERN_LOAD_ADDR;                                      \
+       else                                    \
+               __m_pa = __m_kva - KERNBASE;                                    \
+       __m_pa; \
 })
 
 /* This macro takes a physical address and returns the corresponding kernel
 })
 
 /* This macro takes a physical address and returns the corresponding kernel
@@ -44,7 +48,7 @@
        physaddr_t __m_pa = (pa);                               \
        size_t __m_ppn = LA2PPN(__m_pa);                        \
        if (__m_ppn >= npages)                                  \
        physaddr_t __m_pa = (pa);                               \
        size_t __m_ppn = LA2PPN(__m_pa);                        \
        if (__m_ppn >= npages)                                  \
-               warn("KADDR called with invalid pa %08lx", __m_pa);\
+               warn("KADDR called with invalid pa %p", __m_pa);\
        (void*TRUSTED) (__m_pa + KERNBASE);                             \
 })
 
        (void*TRUSTED) (__m_pa + KERNBASE);                             \
 })
 
@@ -65,9 +69,7 @@ void  vm_init(void);
 
 void   page_init(void);
 void   page_check(void);
 
 void   page_init(void);
 void   page_check(void);
-int        page_insert(pde_t *COUNT(NPDENTRIES) pgdir, page_t *pp, void *SNT va, int perm);
-void*COUNT(PGSIZE) page_insert_in_range(pde_t *COUNT(NPDENTRIES) pgdir, page_t *pp, 
-                             void *SNT vab, void *SNT vae, int perm);
+int        page_insert(pde_t *pgdir, struct page *page, void *SNT va, int perm);
 void   page_remove(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
 page_t*COUNT(1) page_lookup(pde_t SSOMELOCK*COUNT(NPDENTRIES) pgdir, void *SNT va, pte_t **pte_store);
 error_t        pagetable_remove(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
 void   page_remove(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
 page_t*COUNT(1) page_lookup(pde_t SSOMELOCK*COUNT(NPDENTRIES) pgdir, void *SNT va, pte_t **pte_store);
 error_t        pagetable_remove(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
@@ -80,11 +82,12 @@ void tlb_flush_global(void);
 /* Arch specific implementations for these */
 pte_t *pgdir_walk(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va, int create);
 int get_va_perms(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va);
 /* Arch specific implementations for these */
 pte_t *pgdir_walk(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va, int create);
 int get_va_perms(pde_t *COUNT(NPDENTRIES) pgdir, const void *SNT va);
+void* mmio_alloc(physaddr_t pa, size_t size);
 
 static inline page_t *SAFE ppn2page(size_t ppn)
 {
        if( ppn >= npages )
 
 static inline page_t *SAFE ppn2page(size_t ppn)
 {
        if( ppn >= npages )
-               warn("ppn2page called with ppn (%08u) larger than npages", ppn);
+               warn("ppn2page called with ppn (%08lu) larger than npages", ppn);
        return &(pages[ppn]);
 }
 
        return &(pages[ppn]);
 }
 
@@ -101,7 +104,7 @@ static inline physaddr_t page2pa(page_t *pp)
 static inline page_t*COUNT(1) pa2page(physaddr_t pa)
 {
        if (LA2PPN(pa) >= npages)
 static inline page_t*COUNT(1) pa2page(physaddr_t pa)
 {
        if (LA2PPN(pa) >= npages)
-               warn("pa2page called with pa (0x%08x) larger than npages", pa);
+               warn("pa2page called with pa (%p) larger than npages", pa);
        return &pages[LA2PPN(pa)];
 }
 
        return &pages[LA2PPN(pa)];
 }