diff options
author | Kevin Lim <ktlim@umich.edu> | 2006-07-05 13:22:46 -0400 |
---|---|---|
committer | Kevin Lim <ktlim@umich.edu> | 2006-07-05 13:22:46 -0400 |
commit | c33b5b3fc469e8f4885254122e60d781dcb11687 (patch) | |
tree | 4983720f62cd4fc1ee57690678228e5aca75d531 /src/mem/page_table.cc | |
parent | 77d0c0e28ac842e06e20a7861daf8a791680d797 (diff) | |
parent | 0fbecab797ffe7fc68e3a9af9fd0a21df37ec635 (diff) | |
download | gem5-c33b5b3fc469e8f4885254122e60d781dcb11687.tar.xz |
Merge ktlim@zamp:/z/ktlim2/clean/newmem-merge
into zamp.eecs.umich.edu:/z/ktlim2/clean/newmem
--HG--
extra : convert_revision : 20e45bec8c3911a6389a89e2d193aa1de867c89e
Diffstat (limited to 'src/mem/page_table.cc')
-rw-r--r-- | src/mem/page_table.cc | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/mem/page_table.cc b/src/mem/page_table.cc index 7daf31900..a34a0393a 100644 --- a/src/mem/page_table.cc +++ b/src/mem/page_table.cc @@ -54,6 +54,9 @@ PageTable::PageTable(System *_system, Addr _pageSize) system(_system) { assert(isPowerOf2(pageSize)); + pTableCache[0].vaddr = 0; + pTableCache[1].vaddr = 0; + pTableCache[2].vaddr = 0; } PageTable::~PageTable() @@ -95,7 +98,7 @@ PageTable::allocate(Addr vaddr, int size) assert(pageOffset(vaddr) == 0); for (; size > 0; size -= pageSize, vaddr += pageSize) { - std::map<Addr,Addr>::iterator iter = pTable.find(vaddr); + m5::hash_map<Addr,Addr>::iterator iter = pTable.find(vaddr); if (iter != pTable.end()) { // already mapped @@ -103,6 +106,12 @@ PageTable::allocate(Addr vaddr, int 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; } } @@ -112,7 +121,22 @@ bool PageTable::translate(Addr vaddr, Addr &paddr) { Addr page_addr = pageAlign(vaddr); - std::map<Addr,Addr>::iterator iter = pTable.find(page_addr); + paddr = 0; + + if (pTableCache[0].vaddr == vaddr) { + paddr = pTableCache[0].paddr; + return true; + } + if (pTableCache[1].vaddr == vaddr) { + paddr = pTableCache[1].paddr; + return true; + } + if (pTableCache[2].vaddr == vaddr) { + paddr = pTableCache[2].paddr; + return true; + } + + m5::hash_map<Addr,Addr>::iterator iter = pTable.find(page_addr); if (iter == pTable.end()) { return false; |