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 + PGSIZE / sizeof *pde; 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 (pg_ofs (upage) == 0);
44 ASSERT (upage < PHYS_BASE);
46 /* Check for a page table for UPAGE.
47 If one is missing, create one if requested. */
48 pde = pd + pd_no (upage);
53 pt = palloc_get (PAL_ZERO);
57 *pde = pde_create (pt);
63 /* Return the page table entry. */
64 pt = pde_get_pt (*pde);
65 return &pt[pt_no (upage)];
69 pagedir_set_page (uint32_t *pd, void *upage, void *kpage,
74 ASSERT (pg_ofs (kpage) == 0);
76 pte = lookup_page (pd, upage, true);
79 *pte = pte_create_user (kpage, writable);
87 pagedir_get_page (uint32_t *pd, void *upage)
89 uint32_t *pte = lookup_page (pd, upage, false);
90 return pte != NULL && *pte != 0 ? pte_get_page (*pte) : NULL;
94 pagedir_clear_page (uint32_t *pd, void *upage)
96 uint32_t *pte = lookup_page (pd, upage, false);
102 pagedir_activate (uint32_t *pd)
106 asm volatile ("movl %0,%%cr3" :: "r" (vtop (pd)));