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:
Gabe Black
2022-01-23 08:01:12 -08:00
parent ea6a659adc
commit 145a6c3ef4

View File

@@ -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;