1 #include "userprog/pagedir.h"
5 #include "threads/init.h"
6 #include "threads/mmu.h"
7 #include "threads/palloc.h"
12 uint32_t *pd = palloc_get (0);
13 memcpy (pd, base_page_dir, PGSIZE);
18 pagedir_destroy (uint32_t *pd)
22 for (pde = pd; pde < pd + pd_no (PHYS_BASE); pde++)
25 uint32_t *pt = pde_get_pt (*pde);
28 for (pte = pt; pte < pt + PGSIZE / sizeof *pte; pte++)
30 palloc_free (pte_get_page (*pte));
37 lookup_page (uint32_t *pd, void *upage, bool create)
43 ASSERT (upage < PHYS_BASE);
45 /* Check for a page table for UPAGE.
46 If one is missing, create one if requested. */
47 pde = pd + pd_no (upage);
52 pt = palloc_get (PAL_ZERO);
56 *pde = pde_create (pt);
62 /* Return the page table entry. */
63 pt = pde_get_pt (*pde);
64 return &pt[pt_no (upage)];
68 pagedir_set_page (uint32_t *pd, void *upage, void *kpage,
73 ASSERT (pg_ofs (kpage) == 0);
75 pte = lookup_page (pd, upage, true);
78 *pte = pte_create_user (kpage, writable);
86 pagedir_get_page (uint32_t *pd, const void *upage)
88 uint32_t *pte = lookup_page (pd, (void *) upage, false);
89 return pte != NULL && *pte != 0 ? pte_get_page (*pte) : NULL;
93 pagedir_clear_page (uint32_t *pd, void *upage)
95 uint32_t *pte = lookup_page (pd, upage, false);
101 pagedir_activate (uint32_t *pd)
105 asm volatile ("movl %0,%%cr3" :: "r" (vtop (pd)));