1 /* See COPYRIGHT for copyright information. */
3 #ifndef JOS_KERN_PMAP_H
4 #define JOS_KERN_PMAP_H
6 # error "This is a JOS kernel header; user programs should not #include it"
9 #include <inc/memlayout.h>
10 #include <inc/assert.h>
13 /* This macro takes a kernel virtual address -- an address that points above
14 * KERNBASE, where the machine's maximum 256MB of physical memory is mapped --
15 * and returns the corresponding physical address. It panics if you pass it a
16 * non-kernel virtual address.
20 physaddr_t __m_kva = (physaddr_t) (kva); \
21 if (__m_kva < KERNBASE) \
22 panic("PADDR called with invalid kva %08lx", __m_kva);\
26 /* This macro takes a physical address and returns the corresponding kernel
27 * virtual address. It panics if you pass an invalid physical address. */
30 physaddr_t __m_pa = (pa); \
31 uint32_t __m_ppn = PGNUM(__m_pa); \
32 if (__m_ppn >= npages) \
33 panic("KADDR called with invalid pa %08lx", __m_pa);\
34 (void*) (__m_pa + KERNBASE); \
39 // Each Page describes one physical page.
40 // The pages[] array keeps track of the state of physical memory.
41 // Entry pages[N] holds information about physical page #N.
42 // The machine has 'npages' pages of physical memory space.
43 extern struct Page
*pages
;
47 // Next page on the free list.
50 // Count of pointers to this page (usually in page table entries).
51 // Reserved pages may not have valid reference counts.
55 extern pde_t
*kern_pgdir
;
57 extern struct Segdesc gdt
[];
58 extern struct Pseudodesc gdt_pd
;
63 struct Page
*page_alloc(void);
64 void page_free(struct Page
*pp
);
65 int page_insert(pde_t
*pgdir
, struct Page
*pp
, uintptr_t va
, pte_t perm
);
66 void page_remove(pde_t
*pgdir
, uintptr_t va
);
67 struct Page
*page_lookup(pde_t
*pgdir
, uintptr_t va
, pte_t
**pte_store
);
68 void page_decref(struct Page
*pp
);
70 void tlb_invalidate(pde_t
*pgdir
, uintptr_t va
);
72 static inline physaddr_t
73 page2pa(struct Page
*pp
)
75 return (pp
- pages
) << PGSHIFT
;
78 static inline struct Page
*
79 pa2page(physaddr_t pa
)
81 if (PGNUM(pa
) >= npages
)
82 panic("pa2page called with invalid pa");
83 return &pages
[PGNUM(pa
)];
87 page2kva(struct Page
*pp
)
89 return KADDR(page2pa(pp
));
92 pte_t
*pgdir_walk(pde_t
*pgdir
, uintptr_t va
, int create
);
94 #endif /* !JOS_KERN_PMAP_H */