]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - kernel/mem/pagetable.cc
update
[polintos/scott/priv.git] / kernel / mem / pagetable.cc
index 5a0412678a1079fc77ba632a6daf9d6145fc34f0..2eb7e6996447f138ca7b5e41bcf9b12caa98e8c9 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <kern/mem.h>
 #include <kern/pagealloc.h>
-#include <kern/pagetable.h>
+#include <kern/generic-pagetable.h>
 #include <kern/generic-pte.h>
 #include <lowlevel/atomic.h>
 #include <util/misc.h>
@@ -157,7 +157,8 @@ namespace Mem {
                        PTE newpte = PTE::addr_to_pte(region.offset) | flags;
                        PTE oldpte = newpte.xchg_pte(ptable, i);
 
-                       retain_if_phys(region.offset);
+                       if (!newpte.addronly_pte())
+                               retain_if_phys(region.offset);
 
                        if (oldpte) {
                                // vaddr is only for process aspaces, so don't worry
@@ -167,7 +168,8 @@ namespace Mem {
                                              ((i - start) << PTE::page_shift);
                        
                                kill_pte(vaddr, oldpte.pte_to_addr(),
-                                        oldpte.dirty_pte(), oldpte.valid_pte());
+                                        oldpte.dirty_pte(), oldpte.valid_pte(),
+                                        oldpte.addronly_pte());
                        } else {
                                page->retain();
                        }
@@ -250,7 +252,8 @@ namespace Mem {
                                                      ((i - start) << PTE::page_shift);
                                
                                        kill_pte(vaddr, oldpte.pte_to_addr(),
-                                                oldpte.dirty_pte(), oldpte.valid_pte());
+                                                oldpte.dirty_pte(), oldpte.valid_pte(),
+                                                oldpte.addronly_pte());
                                }
        
                                assert(page->inuse.refcount > 1);