X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=kernel%2Fmem%2Fpagetable.cc;h=2eb7e6996447f138ca7b5e41bcf9b12caa98e8c9;hp=93a7caed263e2111c2cb8f4c8ec2c9acd062c5fb;hb=1ac390fe1e18444008857b056c947710be9621a8;hpb=223354cf6f772fe854996a22e776b3fa83490f44 diff --git a/kernel/mem/pagetable.cc b/kernel/mem/pagetable.cc index 93a7cae..2eb7e69 100644 --- a/kernel/mem/pagetable.cc +++ b/kernel/mem/pagetable.cc @@ -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 . // -// 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 #include -#include +#include #include #include #include @@ -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);