* same with xv6
[mascara-docs.git] / i386 / ucla / src / lab3 / kern / pmap.h
blobebc79047e9c68b15b804a16c439a5b77d2b820de
1 /* See COPYRIGHT for copyright information. */
3 #ifndef JOS_KERN_PMAP_H
4 #define JOS_KERN_PMAP_H
5 #ifndef JOS_KERNEL
6 # error "This is a JOS kernel header; user programs should not #include it"
7 #endif
9 #include <inc/memlayout.h>
10 #include <inc/assert.h>
11 struct Env;
14 /* This macro takes a kernel virtual address -- an address that points above
15 * KERNBASE, where the machine's maximum 256MB of physical memory is mapped --
16 * and returns the corresponding physical address. It panics if you pass it a
17 * non-kernel virtual address.
19 #define PADDR(kva) \
20 ({ \
21 physaddr_t __m_kva = (physaddr_t) (kva); \
22 if (__m_kva < KERNBASE) \
23 panic("PADDR called with invalid kva %08lx", __m_kva);\
24 __m_kva - KERNBASE; \
27 /* This macro takes a physical address and returns the corresponding kernel
28 * virtual address. It panics if you pass an invalid physical address. */
29 #define KADDR(pa) \
30 ({ \
31 physaddr_t __m_pa = (pa); \
32 uint32_t __m_ppn = PGNUM(__m_pa); \
33 if (__m_ppn >= npages) \
34 panic("KADDR called with invalid pa %08lx", __m_pa);\
35 (void*) (__m_pa + KERNBASE); \
39 // Page structures.
40 // Each Page describes one physical page.
41 // The pages[] array keeps track of the state of physical memory.
42 // Entry pages[N] holds information about physical page #N.
43 // The machine has 'npages' pages of physical memory space.
44 extern struct Page *pages;
45 extern size_t npages;
47 struct Page {
48 // Next page on the free list.
49 Page *pp_link;
51 // Count of pointers to this page (usually in page table entries).
52 // Reserved pages may not have valid reference counts.
53 uint16_t pp_ref;
56 extern pde_t *kern_pgdir;
58 extern struct Segdesc gdt[];
59 extern struct Pseudodesc gdt_pd;
61 void mem_init(void);
63 void page_init(void);
64 struct Page *page_alloc(void);
65 void page_free(struct Page *pp);
66 int page_insert(pde_t *pgdir, struct Page *pp, uintptr_t va, pte_t perm);
67 void page_remove(pde_t *pgdir, uintptr_t va);
68 struct Page *page_lookup(pde_t *pgdir, uintptr_t va, pte_t **pte_store);
69 void page_decref(struct Page *pp);
71 void tlb_invalidate(pde_t *pgdir, uintptr_t va);
73 int user_mem_check(struct Env *env, uintptr_t va, size_t len, pte_t perm);
74 void user_mem_assert(struct Env *env, uintptr_t va, size_t len, pte_t perm);
76 static inline physaddr_t
77 page2pa(struct Page *pp)
79 return (pp - pages) << PGSHIFT;
82 static inline struct Page *
83 pa2page(physaddr_t pa)
85 if (PGNUM(pa) >= npages)
86 panic("pa2page called with invalid pa");
87 return &pages[PGNUM(pa)];
90 static inline void *
91 page2kva(struct Page *pp)
93 return KADDR(page2pa(pp));
96 static inline struct Page *
97 kva2page(void *kva)
99 return pa2page(PADDR(kva));
102 pte_t *pgdir_walk(pde_t *pgdir, uintptr_t va, int create);
104 #endif /* !JOS_KERN_PMAP_H */