Gabe Black has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/55811 )
(
11 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the
submitted one.
)Change subject: arch-x86: Tidy up the page table walker stepWalk method.
......................................................................
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.pore...@amd.com>
Maintainer: Gabe Black <gabe.bl...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/x86/pagetable_walker.cc
1 file changed, 45 insertions(+), 39 deletions(-)
Approvals:
Matthew Poremba: Looks good to me, approved
Gabe Black: Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/arch/x86/pagetable_walker.cc
b/src/arch/x86/pagetable_walker.cc
index 15c3a1e..47be278 100644
--- a/src/arch/x86/pagetable_walker.cc
+++ b/src/arch/x86/pagetable_walker.cc
@@ -299,9 +299,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
// 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 @@
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;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/55811
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I1cf7307760b2534e90bea1276110ecb005ec6471
Gerrit-Change-Number: 55811
Gerrit-PatchSet: 14
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Bradford Beckmann <bradford.beckm...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Matt Sinclair <mattdsincl...@gmail.com>
Gerrit-Reviewer: Matthew Poremba <matthew.pore...@amd.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s