]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - kernel/mem/pagetable.cc
update
[polintos/scott/priv.git] / kernel / mem / pagetable.cc
index 93a7caed263e2111c2cb8f4c8ec2c9acd062c5fb..2eb7e6996447f138ca7b5e41bcf9b12caa98e8c9 100644 (file)
@@ -1,4 +1,5 @@
 // mem/pagetable.cc -- Generic page table implementation
+//
 // Most architectures should be able to use this as is, though
 // architectures with weird paging hardware can provide their own implementation.
 //
@@ -7,35 +8,19 @@
 //
 // This software is copyright (c) 2006 Scott Wood <scott@buserror.net>.
 // 
-// Permission is hereby granted, free of charge, to any person obtaining a copy of
-// this software and associated documentation files (the "Software"), to deal with
-// the Software without restriction, including without limitation the rights to
-// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-// of the Software, and to permit persons to whom the Software is furnished to do
-// so, subject to the following conditions:
-// 
-//     * Redistributions of source code must retain the above copyright notice,
-//       this list of conditions and the following disclaimers.
-// 
-//     * Redistributions in binary form must reproduce the above copyright notice,
-//       this list of conditions and the following disclaimers in the
-//       documentation and/or other materials provided with the distribution.
-// 
-//     * The names of the Software's authors and/or contributors
-//       may not be used to endorse or promote products derived from
-//       this Software without specific prior written permission.
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors or contributors be held liable for any damages
+// arising from the use of this software.
 // 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-// SOFTWARE.
+// Permission is hereby granted to everyone, free of charge, to use, copy,
+// modify, prepare derivative works of, publish, distribute, perform,
+// sublicense, and/or sell copies of the Software, provided that the above
+// copyright notice and disclaimer of warranty be included in all copies or
+// substantial portions of this software.
 
 #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>
@@ -172,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
@@ -182,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();
                        }
@@ -265,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);