arch-x86: Tidy up the page table walker stepWalk method.
Use the mbits function to avoid ugly manual masking and shifting. Also remove some unnecessary casts when DPRINTF-ing PTEs. Change-Id: I1cf7307760b2534e90bea1276110ecb005ec6471 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/55811 Reviewed-by: Matthew Poremba <matthew.poremba@amd.com> Maintainer: Gabe Black <gabe.black@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -299,9 +299,8 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
bool badNX = pte.nx && mode == BaseMMU::Execute && enableNX;
|
||||
switch(state) {
|
||||
case LongPML4:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got long mode PML4 entry %#016x.\n", (uint64_t)pte);
|
||||
nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl3 * dataSize;
|
||||
DPRINTF(PageTableWalker, "Got long mode PML4 entry %#016x.\n", pte);
|
||||
nextRead = mbits(pte, 51, 12) + vaddr.longl3 * dataSize;
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = pte.w;
|
||||
@@ -315,9 +314,8 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
nextState = LongPDP;
|
||||
break;
|
||||
case LongPDP:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got long mode PDP entry %#016x.\n", (uint64_t)pte);
|
||||
nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl2 * dataSize;
|
||||
DPRINTF(PageTableWalker, "Got long mode PDP entry %#016x.\n", pte);
|
||||
nextRead = mbits(pte, 51, 12) + vaddr.longl2 * dataSize;
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = entry.writable && pte.w;
|
||||
@@ -330,8 +328,7 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
nextState = LongPD;
|
||||
break;
|
||||
case LongPD:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got long mode PD entry %#016x.\n", (uint64_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got long mode PD entry %#016x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = entry.writable && pte.w;
|
||||
@@ -344,25 +341,23 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
if (!pte.ps) {
|
||||
// 4 KB page
|
||||
entry.logBytes = 12;
|
||||
nextRead =
|
||||
((uint64_t)pte & (mask(40) << 12)) + vaddr.longl1 * dataSize;
|
||||
nextRead = mbits(pte, 51, 12) + vaddr.longl1 * dataSize;
|
||||
nextState = LongPTE;
|
||||
break;
|
||||
} else {
|
||||
// 2 MB page
|
||||
entry.logBytes = 21;
|
||||
entry.paddr = (uint64_t)pte & (mask(31) << 21);
|
||||
entry.paddr = mbits(pte, 51, 21);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 12);
|
||||
entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 63, 21);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
}
|
||||
case LongPTE:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got long mode PTE entry %#016x.\n", (uint64_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got long mode PTE entry %#016x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = entry.writable && pte.w;
|
||||
@@ -372,18 +367,18 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
fault = pageFault(pte.p);
|
||||
break;
|
||||
}
|
||||
entry.paddr = (uint64_t)pte & (mask(40) << 12);
|
||||
entry.paddr = mbits(pte, 51, 12);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 12);
|
||||
entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 63, 12);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
case PAEPDP:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PAE PDP entry %#08x.\n", (uint32_t)pte);
|
||||
nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.pael2 * dataSize;
|
||||
"Got legacy mode PAE PDP entry %#08x.\n", pte);
|
||||
nextRead = mbits(pte, 51, 12) + vaddr.pael2 * dataSize;
|
||||
if (!pte.p) {
|
||||
doEndWalk = true;
|
||||
fault = pageFault(pte.p);
|
||||
@@ -392,8 +387,7 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
nextState = PAEPD;
|
||||
break;
|
||||
case PAEPD:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PAE PD entry %#08x.\n", (uint32_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got legacy mode PAE PD entry %#08x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = pte.w;
|
||||
@@ -406,24 +400,24 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
if (!pte.ps) {
|
||||
// 4 KB page
|
||||
entry.logBytes = 12;
|
||||
nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.pael1 * dataSize;
|
||||
nextRead = mbits(pte, 51, 12) + vaddr.pael1 * dataSize;
|
||||
nextState = PAEPTE;
|
||||
break;
|
||||
} else {
|
||||
// 2 MB page
|
||||
entry.logBytes = 21;
|
||||
entry.paddr = (uint64_t)pte & (mask(31) << 21);
|
||||
entry.paddr = mbits(pte, 51, 21);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 12);
|
||||
entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 63, 21);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
}
|
||||
case PAEPTE:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PAE PTE entry %#08x.\n", (uint32_t)pte);
|
||||
"Got legacy mode PAE PTE entry %#08x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = entry.writable && pte.w;
|
||||
@@ -433,17 +427,16 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
fault = pageFault(pte.p);
|
||||
break;
|
||||
}
|
||||
entry.paddr = (uint64_t)pte & (mask(40) << 12);
|
||||
entry.paddr = mbits(pte, 51, 12);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 7);
|
||||
entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 63, 12);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
case PSEPD:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PSE PD entry %#08x.\n", (uint32_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got legacy mode PSE PD entry %#08x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = pte.w;
|
||||
@@ -456,25 +449,23 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
if (!pte.ps) {
|
||||
// 4 KB page
|
||||
entry.logBytes = 12;
|
||||
nextRead =
|
||||
((uint64_t)pte & (mask(20) << 12)) + vaddr.norml2 * dataSize;
|
||||
nextRead = mbits(pte, 31, 12) + vaddr.norml2 * dataSize;
|
||||
nextState = PTE;
|
||||
break;
|
||||
} else {
|
||||
// 4 MB page
|
||||
entry.logBytes = 21;
|
||||
entry.paddr = bits(pte, 20, 13) << 32 | bits(pte, 31, 22) << 22;
|
||||
entry.paddr = bits(pte, 20, 13) << 32 | mbits(pte, 31, 22);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 12);
|
||||
entry.vaddr = entry.vaddr & ~((4 * (1 << 20)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 63, 22);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
}
|
||||
case PD:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PD entry %#08x.\n", (uint32_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got legacy mode PD entry %#08x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = pte.w;
|
||||
@@ -486,12 +477,11 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
}
|
||||
// 4 KB page
|
||||
entry.logBytes = 12;
|
||||
nextRead = ((uint64_t)pte & (mask(20) << 12)) + vaddr.norml2 * dataSize;
|
||||
nextRead = mbits(pte, 31, 12) + vaddr.norml2 * dataSize;
|
||||
nextState = PTE;
|
||||
break;
|
||||
case PTE:
|
||||
DPRINTF(PageTableWalker,
|
||||
"Got legacy mode PTE entry %#08x.\n", (uint32_t)pte);
|
||||
DPRINTF(PageTableWalker, "Got legacy mode PTE entry %#08x.\n", pte);
|
||||
doWrite = !pte.a;
|
||||
pte.a = 1;
|
||||
entry.writable = pte.w;
|
||||
@@ -501,11 +491,11 @@ Walker::WalkerState::stepWalk(PacketPtr &write)
|
||||
fault = pageFault(pte.p);
|
||||
break;
|
||||
}
|
||||
entry.paddr = (uint64_t)pte & (mask(20) << 12);
|
||||
entry.paddr = mbits(pte, 31, 12);
|
||||
entry.uncacheable = uncacheable;
|
||||
entry.global = pte.g;
|
||||
entry.patBit = bits(pte, 7);
|
||||
entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
|
||||
entry.vaddr = mbits(entry.vaddr, 31, 12);
|
||||
doTLBInsert = true;
|
||||
doEndWalk = true;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user