Uses kref for struct page
[akaros.git] / kern / include / pmap.h
index 052f6b1..a36189c 100644 (file)
@@ -5,8 +5,6 @@
  * Copyright (c) 2009 The Regents of the University of California
  * Barret Rhoden <brho@cs.berkeley.edu>
  * Kevin Klues <klueska@cs.berkeley.edu> (multiboot functions)
- * Ander Waterman <waterman@cs.berkeley.edu> (memcpy_from_user)
- * Zach Anderson (zra@cs.berkeley.edu> (user_mem_strlcpy)
  * See LICENSE for details.
  *
  * Physical memory mangement, low-level virtual address space initialization and
@@ -44,7 +42,7 @@
 #define KADDR(pa)                                              \
 ({                                                             \
        physaddr_t __m_pa = (pa);                               \
-       size_t __m_ppn = PPN(__m_pa);                           \
+       size_t __m_ppn = LA2PPN(__m_pa);                        \
        if (__m_ppn >= npages)                                  \
                warn("KADDR called with invalid pa %08lx", __m_pa);\
        (void*TRUSTED) (__m_pa + KERNBASE);                             \
@@ -67,7 +65,7 @@ void  vm_init(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);
+int        page_insert(pde_t *pgdir, struct page *page, 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);
 void   page_remove(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
@@ -79,26 +77,9 @@ void setup_default_mtrrs(barrier_t* smp_barrier);
 void   tlb_invalidate(pde_t *COUNT(NPDENTRIES) pgdir, void *SNT va);
 void tlb_flush_global(void);
 
-/* TODO: either move these, or make them take a pgdir */
-void * (DALLOC(len) user_mem_check) (env_t *env, const void *DANGEROUS va,
-                                     size_t len, int perm);
-
-void * (DALLOC(len) user_mem_assert)(env_t *env, const void *DANGEROUS va,
-                                     size_t len, int perm);
-
-size_t user_mem_strlcpy(env_t *env, char *NT COUNT(len - 1),
-                        const char *DANGEROUS va, size_t len, int perm);
-
-error_t
-memcpy_from_user(env_t* env, void* COUNT(len) dest,
-                 const void *DANGEROUS va, size_t len);
-                 
 /* 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);
-// TODO: should this be per process, per mm, per pgdir, etc?
-// - can't ask this question without knowing the "context"
-void *get_free_va_range(pde_t *pgdir, uintptr_t addr, size_t len);
 
 static inline page_t *SAFE ppn2page(size_t ppn)
 {
@@ -119,9 +100,9 @@ static inline physaddr_t page2pa(page_t *pp)
 
 static inline page_t*COUNT(1) pa2page(physaddr_t pa)
 {
-       if (PPN(pa) >= npages)
+       if (LA2PPN(pa) >= npages)
                warn("pa2page called with pa (0x%08x) larger than npages", pa);
-       return &pages[PPN(pa)];
+       return &pages[LA2PPN(pa)];
 }
 
 static inline void*COUNT(PGSIZE) page2kva(page_t *pp)
@@ -139,4 +120,9 @@ static inline page_t* kva2page(void* addr)
        return pa2page(PADDR(addr));
 }
 
+static inline ppn_t kva2ppn(void* addr) 
+{
+       return page2ppn(kva2page(addr));
+}
+
 #endif /* !ROS_KERN_PMAP_H */