}
-
-
void
PageTable::allocate(Addr vaddr, int64_t size)
{
}
pTable[vaddr] = system->new_page();
- pTableCache[2].paddr = pTableCache[1].paddr;
- pTableCache[2].vaddr = pTableCache[1].vaddr;
- pTableCache[1].paddr = pTableCache[0].paddr;
- pTableCache[1].vaddr = pTableCache[0].vaddr;
- pTableCache[0].paddr = pTable[vaddr];
- pTableCache[0].vaddr = vaddr;
+ updateCache(vaddr, pTable[vaddr]);
}
}
Addr page_addr = pageAlign(vaddr);
paddr = 0;
- if (pTableCache[0].vaddr == vaddr) {
- paddr = pTableCache[0].paddr;
+ if (pTableCache[0].vaddr == page_addr) {
+ paddr = pTableCache[0].paddr + pageOffset(vaddr);
return true;
}
- if (pTableCache[1].vaddr == vaddr) {
- paddr = pTableCache[1].paddr;
+ if (pTableCache[1].vaddr == page_addr) {
+ paddr = pTableCache[1].paddr + pageOffset(vaddr);
return true;
}
- if (pTableCache[2].vaddr == vaddr) {
- paddr = pTableCache[2].paddr;
+ if (pTableCache[2].vaddr == page_addr) {
+ paddr = pTableCache[2].paddr + pageOffset(vaddr);
return true;
}
return false;
}
+ updateCache(page_addr, iter->second);
paddr = iter->second + pageOffset(vaddr);
return true;
}
*/
Fault translate(RequestPtr &req);
+ /**
+ * Update the page table cache.
+ * @param vaddr virtual address (page aligned) to check
+ * @param paddr physical address (page aligned) to return
+ */
+ inline void updateCache(Addr vaddr, Addr paddr)
+ {
+ pTableCache[2].paddr = pTableCache[1].paddr;
+ pTableCache[2].vaddr = pTableCache[1].vaddr;
+ pTableCache[1].paddr = pTableCache[0].paddr;
+ pTableCache[1].vaddr = pTableCache[0].vaddr;
+ pTableCache[0].paddr = paddr;
+ pTableCache[0].vaddr = vaddr;
+ }
+
+
void serialize(std::ostream &os);
void unserialize(Checkpoint *cp, const std::string §ion);
};