bug in serve_close fixed.
[mit-jos.git] / kern / pmap.h
blob3ce3eb153e9e1c49f05417b4188667656b812640
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 = PPN(__m_pa); \
33 if (__m_ppn >= npage) \
34 panic("KADDR called with invalid pa %08lx", __m_pa);\
35 (void*) (__m_pa + KERNBASE); \
40 extern char bootstacktop[], bootstack[];
42 extern struct Page *pages;
43 extern size_t npage;
45 extern physaddr_t boot_cr3;
46 extern pde_t *boot_pgdir;
48 extern struct Segdesc gdt[];
49 extern struct Pseudodesc gdt_pd;
51 void i386_vm_init();
52 void i386_detect_memory();
54 void page_init(void);
55 int page_alloc(struct Page **pp_store);
56 void page_free(struct Page *pp);
57 int page_insert(pde_t *pgdir, struct Page *pp, void *va, int perm);
58 void page_remove(pde_t *pgdir, void *va);
59 struct Page *page_lookup(pde_t *pgdir, void *va, pte_t **pte_store);
60 void page_decref(struct Page *pp);
62 void tlb_invalidate(pde_t *pgdir, void *va);
63 int user_mem_check(struct Env *env, const void *va, size_t len, int perm);
64 void user_mem_assert(struct Env *env, const void *va, size_t len, int perm);
66 static inline ppn_t
67 page2ppn(struct Page *pp)
69 return pp - pages;
72 static inline physaddr_t
73 page2pa(struct Page *pp)
75 return page2ppn(pp) << PGSHIFT;
78 static inline struct Page*
79 pa2page(physaddr_t pa)
81 if (PPN(pa) >= npage)
82 panic("pa2page called with invalid pa");
83 return &pages[PPN(pa)];
86 static inline void*
87 page2kva(struct Page *pp)
89 return KADDR(page2pa(pp));
92 pte_t *pgdir_walk(pde_t *pgdir, const void *va, int create);
94 #endif /* !JOS_KERN_PMAP_H */