mem: Multi Level Page Table bug fix
authorAlexandru Dutu <alexandru.dutu@amd.com>
Mon, 24 Nov 2014 02:01:09 +0000 (18:01 -0800)
committerAlexandru Dutu <alexandru.dutu@amd.com>
Mon, 24 Nov 2014 02:01:09 +0000 (18:01 -0800)
The multi level page table was giving false positives for already mapped
translations. This patch fixes the bogus behavior.

src/mem/multi_level_page_table_impl.hh

index 063e097c5863aead384776e07252d28eb4d3ba5c..3d8cbe75dd9907b32fdd4ef65523f5ec772c842b 100644 (file)
@@ -151,14 +151,13 @@ MultiLevelPageTable<ISAOps>::map(Addr vaddr, Addr paddr,
         if (walk(vaddr, true, PTE_addr)) {
             PageTableEntry PTE = p.read<PageTableEntry>(PTE_addr);
             Addr entry_paddr = pTableISAOps.getPnum(PTE);
-            if (!clobber && entry_paddr == 0) {
-                pTableISAOps.setPnum(PTE, paddr >> PageShift);
-                pTableISAOps.setPTEFields(PTE);
-                p.write<PageTableEntry>(PTE_addr, PTE);
-                DPRINTF(MMU, "New mapping: %#x-%#x\n", vaddr, paddr);
-            } else {
+            if (!clobber && entry_paddr != 0) {
                 fatal("addr 0x%x already mapped to %x", vaddr, entry_paddr);
             }
+            pTableISAOps.setPnum(PTE, paddr >> PageShift);
+            pTableISAOps.setPTEFields(PTE);
+            p.write<PageTableEntry>(PTE_addr, PTE);
+            DPRINTF(MMU, "New mapping: %#x-%#x\n", vaddr, paddr);
 
             eraseCacheEntry(vaddr);
             updateCache(vaddr, TlbEntry(pid, vaddr, paddr));