SMP stacks and initial INT handling
[akaros.git] / kern / pmap.h
1 /* See COPYRIGHT for copyright information. */
2
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
8
9 #include <inc/memlayout.h>
10 #include <inc/assert.h>
11 struct Env;
12
13
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.
18  */
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;                                     \
25 })
26
27 /* This macro takes a physical address and returns the corresponding kernel
28  * virtual address.  It warns 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                 warn("KADDR called with invalid pa %08lx", __m_pa);\
35         (void*) (__m_pa + KERNBASE);                            \
36 })
37
38
39
40 extern char bootstacktop[], bootstack[];
41
42 extern struct Page *pages;
43 extern size_t npage;
44
45 extern physaddr_t boot_cr3;
46 extern pde_t *boot_pgdir;
47
48 extern struct Segdesc (COUNT(SEG_COUNT) gdt)[];
49 extern struct Pseudodesc gdt_pd;
50
51 void    i386_detect_memory(void);
52 bool    enable_pse(void);
53 void    i386_vm_init(void);
54
55 void    page_init(void);
56 void    page_check(void);
57 int     page_alloc(struct Page **pp_store);
58 void    page_free(struct Page *pp);
59 int     page_insert(pde_t *pgdir, struct Page *pp, void *va, int perm);
60 void    page_remove(pde_t *pgdir, void *va);
61 struct Page *page_lookup(pde_t *pgdir, void *va, pte_t **pte_store);
62 void    page_decref(struct Page *pp);
63
64 void    tlb_invalidate(pde_t *pgdir, void *va);
65
66 void *COUNT(len)
67 user_mem_check(struct Env *env, const void *DANGEROUS va, size_t len, int perm);
68
69 void *COUNT(len)
70 user_mem_assert(struct Env *env, const void *DANGEROUS va, size_t len, int perm);
71
72 static inline ppn_t
73 page2ppn(struct Page *pp)
74 {
75         return pp - pages;
76 }
77
78 static inline physaddr_t
79 page2pa(struct Page *pp)
80 {
81         return page2ppn(pp) << PGSHIFT;
82 }
83
84 static inline struct Page*
85 pa2page(physaddr_t pa)
86 {
87         if (PPN(pa) >= npage)
88                 warn("pa2page called with pa larger than npage");
89         return &pages[PPN(pa)];
90 }
91
92 static inline void*
93 page2kva(struct Page *pp)
94 {
95         return KADDR(page2pa(pp));
96 }
97
98 pte_t *pgdir_walk(pde_t *pgdir, const void *va, int create);
99
100 #endif /* !JOS_KERN_PMAP_H */