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)
25 for (pde = pd; pde < pd + pd_no (PHYS_BASE); pde++)
28 uint32_t *pt = pde_get_pt (*pde);
31 for (pte = pt; pte < pt + PGSIZE / sizeof *pte; pte++)
33 palloc_free (pte_get_page (*pte));
40 lookup_page (uint32_t *pd, void *upage, bool create)
46 ASSERT (upage < PHYS_BASE);
48 /* Check for a page table for UPAGE.
49 If one is missing, create one if requested. */
50 pde = pd + pd_no (upage);
55 pt = palloc_get (PAL_ZERO);
59 *pde = pde_create (pt);
65 /* Return the page table entry. */
66 pt = pde_get_pt (*pde);
67 return &pt[pt_no (upage)];
71 pagedir_set_page (uint32_t *pd, void *upage, void *kpage,
76 ASSERT (pg_ofs (kpage) == 0);
78 pte = lookup_page (pd, upage, true);
81 *pte = pte_create_user (kpage, writable);
89 pagedir_get_page (uint32_t *pd, const void *upage)
91 uint32_t *pte = lookup_page (pd, (void *) upage, false);
92 return pte != NULL && *pte != 0 ? pte_get_page (*pte) : NULL;
96 pagedir_clear_page (uint32_t *pd, void *upage)
98 uint32_t *pte = lookup_page (pd, upage, false);
104 pagedir_activate (uint32_t *pd)
108 asm volatile ("movl %0,%%cr3" :: "r" (vtop (pd)));