Merge zizzer.eecs.umich.edu:/z/m5/Bitkeeper/newmem
into zizzer.eecs.umich.edu:/tmp/newmem --HG-- extra : convert_revision : e0721f59cce9cb356b53977e21bd4a7c779c217d
This commit is contained in:
commit
c5a946efea
2 changed files with 24 additions and 14 deletions
|
@ -90,8 +90,6 @@ PageTable::page_check(Addr addr, int64_t size) const
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
PageTable::allocate(Addr vaddr, int64_t size)
|
||||
{
|
||||
|
@ -109,12 +107,7 @@ 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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,16 +119,16 @@ PageTable::translate(Addr vaddr, Addr &paddr)
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -145,6 +138,7 @@ PageTable::translate(Addr vaddr, Addr &paddr)
|
|||
return false;
|
||||
}
|
||||
|
||||
updateCache(page_addr, iter->second);
|
||||
paddr = iter->second + pageOffset(vaddr);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -95,6 +95,22 @@ class PageTable
|
|||
*/
|
||||
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);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue