Giacomo Travaglini has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/52007 )
Change subject: arch-arm: Expose LookupLevel enum to the python world
......................................................................
arch-arm: Expose LookupLevel enum to the python world
Our goal is to make it a SimObject Param
Change-Id: I90673fada66f59d4a90354660d2513a39c0ccba5
Signed-off-by: Giacomo Travaglini <[email protected]>
---
M src/arch/arm/ArmTLB.py
M src/arch/arm/mmu.hh
M src/arch/arm/pagetable.cc
M src/arch/arm/pagetable.hh
M src/arch/arm/tlb.hh
M src/arch/arm/table_walker.cc
M src/arch/arm/table_walker.hh
7 files changed, 143 insertions(+), 120 deletions(-)
diff --git a/src/arch/arm/ArmTLB.py b/src/arch/arm/ArmTLB.py
index e2d61e4..b01494b 100644
--- a/src/arch/arm/ArmTLB.py
+++ b/src/arch/arm/ArmTLB.py
@@ -40,6 +40,9 @@
from m5.proxy import *
from m5.objects.BaseTLB import BaseTLB
+class ArmLookupLevel(Enum):
+ vals = [ "L0", "L1", "L2", "L3" ]
+
class ArmTLB(BaseTLB):
type = 'ArmTLB'
cxx_class = 'gem5::ArmISA::TLB'
diff --git a/src/arch/arm/mmu.hh b/src/arch/arm/mmu.hh
index 9391612..2d0ef7b 100644
--- a/src/arch/arm/mmu.hh
+++ b/src/arch/arm/mmu.hh
@@ -45,6 +45,8 @@
#include "arch/arm/tlb.hh"
#include "arch/generic/mmu.hh"
+#include "enums/ArmLookupLevel.hh"
+
#include "params/ArmMMU.hh"
namespace gem5
@@ -57,6 +59,8 @@
class MMU : public BaseMMU
{
protected:
+ using LookupLevel = enums::ArmLookupLevel;
+
ArmISA::TLB *
getDTBPtr() const
{
diff --git a/src/arch/arm/pagetable.cc b/src/arch/arm/pagetable.cc
index 506b615..0834e7b 100644
--- a/src/arch/arm/pagetable.cc
+++ b/src/arch/arm/pagetable.cc
@@ -130,16 +130,16 @@
}
}
-LookupLevel
+V7LPageTableOps::LookupLevel
V7LPageTableOps::firstLevel(uint8_t tsz) const
{
- return L1;
+ return LookupLevel::L1;
}
-LookupLevel
+V7LPageTableOps::LookupLevel
V7LPageTableOps::lastLevel() const
{
- return L3;
+ return LookupLevel::L3;
}
bool
@@ -224,31 +224,31 @@
}
}
-LookupLevel
+V8PageTableOps4k::LookupLevel
V8PageTableOps4k::firstLevel(uint8_t tsz) const
{
- if (tsz >= 16 && tsz <= 24) return L0;
- if (tsz >= 25 && tsz <= 33) return L1;
- if (tsz >= 34 && tsz <= 39) return L2;
+ if (tsz >= 16 && tsz <= 24) return LookupLevel::L0;
+ if (tsz >= 25 && tsz <= 33) return LookupLevel::L1;
+ if (tsz >= 34 && tsz <= 39) return LookupLevel::L2;
panic("Unsupported TnSZ: %d\n", tsz);
}
-LookupLevel
+V8PageTableOps4k::LookupLevel
V8PageTableOps4k::firstS2Level(uint8_t sl0) const
{
switch (sl0) {
- case 0: return L2;
- case 1: return L1;
- case 2: return L0;
+ case 0: return LookupLevel::L2;
+ case 1: return LookupLevel::L1;
+ case 2: return LookupLevel::L0;
default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
}
}
-LookupLevel
+V8PageTableOps4k::LookupLevel
V8PageTableOps4k::lastLevel() const
{
- return L3;
+ return LookupLevel::L3;
}
bool
@@ -335,32 +335,32 @@
}
}
-LookupLevel
+V8PageTableOps16k::LookupLevel
V8PageTableOps16k::firstLevel(uint8_t tsz) const
{
- if (tsz == 16) return L0;
- if (tsz >= 17 && tsz <= 27) return L1;
- if (tsz >= 28 && tsz <= 38) return L2;
- if (tsz == 39) return L3;
+ if (tsz == 16) return LookupLevel::L0;
+ if (tsz >= 17 && tsz <= 27) return LookupLevel::L1;
+ if (tsz >= 28 && tsz <= 38) return LookupLevel::L2;
+ if (tsz == 39) return LookupLevel::L3;
panic("Unsupported TnSZ: %d\n", tsz);
}
-LookupLevel
+V8PageTableOps16k::LookupLevel
V8PageTableOps16k::firstS2Level(uint8_t sl0) const
{
switch (sl0) {
- case 0: return L3;
- case 1: return L2;
- case 2: return L1;
+ case 0: return LookupLevel::L3;
+ case 1: return LookupLevel::L2;
+ case 2: return LookupLevel::L1;
default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
}
}
-LookupLevel
+V8PageTableOps16k::LookupLevel
V8PageTableOps16k::lastLevel() const
{
- return L3;
+ return LookupLevel::L3;
}
bool
@@ -439,31 +439,31 @@
}
}
-LookupLevel
+V8PageTableOps64k::LookupLevel
V8PageTableOps64k::firstLevel(uint8_t tsz) const
{
- if (tsz >= 12 && tsz <= 21) return L1;
- if (tsz >= 22 && tsz <= 34) return L2;
- if (tsz >= 35 && tsz <= 39) return L3;
+ if (tsz >= 12 && tsz <= 21) return LookupLevel::L1;
+ if (tsz >= 22 && tsz <= 34) return LookupLevel::L2;
+ if (tsz >= 35 && tsz <= 39) return LookupLevel::L3;
panic("Unsupported TnSZ: %d\n", tsz);
}
-LookupLevel
+V8PageTableOps64k::LookupLevel
V8PageTableOps64k::firstS2Level(uint8_t sl0) const
{
switch (sl0) {
- case 0: return L3;
- case 1: return L2;
- case 2: return L1;
+ case 0: return LookupLevel::L3;
+ case 1: return LookupLevel::L2;
+ case 2: return LookupLevel::L1;
default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
}
}
-LookupLevel
+V8PageTableOps64k::LookupLevel
V8PageTableOps64k::lastLevel() const
{
- return L3;
+ return LookupLevel::L3;
}
const PageTableOps *
diff --git a/src/arch/arm/pagetable.hh b/src/arch/arm/pagetable.hh
index 9bbf5af..bf4a5f7 100644
--- a/src/arch/arm/pagetable.hh
+++ b/src/arch/arm/pagetable.hh
@@ -48,6 +48,7 @@
#include "arch/arm/utility.hh"
#include "arch/generic/mmu.hh"
#include "enums/TypeTLB.hh"
+#include "enums/ArmLookupLevel.hh"
#include "sim/serialize.hh"
namespace gem5
@@ -56,16 +57,6 @@
namespace ArmISA
{
-// Lookup level
-enum LookupLevel
-{
- L0 = 0, // AArch64 only
- L1,
- L2,
- L3,
- MAX_LOOKUP_LEVELS
-};
-
// Granule sizes
enum GrainSize
{
@@ -98,6 +89,7 @@
struct PageTableOps
{
+ typedef enums::ArmLookupLevel LookupLevel;
typedef int64_t pte_t;
virtual bool isValid(pte_t pte, unsigned level) const = 0;
@@ -171,6 +163,8 @@
struct TlbEntry : public Serializable
{
public:
+ typedef enums::ArmLookupLevel LookupLevel;
+
enum class MemoryType : std::uint8_t
{
StronglyOrdered,
@@ -264,7 +258,8 @@
TlbEntry(Addr _asn, Addr _vaddr, Addr _paddr,
bool uncacheable, bool read_only) :
pfn(_paddr >> PageShift), size(PageBytes - 1), vpn(_vaddr >>
PageShift),
- attributes(0), lookupLevel(L1), asid(_asn), vmid(0), N(0),
+ attributes(0), lookupLevel(LookupLevel::L1),
+ asid(_asn), vmid(0), N(0),
innerAttrs(0), outerAttrs(0), ap(read_only ? 0x3 : 0), hap(0x3),
domain(DomainType::Client), mtype(MemoryType::StronglyOrdered),
longDescFormat(false), isHyp(false), global(false), valid(true),
@@ -280,8 +275,9 @@
}
TlbEntry() :
- pfn(0), size(0), vpn(0), attributes(0), lookupLevel(L1), asid(0),
- vmid(0), N(0), innerAttrs(0), outerAttrs(0), ap(0), hap(0x3),
+ pfn(0), size(0), vpn(0), attributes(0),
lookupLevel(LookupLevel::L1),
+ asid(0), vmid(0), N(0),
+ innerAttrs(0), outerAttrs(0), ap(0), hap(0x3),
domain(DomainType::Client), mtype(MemoryType::StronglyOrdered),
longDescFormat(false), isHyp(false), global(false), valid(false),
ns(true), nstid(true), el(EL0), type(TypeTLB::unified),
diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc
index 167b5d2..96170d3 100644
--- a/src/arch/arm/table_walker.cc
+++ b/src/arch/arm/table_walker.cc
@@ -239,8 +239,10 @@
TableWalker::completeDrain()
{
if (drainState() == DrainState::Draining &&
- stateQueues[L0].empty() && stateQueues[L1].empty() &&
- stateQueues[L2].empty() && stateQueues[L3].empty() &&
+ stateQueues[LookupLevel::L0].empty() &&
+ stateQueues[LookupLevel::L1].empty() &&
+ stateQueues[LookupLevel::L2].empty() &&
+ stateQueues[LookupLevel::L3].empty() &&
pendingQueue.empty()) {
DPRINTF(Drain, "TableWalker done draining, processing drain
event\n");
@@ -253,7 +255,7 @@
{
bool state_queues_not_empty = false;
- for (int i = 0; i < MAX_LOOKUP_LEVELS; ++i) {
+ for (int i = 0; i < LookupLevel::Num_ArmLookupLevel; ++i) {
if (!stateQueues[i].empty()) {
state_queues_not_empty = true;
break;
@@ -592,7 +594,7 @@
if (currState->isFetch)
return std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::VmsaTran);
else
@@ -600,7 +602,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1, isStage2,
+ ArmFault::TranslationLL + LookupLevel::L1, isStage2,
ArmFault::VmsaTran);
}
ttbr = currState->tc->readMiscReg(snsBankedIndex(
@@ -612,7 +614,7 @@
if (currState->isFetch)
return std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::VmsaTran);
else
@@ -620,7 +622,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1, isStage2,
+ ArmFault::TranslationLL + LookupLevel::L1, isStage2,
ArmFault::VmsaTran);
}
ttbr = ttbr1;
@@ -635,7 +637,7 @@
// Trickbox address check
Fault f;
f = testWalk(l1desc_addr, sizeof(uint32_t),
- TlbEntry::DomainType::NoAccess, L1, isStage2);
+ TlbEntry::DomainType::NoAccess, LookupLevel::L1,
isStage2);
if (f) {
DPRINTF(TLB, "Trickbox check caused fault on %#x\n",
currState->vaddr_tainted);
if (currState->timing) {
@@ -660,7 +662,8 @@
bool delayed;
delayed = fetchDescriptor(l1desc_addr,
(uint8_t*)&currState->l1Desc.data,
- sizeof(uint32_t), flag, L1, &doL1DescEvent,
+ sizeof(uint32_t), flag, LookupLevel::L1,
+ &doL1DescEvent,
&TableWalker::doL1Descriptor);
if (!delayed) {
f = currState->fault;
@@ -674,7 +677,7 @@
{
Addr ttbr, ttbr0_max, ttbr1_min, desc_addr;
int tsz, n;
- LookupLevel start_lookup_level = L1;
+ LookupLevel start_lookup_level = LookupLevel::L1;
DPRINTF(TLB, "Beginning table walk for address %#x, TTBCR: %#x\n",
currState->vaddr_tainted, currState->ttbcr);
@@ -691,7 +694,8 @@
DPRINTF(TLB, " - Selecting VTTBR (long-desc.)\n");
ttbr = currState->tc->readMiscReg(MISCREG_VTTBR);
tsz = sext<4>(currState->vtcr.t0sz);
- start_lookup_level = currState->vtcr.sl0 ? L1 : L2;
+ start_lookup_level = currState->vtcr.sl0 ?
+ LookupLevel::L1 : LookupLevel::L2;
currState->isUncacheable = currState->vtcr.irgn0 == 0;
} else if (currState->isHyp) {
DPRINTF(TLB, " - Selecting HTTBR (long-desc.)\n");
@@ -727,7 +731,7 @@
if (currState->isFetch)
return std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::LpaeTran);
else
@@ -735,7 +739,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::LpaeTran);
}
@@ -744,7 +748,7 @@
tsz = currState->ttbcr.t0sz;
currState->isUncacheable = currState->ttbcr.irgn0 == 0;
if (ttbr0_max < (1ULL << 30)) // Upper limit < 1 GiB
- start_lookup_level = L2;
+ start_lookup_level = LookupLevel::L2;
} else if (currState->vaddr >= ttbr1_min) {
DPRINTF(TLB, " - Selecting TTBR1 (long-desc.)\n");
// Check if table walk is allowed
@@ -752,7 +756,7 @@
if (currState->isFetch)
return std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::LpaeTran);
else
@@ -760,7 +764,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::LpaeTran);
}
@@ -770,13 +774,13 @@
currState->isUncacheable = currState->ttbcr.irgn1 == 0;
// Lower limit >= 3 GiB
if (ttbr1_min >= (1ULL << 31) + (1ULL << 30))
- start_lookup_level = L2;
+ start_lookup_level = LookupLevel::L2;
} else {
// Out of boundaries -> translation fault
if (currState->isFetch)
return std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::LpaeTran);
else
@@ -784,14 +788,14 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2, ArmFault::LpaeTran);
}
}
// Perform lookup (ARM ARM issue C B3.6.6)
- if (start_lookup_level == L1) {
+ if (start_lookup_level == LookupLevel::L1) {
n = 5 - tsz;
desc_addr = mbits(ttbr, 39, n) |
(bits(currState->vaddr, n + 26, 30) << 3);
@@ -888,7 +892,7 @@
currState->tcr,
currState->el);
- LookupLevel start_lookup_level = MAX_LOOKUP_LEVELS;
+ LookupLevel start_lookup_level = LookupLevel::Num_ArmLookupLevel;
bool vaddr_fault = false;
switch (currState->el) {
case EL0:
@@ -953,7 +957,7 @@
start_lookup_level = getPageTableOps(tg)->firstS2Level(
currState->vtcr.sl0);
- panic_if(start_lookup_level == MAX_LOOKUP_LEVELS,
+ panic_if(start_lookup_level == LookupLevel::Num_ArmLookupLevel,
"Cannot discern lookup level from vtcr.{sl0,tg0}");
ps = currState->vtcr.ps;
currState->isUncacheable = currState->vtcr.irgn0 == 0;
@@ -1059,14 +1063,14 @@
if (currState->isFetch)
f = std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L0, isStage2,
+ ArmFault::TranslationLL + LookupLevel::L0, isStage2,
ArmFault::LpaeTran);
else
f = std::make_shared<DataAbort>(
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L0,
+ ArmFault::TranslationLL + LookupLevel::L0,
isStage2, ArmFault::LpaeTran);
if (currState->timing) {
@@ -1088,11 +1092,11 @@
}
// Determine starting lookup level
- if (start_lookup_level == MAX_LOOKUP_LEVELS) {
+ if (start_lookup_level == LookupLevel::Num_ArmLookupLevel) {
const auto* ptops = getPageTableOps(tg);
start_lookup_level = ptops->firstLevel(64 - tsz);
- panic_if(start_lookup_level == MAX_LOOKUP_LEVELS,
+ panic_if(start_lookup_level == LookupLevel::Num_ArmLookupLevel,
"Table walker couldn't find lookup level\n");
}
@@ -1660,7 +1664,7 @@
currState->fault =
std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L1,
+ ArmFault::TranslationLL + LookupLevel::L1,
isStage2,
ArmFault::VmsaTran);
else
@@ -1669,7 +1673,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L1, isStage2,
+ ArmFault::TranslationLL + LookupLevel::L1, isStage2,
ArmFault::VmsaTran);
return;
case L1Descriptor::Section:
@@ -1683,7 +1687,7 @@
currState->vaddr_tainted,
currState->l1Desc.domain(),
is_atomic ? false : currState->isWrite,
- ArmFault::AccessFlagLL + L1,
+ ArmFault::AccessFlagLL + LookupLevel::L1,
isStage2,
ArmFault::VmsaTran);
}
@@ -1702,8 +1706,8 @@
// Trickbox address check
currState->fault = testWalk(l2desc_addr, sizeof(uint32_t),
- currState->l1Desc.domain(), L2,
- isStage2);
+ currState->l1Desc.domain(),
+ LookupLevel::L2, isStage2);
if (currState->fault) {
if (!currState->timing) {
@@ -1893,10 +1897,10 @@
(LookupLevel) (currState->longDesc.lookupLevel + 1);
Event *event = NULL;
switch (L) {
- case L1:
+ case LookupLevel::L1:
assert(currState->aarch64);
- case L2:
- case L3:
+ case LookupLevel::L2:
+ case LookupLevel::L3:
event = LongDescEventByLevel[L];
break;
default:
@@ -1943,14 +1947,14 @@
if (currState->isFetch)
currState->fault = std::make_shared<PrefetchAbort>(
currState->vaddr_tainted,
- ArmFault::TranslationLL + L2,
+ ArmFault::TranslationLL + LookupLevel::L2,
isStage2,
ArmFault::VmsaTran);
else
currState->fault = std::make_shared<DataAbort>(
currState->vaddr_tainted, currState->l1Desc.domain(),
is_atomic ? false : currState->isWrite,
- ArmFault::TranslationLL + L2,
+ ArmFault::TranslationLL + LookupLevel::L2,
isStage2,
ArmFault::VmsaTran);
return;
@@ -1967,7 +1971,7 @@
currState->vaddr_tainted,
TlbEntry::DomainType::NoAccess,
is_atomic ? false : currState->isWrite,
- ArmFault::AccessFlagLL + L2, isStage2,
+ ArmFault::AccessFlagLL + LookupLevel::L2, isStage2,
ArmFault::VmsaTran);
}
@@ -1977,7 +1981,7 @@
void
TableWalker::doL1DescriptorWrapper()
{
- currState = stateQueues[L1].front();
+ currState = stateQueues[LookupLevel::L1].front();
currState->delayed = false;
// if there's a stage2 translation object we don't need it any more
if (currState->stage2Tran) {
@@ -1995,7 +1999,7 @@
currState->vaddr_tainted);
doL1Descriptor();
- stateQueues[L1].pop_front();
+ stateQueues[LookupLevel::L1].pop_front();
// Check if fault was generated
if (currState->fault != NoFault) {
currState->transState->finish(currState->fault, currState->req,
@@ -2031,7 +2035,7 @@
delete currState;
} else {
// need to do L2 descriptor
- stateQueues[L2].push_back(currState);
+ stateQueues[LookupLevel::L2].push_back(currState);
}
currState = NULL;
}
@@ -2039,7 +2043,7 @@
void
TableWalker::doL2DescriptorWrapper()
{
- currState = stateQueues[L2].front();
+ currState = stateQueues[LookupLevel::L2].front();
assert(currState->delayed);
// if there's a stage2 translation object we don't need it any more
if (currState->stage2Tran) {
@@ -2068,7 +2072,7 @@
}
- stateQueues[L2].pop_front();
+ stateQueues[LookupLevel::L2].pop_front();
pending = false;
nextWalk(currState->tc);
@@ -2083,25 +2087,25 @@
void
TableWalker::doL0LongDescriptorWrapper()
{
- doLongDescriptorWrapper(L0);
+ doLongDescriptorWrapper(LookupLevel::L0);
}
void
TableWalker::doL1LongDescriptorWrapper()
{
- doLongDescriptorWrapper(L1);
+ doLongDescriptorWrapper(LookupLevel::L1);
}
void
TableWalker::doL2LongDescriptorWrapper()
{
- doLongDescriptorWrapper(L2);
+ doLongDescriptorWrapper(LookupLevel::L2);
}
void
TableWalker::doL3LongDescriptorWrapper()
{
- doLongDescriptorWrapper(L3);
+ doLongDescriptorWrapper(LookupLevel::L3);
}
void
@@ -2154,7 +2158,7 @@
currState->delayed = false;
delete currState;
} else {
- if (curr_lookup_level >= MAX_LOOKUP_LEVELS - 1)
+ if (curr_lookup_level >= LookupLevel::Num_ArmLookupLevel - 1)
panic("Max. number of lookups already reached in table
walk\n");
// Need to perform additional lookups
stateQueues[currState->longDesc.lookupLevel].push_back(currState);
@@ -2321,16 +2325,16 @@
}
}
-LookupLevel
+TableWalker::LookupLevel
TableWalker::toLookupLevel(uint8_t lookup_level_as_int)
{
switch (lookup_level_as_int) {
- case L1:
- return L1;
- case L2:
- return L2;
- case L3:
- return L3;
+ case LookupLevel::L1:
+ return LookupLevel::L1;
+ case LookupLevel::L2:
+ return LookupLevel::L2;
+ case LookupLevel::L3:
+ return LookupLevel::L3;
default:
panic("Invalid lookup level conversion");
}
diff --git a/src/arch/arm/table_walker.hh b/src/arch/arm/table_walker.hh
index 5635934..e16bff7 100644
--- a/src/arch/arm/table_walker.hh
+++ b/src/arch/arm/table_walker.hh
@@ -65,13 +65,15 @@
class TableWalker : public ClockedObject
{
+ using LookupLevel = enums::ArmLookupLevel;
+
public:
class WalkerState;
class DescriptorBase
{
public:
- DescriptorBase() : lookupLevel(L0) {}
+ DescriptorBase() : lookupLevel(LookupLevel::L0) {}
/** Current lookup level for this descriptor */
LookupLevel lookupLevel;
@@ -117,7 +119,7 @@
/** Default ctor */
L1Descriptor() : data(0), _dirty(false)
{
- lookupLevel = L1;
+ lookupLevel = LookupLevel::L1;
}
uint64_t
@@ -280,13 +282,13 @@
/** Default ctor */
L2Descriptor() : data(0), l1Parent(nullptr), _dirty(false)
{
- lookupLevel = L2;
+ lookupLevel = LookupLevel::L2;
}
L2Descriptor(L1Descriptor &parent) : data(0), l1Parent(&parent),
_dirty(false)
{
- lookupLevel = L2;
+ lookupLevel = LookupLevel::L2;
}
uint64_t
@@ -449,10 +451,10 @@
dbgHeader() const override
{
if (type() == LongDescriptor::Page) {
- assert(lookupLevel == L3);
+ assert(lookupLevel == LookupLevel::L3);
return "Inserting Page descriptor into TLB\n";
} else {
- assert(lookupLevel < L3);
+ assert(lookupLevel < LookupLevel::L3);
return "Inserting Block descriptor into TLB\n";
}
}
@@ -478,13 +480,14 @@
// 4 KiB granule and at L1 for 16/64 KiB granules
switch (grainSize) {
case Grain4KB:
- if (lookupLevel == L0 || lookupLevel == L3)
+ if (lookupLevel == LookupLevel::L0 ||
+ lookupLevel == LookupLevel::L3)
return Invalid;
else
return Block;
case Grain16KB:
- if (lookupLevel == L2)
+ if (lookupLevel == LookupLevel::L2)
return Block;
else
return Invalid;
@@ -492,8 +495,8 @@
case Grain64KB:
// With Armv8.2-LPA (52bit PA) L1 Block descriptors
// are allowed for 64KiB granule
- if ((lookupLevel == L1 && physAddrRange == 52) ||
- lookupLevel == L2)
+ if ((lookupLevel == LookupLevel::L1 && physAddrRange
== 52) ||
+ lookupLevel == LookupLevel::L2)
return Block;
else
return Invalid;
@@ -502,7 +505,7 @@
return Invalid;
}
case 0x3:
- return lookupLevel == L3 ? Page : Table;
+ return lookupLevel == LookupLevel::L3 ? Page : Table;
default:
return Invalid;
}
@@ -515,13 +518,13 @@
if (type() == Block) {
switch (grainSize) {
case Grain4KB:
- return lookupLevel == L1 ? 30 /* 1 GiB */
- : 21 /* 2 MiB */;
+ return lookupLevel == LookupLevel::L1 ?
+ 30 /* 1 GiB */ : 21 /* 2 MiB */;
case Grain16KB:
return 25 /* 32 MiB */;
case Grain64KB:
- return lookupLevel == L1 ? 42 /* 4 TiB */
- : 29 /* 512 MiB */;
+ return lookupLevel == LookupLevel::L1 ?
+ 42 /* 4 TiB */ : 29 /* 512 MiB */;
default:
panic("Invalid AArch64 VM granule size\n");
}
@@ -592,7 +595,7 @@
int va_hi = va_lo + stride - 1;
pa = nextTableAddr() | (bits(va, va_hi, va_lo) << 3);
} else {
- if (lookupLevel == L1)
+ if (lookupLevel == LookupLevel::L1)
pa = nextTableAddr() | (bits(va, 29, 21) << 3);
else // lookupLevel == L2
pa = nextTableAddr() | (bits(va, 20, 12) << 3);
@@ -1003,7 +1006,7 @@
protected:
/** Queues of requests for all the different lookup levels */
- std::list<WalkerState *> stateQueues[MAX_LOOKUP_LEVELS];
+ std::list<WalkerState *> stateQueues[LookupLevel::Num_ArmLookupLevel];
/** Queue of requests that have passed are waiting because the walker
is
* currently busy. */
diff --git a/src/arch/arm/tlb.hh b/src/arch/arm/tlb.hh
index 197f397..8eb7d01 100644
--- a/src/arch/arm/tlb.hh
+++ b/src/arch/arm/tlb.hh
@@ -109,7 +109,7 @@
virtual Fault walkCheck(Addr pa, Addr size, Addr va, bool is_secure,
Addr is_priv, BaseMMU::Mode mode,
TlbEntry::DomainType domain,
- LookupLevel lookup_level) = 0;
+ enums::ArmLookupLevel lookup_level) = 0;
};
class TLB : public BaseTLB
@@ -158,6 +158,7 @@
public:
using Params = ArmTLBParams;
using Lookup = TlbEntry::Lookup;
+ using LookupLevel = enums::ArmLookupLevel;
TLB(const Params &p);
TLB(const Params &p, int _size, TableWalker *_walker);
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/52007
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: I90673fada66f59d4a90354660d2513a39c0ccba5
Gerrit-Change-Number: 52007
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s