Add a `null' test for testing src/userprog before system calls have
[pintos-anon] / src / userprog / pagedir.c
index fa8f244d88220a954e43ebc880e1140d242643f4..3ad8123557a37dace964bcc18be56a431605f87d 100644 (file)
@@ -121,7 +121,9 @@ void *
 pagedir_get_page (uint32_t *pd, const void *uaddr) 
 {
   uint32_t *pte = lookup_page (pd, (void *) uaddr, false);
-  return pte != NULL && *pte != 0 ? pte_get_page (*pte) : NULL;
+  return (pte != NULL && *pte != 0
+          ? (uint8_t *) pte_get_page (*pte) + pg_ofs (uaddr)
+          : NULL);
 }
 
 /* Clears any mapping for user virtual address UPAGE in page
@@ -185,15 +187,23 @@ pagedir_activate (uint32_t *pd)
 {
   if (pd == NULL)
     pd = base_page_dir;
-  asm volatile ("movl %0,%%cr3" :: "r" (vtop (pd)));
+
+  /* Store the physical address of the page directory into CR3
+     aka PDBR (page directory base register).  This activates our
+     new page tables immediately.  See [IA32-v2a] "MOV--Move
+     to/from Control Registers" and [IA32-v3] 3.7.5. */
+  asm volatile ("mov %%cr3, %0" :: "r" (vtop (pd)));
 }
 
 /* Returns the currently active page directory. */
 static uint32_t *
 active_pd (void) 
 {
+  /* Copy CR3, the page directory base register (PDBR), into
+     `pd'.
+     See [IA32-v2a] "MOV--Move to/from Control Registers" and
+     [IA32-v3] 3.7.5. */
   uint32_t *pd;
-
-  asm ("movl %%cr3,%0" : "=r" (pd));
+  asm ("mov %0, %%cr3" : "=r" (pd));
   return pd;
 }