Comments.
[pintos-anon] / src / userprog / pagedir.c
index 7c392e61d5fee657b773b879ca4377bce1d62e32..000aefea700be64ded51049debd81ffae0199328 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
@@ -168,23 +170,14 @@ pagedir_test_accessed (uint32_t *pd, const void *upage)
   return pte != NULL && (*pte & PG_A) != 0;
 }
 
-/* Returns true if the PTE for user virtual page UPAGE in PD has
-   been accessed recently, and then resets the accessed bit for
-   that page.
-   Returns false and has no effect if PD contains no PDE for
-   UPAGE. */
-bool
-pagedir_test_accessed_and_clear (uint32_t *pd, const void *upage) 
+/* Resets the accessed bit in the PTE for user virtual page UPAGE
+   in PD. */
+void
+pagedir_clear_accessed (uint32_t *pd, const void *upage) 
 {
   uint32_t *pte = lookup_page (pd, (void *) upage, false);
   if (pte != NULL) 
-    {
-      bool accessed = (*pte & PG_A) != 0;
-      *pte &= ~(uint32_t) PG_A;
-      return accessed;
-    }
-  else
-    return false;
+    *pte &= ~(uint32_t) PG_A;
 }
 
 /* Loads page directory PD into the CPU's page directory base
@@ -194,6 +187,11 @@ pagedir_activate (uint32_t *pd)
 {
   if (pd == NULL)
     pd = base_page_dir;
+
+  /* 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 ("movl %0,%%cr3" :: "r" (vtop (pd)));
 }
 
@@ -203,6 +201,9 @@ active_pd (void)
 {
   uint32_t *pd;
 
+  /* Copy CR3, the page directory base register (PDBR), into `pd'
+     for us to exmaine.  See [IA32-v2a] "MOV--Move to/from
+     Control Registers" and [IA32-v3] 3.7.5. */
   asm ("movl %%cr3,%0" : "=r" (pd));
   return pd;
 }