Giacomo Travaglini has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/51012 )
Change subject: arch-arm: Use ArmRelease in the ISA class
......................................................................
arch-arm: Use ArmRelease in the ISA class
This is removing the cached boolean variables from the ISA class.
The ISA is now using a release object.
It is importing it from the ArmSystem in case of a FS simulation,
and it is using its own ArmRelease object in SE mode
This allows us to add/remove SE extensions from python, rather than
hardcoding them in the ISA constructor (in case of SE)
Change-Id: I2b0b2f113e7bb9e28ac86bf2139413e2a71eeb01
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
---
M src/arch/arm/isa.cc
M src/arch/arm/isa.hh
M src/arch/arm/regs/misc.cc
M src/arch/arm/ArmISA.py
4 files changed, 182 insertions(+), 127 deletions(-)
diff --git a/src/arch/arm/ArmISA.py b/src/arch/arm/ArmISA.py
index 23338d1..0a2bbc6 100644
--- a/src/arch/arm/ArmISA.py
+++ b/src/arch/arm/ArmISA.py
@@ -38,13 +38,18 @@
from m5.SimObject import SimObject
from m5.objects.ArmPMU import ArmPMU
-from m5.objects.ArmSystem import SveVectorLength
+from m5.objects.ArmSystem import SveVectorLength, ArmRelease
from m5.objects.BaseISA import BaseISA
from m5.objects.ISACommon import VecRegRenameMode
# Enum for DecoderFlavor
class DecoderFlavor(Enum): vals = ['Generic']
+class ArmDefaultSERelease(ArmRelease):
+ extensions = [
+ 'CRYPTO', 'FEAT_SVE', 'FEAT_LSE', 'TME', 'FEAT_SEL2'
+ ]
+
class ArmISA(BaseISA):
type = 'ArmISA'
cxx_class = 'gem5::ArmISA::ISA'
@@ -56,6 +61,9 @@
decoderFlavor = Param.DecoderFlavor(
'Generic', "Decoder flavor specification")
+ release_se = Param.ArmRelease(ArmDefaultSERelease(),
+ "Set of features/extensions to use in SE mode")
+
# If no MIDR value is provided, 0x0 is treated by gem5 as follows:
# When 'highest_el_is_64' (AArch64 support) is:
# True -> Cortex-A57 TRM r0p0 MIDR is used
diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc
index ee9c556..54e574d 100644
--- a/src/arch/arm/isa.cc
+++ b/src/arch/arm/isa.cc
@@ -103,32 +103,18 @@
// Cache system-level properties
if (FullSystem && system) {
highestELIs64 = system->highestELIs64();
- haveSecurity = system->has(ArmExtension::SECURITY);
- haveLPAE = system->has(ArmExtension::LPAE);
- haveCrypto = system->has(ArmExtension::CRYPTO);
- haveVirtualization = system->has(ArmExtension::VIRTUALIZATION);
haveLargeAsid64 = system->haveLargeAsid64();
physAddrRange = system->physAddrRange();
- haveSVE = system->has(ArmExtension::FEAT_SVE);
- haveVHE = system->has(ArmExtension::FEAT_VHE);
- havePAN = system->has(ArmExtension::FEAT_PAN);
- haveSecEL2 = system->has(ArmExtension::FEAT_SEL2);
sveVL = system->sveVL();
- haveLSE = system->has(ArmExtension::FEAT_LSE);
- haveTME = system->has(ArmExtension::TME);
+
+ release = system->releaseFS();
} else {
highestELIs64 = true; // ArmSystem::highestELIs64 does the same
- haveSecurity = haveLPAE = haveVirtualization = false;
- haveCrypto = true;
haveLargeAsid64 = false;
physAddrRange = 32; // dummy value
- haveSVE = true;
- haveVHE = false;
- havePAN = false;
- haveSecEL2 = true;
sveVL = p.sve_vl_se;
- haveLSE = true;
- haveTME = true;
+
+ release = p.release_se;
}
selfDebug = new SelfDebug();
@@ -264,7 +250,7 @@
miscRegs[MISCREG_FPSID] = p.fpsid;
- if (haveLPAE) {
+ if (release->has(ArmExtension::LPAE)) {
TTBCR ttbcr = miscRegs[MISCREG_TTBCR_NS];
ttbcr.eae = 0;
miscRegs[MISCREG_TTBCR_NS] = ttbcr;
@@ -272,7 +258,7 @@
miscRegs[MISCREG_ID_MMFR0] = (miscRegs[MISCREG_ID_MMFR0] & ~0xf) |
0x5;
}
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
miscRegs[MISCREG_SCTLR_S] = sctlr;
miscRegs[MISCREG_SCR] = 0;
miscRegs[MISCREG_VBAR_S] = 0;
@@ -319,10 +305,10 @@
// Initialize other control registers
miscRegs[MISCREG_MPIDR_EL1] = 0x80000000;
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
miscRegs[MISCREG_SCTLR_EL3] = 0x30c50830;
miscRegs[MISCREG_SCR_EL3] = 0x00000030; // RES1 fields
- } else if (haveVirtualization) {
+ } else if (release->has(ArmExtension::VIRTUALIZATION)) {
// also MISCREG_SCTLR_EL2 (by mapping)
miscRegs[MISCREG_HSCTLR] = 0x30c50830;
} else {
@@ -368,7 +354,7 @@
miscRegs[MISCREG_ID_ISAR5] = insertBits(
miscRegs[MISCREG_ID_ISAR5], 19, 4,
- haveCrypto ? 0x1112 : 0x0);
+ release->has(ArmExtension::CRYPTO) ? 0x1112 : 0x0);
}
void
@@ -395,9 +381,9 @@
// SVE
miscRegs[MISCREG_ID_AA64ZFR0_EL1] = 0; // SVEver 0
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
miscRegs[MISCREG_ZCR_EL3] = sveVL - 1;
- } else if (haveVirtualization) {
+ } else if (release->has(ArmExtension::VIRTUALIZATION)) {
miscRegs[MISCREG_ZCR_EL2] = sveVL - 1;
} else {
miscRegs[MISCREG_ZCR_EL1] = sveVL - 1;
@@ -408,22 +394,22 @@
// EL3
miscRegs[MISCREG_ID_AA64PFR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64PFR0_EL1], 15, 12,
- haveSecurity ? 0x2 : 0x0);
+ release->has(ArmExtension::SECURITY) ? 0x2 : 0x0);
// EL2
miscRegs[MISCREG_ID_AA64PFR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64PFR0_EL1], 11, 8,
- haveVirtualization ? 0x2 : 0x0);
+ release->has(ArmExtension::VIRTUALIZATION) ? 0x2 : 0x0);
// SVE
miscRegs[MISCREG_ID_AA64PFR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64PFR0_EL1], 35, 32,
- haveSVE ? 0x1 : 0x0);
+ release->has(ArmExtension::FEAT_SVE) ? 0x1 : 0x0);
// SecEL2
miscRegs[MISCREG_ID_AA64PFR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64PFR0_EL1], 39, 36,
- haveSecEL2 ? 0x1 : 0x0);
+ release->has(ArmExtension::FEAT_SEL2) ? 0x1 : 0x0);
miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64ISAR0_EL1], 39, 36,
- haveSecEL2 ? 0x1 : 0x0);
+ release->has(ArmExtension::FEAT_SEL2) ? 0x1 : 0x0);
// Large ASID support
miscRegs[MISCREG_ID_AA64MMFR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64MMFR0_EL1], 7, 4,
@@ -435,23 +421,23 @@
// Crypto
miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64ISAR0_EL1], 19, 4,
- haveCrypto ? 0x1112 : 0x0);
+ release->has(ArmExtension::CRYPTO) ? 0x1112 : 0x0);
// LSE
miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64ISAR0_EL1], 23, 20,
- haveLSE ? 0x2 : 0x0);
+ release->has(ArmExtension::FEAT_LSE) ? 0x2 : 0x0);
// VHE
miscRegs[MISCREG_ID_AA64MMFR1_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64MMFR1_EL1], 11, 8,
- haveVHE ? 0x1 : 0x0);
+ release->has(ArmExtension::FEAT_VHE) ? 0x1 : 0x0);
// PAN
miscRegs[MISCREG_ID_AA64MMFR1_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64MMFR1_EL1], 23, 20,
- havePAN ? 0x1 : 0x0);
+ release->has(ArmExtension::FEAT_PAN) ? 0x1 : 0x0);
// TME
miscRegs[MISCREG_ID_AA64ISAR0_EL1] = insertBits(
miscRegs[MISCREG_ID_AA64ISAR0_EL1], 27, 24,
- haveTME ? 0x1 : 0x0);
+ release->has(ArmExtension::TME) ? 0x1 : 0x0);
}
void
@@ -462,7 +448,7 @@
if (tc) {
setupThreadContext();
- if (haveTME) {
+ if (release->has(ArmExtension::TME)) {
std::unique_ptr<BaseHTMCheckpoint> cpt(new HTMCheckpoint());
tc->setHtmCheckpointPtr(std::move(cpt));
}
@@ -596,7 +582,7 @@
switch (unflattenMiscReg(misc_reg)) {
case MISCREG_HCR:
case MISCREG_HCR2:
- if (!haveVirtualization)
+ if (!release->has(ArmExtension::VIRTUALIZATION))
return 0;
break;
case MISCREG_CPACR:
@@ -610,7 +596,7 @@
cpacrMask.asedis = ones;
// Security Extensions may limit the readability of CPACR
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
scr = readMiscRegNoEffect(MISCREG_SCR);
cpsr = readMiscRegNoEffect(MISCREG_CPSR);
if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc, EL3)) {
@@ -819,7 +805,8 @@
val &= ~(1 << 14);
// If a CP bit in NSACR is 0 then the corresponding bit in
// HCPTR is RAO/WI
- bool secure_lookup = haveSecurity && isSecure(tc);
+ bool secure_lookup = release->has(ArmExtension::SECURITY) &&
+ isSecure(tc);
if (!secure_lookup) {
RegVal mask = readMiscRegNoEffect(MISCREG_NSACR);
val |= (mask ^ 0x7FFF) & 0xBFFF;
@@ -838,19 +825,25 @@
return 0x00000031;
case MISCREG_ID_PFR1:
{ // Timer | Virti | !M Profile | TrustZone | ARMv4
- bool haveTimer = (system->getGenericTimer() != NULL);
- return 0x00000001
- | (haveSecurity ? 0x00000010 : 0x0)
- | (haveVirtualization ? 0x00001000 : 0x0)
- | (haveTimer ? 0x00010000 : 0x0);
+ bool have_timer = (system->getGenericTimer() != nullptr);
+ return 0x00000001 |
+ (release->has(ArmExtension::SECURITY) ?
+ 0x00000010 : 0x0) |
+ (release->has(ArmExtension::VIRTUALIZATION) ?
+ 0x00001000 : 0x0) |
+ (have_timer ? 0x00010000 : 0x0);
}
case MISCREG_ID_AA64PFR0_EL1:
return 0x0000000000000002 | // AArch{64,32} supported at EL0
- 0x0000000000000020 | // EL1
- (haveVirtualization ? 0x0000000000000200 : 0) | // EL2
- (haveSecurity ? 0x0000000000002000 : 0) | // EL3
- (haveSVE ? 0x0000000100000000 : 0) | // SVE
- (haveSecEL2 ? 0x0000001000000000 : 0) | // SecEL2
+ 0x0000000000000020 | // EL1
+ (release->has(ArmExtension::VIRTUALIZATION) ?
+ 0x0000000000000200 : 0) | // EL2
+ (release->has(ArmExtension::SECURITY) ?
+ 0x0000000000002000 : 0) | // EL3
+ (release->has(ArmExtension::FEAT_SVE) ?
+ 0x0000000100000000 : 0) | // SVE
+ (release->has(ArmExtension::FEAT_SEL2) ?
+ 0x0000001000000000 : 0) | // SecEL2
(gicv3CpuInterface ? 0x0000000001000000 : 0);
case MISCREG_ID_AA64PFR1_EL1:
return 0; // bits [63:0] RES0 (reserved for future use)
@@ -975,7 +968,7 @@
cpacrMask.asedis = ones;
// Security Extensions may limit the writability of CPACR
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
scr = readMiscRegNoEffect(MISCREG_SCR);
CPSR cpsr = readMiscRegNoEffect(MISCREG_CPSR);
if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc,
EL3)) {
@@ -999,7 +992,7 @@
CPACR cpacrMask = 0;
cpacrMask.tta = ones;
cpacrMask.fpen = ones;
- if (haveSVE) {
+ if (release->has(ArmExtension::FEAT_SVE)) {
cpacrMask.zen = ones;
}
newVal &= cpacrMask;
@@ -1015,7 +1008,7 @@
cptrMask.tcpac = ones;
cptrMask.tta = ones;
cptrMask.tfp = ones;
- if (haveSVE) {
+ if (release->has(ArmExtension::FEAT_SVE)) {
cptrMask.tz = ones;
cptrMask.zen = hcr.e2h ? ones : 0;
}
@@ -1024,7 +1017,7 @@
cptrMask = 0;
cptrMask.res1_13_12_el2 = ones;
cptrMask.res1_7_0_el2 = ones;
- if (!haveSVE) {
+ if (!release->has(ArmExtension::FEAT_SVE)) {
cptrMask.res1_8_el2 = ones;
}
cptrMask.res1_9_el2 = ones;
@@ -1040,7 +1033,7 @@
cptrMask.tcpac = ones;
cptrMask.tta = ones;
cptrMask.tfp = ones;
- if (haveSVE) {
+ if (release->has(ArmExtension::FEAT_SVE)) {
cptrMask.ez = ones;
}
newVal &= cptrMask;
@@ -1159,14 +1152,14 @@
}
break;
case MISCREG_HCR2:
- if (!haveVirtualization)
+ if (!release->has(ArmExtension::VIRTUALIZATION))
return;
break;
case MISCREG_HCR:
{
const HDCR mdcr =
tc->readMiscRegNoEffect(MISCREG_MDCR_EL2);
selfDebug->setenableTDETGE((HCR)val, mdcr);
- if (!haveVirtualization)
+ if (!release->has(ArmExtension::VIRTUALIZATION))
return;
}
break;
@@ -1440,7 +1433,7 @@
{
// ARM ARM (ARM DDI 0406C.b) B4.1.5
// Valid only with LPAE
- if (!haveLPAE)
+ if (!release->has(ArmExtension::LPAE))
return;
DPRINTF(MiscRegs, "Writing AMAIR: %#x\n", newVal);
}
@@ -1454,7 +1447,8 @@
scr = readMiscRegNoEffect(MISCREG_SCR);
MiscRegIndex sctlr_idx;
- if (haveSecurity && !highestELIs64 && !scr.ns) {
+ if (release->has(ArmExtension::SECURITY) &&
+ !highestELIs64 && !scr.ns) {
sctlr_idx = MISCREG_SCTLR_S;
} else {
sctlr_idx = MISCREG_SCTLR_NS;
@@ -1462,7 +1456,8 @@
SCTLR sctlr = miscRegs[sctlr_idx];
SCTLR new_sctlr = newVal;
- new_sctlr.nmfi = ((bool)sctlr.nmfi)
&& !haveVirtualization;
+ new_sctlr.nmfi = ((bool)sctlr.nmfi) &&
+ !release->has(ArmExtension::VIRTUALIZATION);
miscRegs[sctlr_idx] = (RegVal)new_sctlr;
getMMUPtr(tc)->invalidateMiscReg();
}
@@ -1508,7 +1503,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIALL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALL tlbiOp(EL1, secure);
tlbiOp(tc);
return;
}
@@ -1518,7 +1514,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIALL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALL tlbiOp(EL1, secure);
tlbiOp.broadcast(tc);
return;
}
@@ -1528,7 +1525,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- ITLBIALL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ ITLBIALL tlbiOp(EL1, secure);
tlbiOp(tc);
return;
}
@@ -1538,7 +1536,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- DTLBIALL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ DTLBIALL tlbiOp(EL1, secure);
tlbiOp(tc);
return;
}
@@ -1552,8 +1551,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIMVA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
mbits(newVal, 31, 12),
bits(newVal, 7,0));
@@ -1567,8 +1567,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIMVA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
mbits(newVal, 31, 12),
bits(newVal, 7,0));
@@ -1581,8 +1582,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIASID tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
bits(newVal, 7,0));
tlbiOp(tc);
@@ -1594,8 +1596,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIASID tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
bits(newVal, 7,0));
tlbiOp.broadcast(tc);
@@ -1611,7 +1614,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVAA tlbiOp(EL1, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVAA tlbiOp(EL1, secure,
mbits(newVal, 31,12));
tlbiOp(tc);
@@ -1624,7 +1628,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVAA tlbiOp(EL1, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVAA tlbiOp(EL1, secure,
mbits(newVal, 31,12));
tlbiOp.broadcast(tc);
@@ -1640,7 +1645,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVAA tlbiOp(EL2, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVAA tlbiOp(EL2, secure,
mbits(newVal, 31,12));
tlbiOp(tc);
@@ -1653,7 +1659,8 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVAA tlbiOp(EL2, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVAA tlbiOp(EL2, secure,
mbits(newVal, 31,12));
tlbiOp.broadcast(tc);
@@ -1669,8 +1676,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIIPA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
static_cast<Addr>(bits(newVal, 35, 0)) <<
12);
tlbiOp(tc);
@@ -1684,8 +1692,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
TLBIIPA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
static_cast<Addr>(bits(newVal, 35, 0)) <<
12);
tlbiOp.broadcast(tc);
@@ -1697,8 +1706,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ITLBIMVA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
mbits(newVal, 31, 12),
bits(newVal, 7,0));
@@ -1711,8 +1721,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
DTLBIMVA tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
mbits(newVal, 31, 12),
bits(newVal, 7,0));
@@ -1725,8 +1736,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ITLBIASID tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
bits(newVal, 7,0));
tlbiOp(tc);
@@ -1738,8 +1750,9 @@
assert32();
scr = readMiscReg(MISCREG_SCR);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
DTLBIASID tlbiOp(EL1,
- haveSecurity && !scr.ns,
+ secure,
bits(newVal, 7,0));
tlbiOp(tc);
@@ -1805,7 +1818,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIALLEL tlbiOp(EL2, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALLEL tlbiOp(EL2, secure);
tlbiOp(tc);
return;
}
@@ -1815,7 +1829,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIALLEL tlbiOp(EL2, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALLEL tlbiOp(EL2, secure);
tlbiOp.broadcast(tc);
return;
}
@@ -1825,7 +1840,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIALLEL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALLEL tlbiOp(EL1, secure);
tlbiOp(tc);
return;
}
@@ -1835,7 +1851,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIALLEL tlbiOp(EL1, haveSecurity && !scr.ns);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIALLEL tlbiOp(EL1, secure);
tlbiOp.broadcast(tc);
return;
}
@@ -1844,7 +1861,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIVMALL tlbiOp(EL1, haveSecurity && !scr.ns, true);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIVMALL tlbiOp(EL1, secure, true);
tlbiOp(tc);
return;
}
@@ -1855,8 +1873,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIVMALL tlbiOp(target_el, haveSecurity && !scr.ns,
false);
+ TLBIVMALL tlbiOp(target_el, secure, false);
tlbiOp(tc);
return;
}
@@ -1865,7 +1884,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIVMALL tlbiOp(EL1, haveSecurity && !scr.ns, true);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIVMALL tlbiOp(EL1, secure, true);
tlbiOp.broadcast(tc);
return;
}
@@ -1876,8 +1896,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIVMALL tlbiOp(target_el, haveSecurity && !scr.ns,
false);
+ TLBIVMALL tlbiOp(target_el, secure, false);
tlbiOp.broadcast(tc);
return;
}
@@ -1916,7 +1937,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVA tlbiOp(EL2, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVA tlbiOp(EL2, secure,
static_cast<Addr>(bits(newVal, 43, 0)) <<
12,
0xbeef);
tlbiOp(tc);
@@ -1929,7 +1951,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIMVA tlbiOp(EL2, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIMVA tlbiOp(EL2, secure,
static_cast<Addr>(bits(newVal, 43, 0)) <<
12,
0xbeef);
@@ -1947,8 +1970,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIMVA tlbiOp(target_el, haveSecurity && !scr.ns,
+ TLBIMVA tlbiOp(target_el, secure,
static_cast<Addr>(bits(newVal, 43, 0)) <<
12,
asid);
@@ -1966,8 +1990,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIMVA tlbiOp(target_el, haveSecurity && !scr.ns,
+ TLBIMVA tlbiOp(target_el, secure,
static_cast<Addr>(bits(newVal, 43, 0)) <<
12,
asid);
@@ -1984,8 +2009,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIASID tlbiOp(target_el, haveSecurity && !scr.ns, asid);
+ TLBIASID tlbiOp(target_el, secure, asid);
tlbiOp(tc);
return;
}
@@ -1999,8 +2025,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIASID tlbiOp(target_el, haveSecurity && !scr.ns, asid);
+ TLBIASID tlbiOp(target_el, secure, asid);
tlbiOp.broadcast(tc);
return;
}
@@ -2015,8 +2042,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIMVAA tlbiOp(target_el, haveSecurity && !scr.ns,
+ TLBIMVAA tlbiOp(target_el, secure,
static_cast<Addr>(bits(newVal, 43, 0)) << 12);
tlbiOp(tc);
@@ -2031,8 +2059,9 @@
HCR hcr = readMiscReg(MISCREG_HCR_EL2);
bool is_host = (hcr.tge && hcr.e2h);
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
ExceptionLevel target_el = is_host ? EL2 : EL1;
- TLBIMVAA tlbiOp(target_el, haveSecurity && !scr.ns,
+ TLBIMVAA tlbiOp(target_el, secure,
static_cast<Addr>(bits(newVal, 43, 0)) << 12);
tlbiOp.broadcast(tc);
@@ -2046,7 +2075,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIIPA tlbiOp(EL1, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIIPA tlbiOp(EL1, secure,
static_cast<Addr>(bits(newVal, 35, 0)) <<
12);
tlbiOp(tc);
@@ -2060,7 +2090,8 @@
assert64();
scr = readMiscReg(MISCREG_SCR);
- TLBIIPA tlbiOp(EL1, haveSecurity && !scr.ns,
+ bool secure = release->has(ArmExtension::SECURITY)
&& !scr.ns;
+ TLBIIPA tlbiOp(EL1, secure,
static_cast<Addr>(bits(newVal, 35, 0)) <<
12);
tlbiOp.broadcast(tc);
@@ -2089,7 +2120,8 @@
{
// If a CP bit in NSACR is 0 then the corresponding bit in
// HCPTR is RAO/WI. Same applies to NSASEDIS
- secure_lookup = haveSecurity && isSecure(tc);
+ secure_lookup = release->has(ArmExtension::SECURITY) &&
+ isSecure(tc);
if (!secure_lookup) {
RegVal oldValue = readMiscRegNoEffect(MISCREG_HCPTR);
RegVal mask =
@@ -2119,23 +2151,23 @@
MMU::UserMode, val);
return;
case MISCREG_ATS12NSOPR:
- if (!haveSecurity)
+ if (!release->has(ArmExtension::SECURITY))
panic("Security Extensions required for ATS12NSOPR");
addressTranslation(MMU::S1S2NsTran, BaseMMU::Read, 0, val);
return;
case MISCREG_ATS12NSOPW:
- if (!haveSecurity)
+ if (!release->has(ArmExtension::SECURITY))
panic("Security Extensions required for ATS12NSOPW");
addressTranslation(MMU::S1S2NsTran, BaseMMU::Write, 0, val);
return;
case MISCREG_ATS12NSOUR:
- if (!haveSecurity)
+ if (!release->has(ArmExtension::SECURITY))
panic("Security Extensions required for ATS12NSOUR");
addressTranslation(MMU::S1S2NsTran, BaseMMU::Read,
MMU::UserMode, val);
return;
case MISCREG_ATS12NSOUW:
- if (!haveSecurity)
+ if (!release->has(ArmExtension::SECURITY))
panic("Security Extensions required for ATS12NSOUW");
addressTranslation(MMU::S1S2NsTran, BaseMMU::Write,
MMU::UserMode, val);
@@ -2155,7 +2187,7 @@
// ARM DDI 0406C.b, ARMv7-32
ttbcrMask.n = ones; // T0SZ
- if (haveSecurity) {
+ if (release->has(ArmExtension::SECURITY)) {
ttbcrMask.pd0 = ones;
ttbcrMask.pd1 = ones;
}
@@ -2169,10 +2201,10 @@
ttbcrMask.irgn1 = ones;
ttbcrMask.orgn1 = ones;
ttbcrMask.sh1 = ones;
- if (haveLPAE)
+ if (release->has(ArmExtension::LPAE))
ttbcrMask.eae = ones;
- if (haveLPAE && ttbcrNew.eae) {
+ if (release->has(ArmExtension::LPAE) && ttbcrNew.eae) {
newVal = newVal & ttbcrMask;
} else {
newVal = (newVal & ttbcrMask) | (ttbcr & (~ttbcrMask));
@@ -2185,7 +2217,7 @@
case MISCREG_TTBR1:
{
TTBCR ttbcr = readMiscRegNoEffect(MISCREG_TTBCR);
- if (haveLPAE) {
+ if (release->has(ArmExtension::LPAE)) {
if (ttbcr.eae) {
// ARMv7 bit 63-56, 47-40 reserved, UNK/SBZP
// ARMv8 AArch32 bit 63-56 only
@@ -2406,7 +2438,7 @@
if (el == EL2 || (el == EL0 && ELIsInHost(tc, el))) {
len = static_cast<ZCR>(miscRegs[MISCREG_ZCR_EL2]).len;
- } else if (haveVirtualization && !isSecure(tc) &&
+ } else if (release->has(ArmExtension::VIRTUALIZATION) && !isSecure(tc)
&&
(el == EL0 || el == EL1)) {
len = std::min(
len,
@@ -2416,7 +2448,7 @@
if (el == EL3) {
len = static_cast<ZCR>(miscRegs[MISCREG_ZCR_EL3]).len;
- } else if (haveSecurity) {
+ } else if (release->has(ArmExtension::SECURITY)) {
len = std::min(
len,
static_cast<unsigned>(
@@ -2521,7 +2553,8 @@
HCR hcr = readMiscRegNoEffect(MISCREG_HCR);
uint8_t max_paddr_bit = 0;
- if (haveLPAE && (ttbcr.eae || tran_type & MMU::HypMode ||
+ if (release->has(ArmExtension::LPAE) &&
+ (ttbcr.eae || tran_type & MMU::HypMode ||
((tran_type & MMU::S1S2NsTran) && hcr.vm) )) {
max_paddr_bit = 39;
diff --git a/src/arch/arm/isa.hh b/src/arch/arm/isa.hh
index 0e38483..2ef9128 100644
--- a/src/arch/arm/isa.hh
+++ b/src/arch/arm/isa.hh
@@ -88,22 +88,15 @@
// Cached copies of system-level properties
bool highestELIs64;
- bool haveSecurity;
- bool haveLPAE;
- bool haveVirtualization;
- bool haveCrypto;
bool haveLargeAsid64;
uint8_t physAddrRange;
- bool haveSVE;
- bool haveLSE;
- bool haveVHE;
- bool havePAN;
- bool haveSecEL2;
- bool haveTME;
/** SVE vector length in quadwords */
unsigned sveVL;
+ /** This could be either a FS or a SE release */
+ const ArmRelease *release;
+
/**
* If true, accesses to IMPLEMENTATION DEFINED registers are
treated
* as NOP hence not causing UNDEFINED INSTRUCTION.
@@ -735,10 +728,11 @@
}
} else {
if (miscRegInfo[reg][MISCREG_BANKED]) {
- bool secureReg = haveSecurity && !highestELIs64 &&
- inSecureState(miscRegs[MISCREG_SCR],
- miscRegs[MISCREG_CPSR]);
- flat_idx += secureReg ? 2 : 1;
+ bool secure_reg = release->has(ArmExtension::SECURITY)
&&
+ !highestELIs64 &&
+ inSecureState(miscRegs[MISCREG_SCR],
+
miscRegs[MISCREG_CPSR]);
+ flat_idx += secure_reg ? 2 : 1;
} else {
flat_idx = snsBankedIndex64((MiscRegIndex)reg,
!inSecureState(miscRegs[MISCREG_SCR],
@@ -759,7 +753,7 @@
if (hcr.e2h == 0x0 || currEL(tc) != EL2)
return misc_reg;
SCR scr = readMiscRegNoEffect(MISCREG_SCR_EL3);
- bool sec_el2 = scr.eel2 && haveSecEL2;
+ bool sec_el2 = scr.eel2 &&
release->has(ArmExtension::FEAT_SEL2);
switch(misc_reg) {
case MISCREG_SPSR_EL1:
return MISCREG_SPSR_EL2;
@@ -825,7 +819,8 @@
{
int reg_as_int = static_cast<int>(reg);
if (miscRegInfo[reg][MISCREG_BANKED64]) {
- reg_as_int += (haveSecurity && !ns) ? 2 : 1;
+ reg_as_int += (release->has(ArmExtension::SECURITY)
&& !ns) ?
+ 2 : 1;
}
return reg_as_int;
}
@@ -840,7 +835,7 @@
}
// do additional S/NS flattenings if mapped to NS while in S
- bool S = haveSecurity && !highestELIs64 &&
+ bool S = release->has(ArmExtension::SECURITY)
&& !highestELIs64 &&
inSecureState(miscRegs[MISCREG_SCR],
miscRegs[MISCREG_CPSR]);
int lower = lookUpMiscReg[flat_idx].lower;
diff --git a/src/arch/arm/regs/misc.cc b/src/arch/arm/regs/misc.cc
index b1c47ea..d586e0f 100644
--- a/src/arch/arm/regs/misc.cc
+++ b/src/arch/arm/regs/misc.cc
@@ -3410,7 +3410,7 @@
// This boolean variable specifies if the system is running in aarch32
at
// EL3 (aarch32EL3 = true). It is false if EL3 is not implemented, or
it
// is running in aarch64 (aarch32EL3 = false)
- bool aarch32EL3 = haveSecurity && !highestELIs64;
+ bool aarch32EL3 = release->has(ArmExtension::SECURITY)
&& !highestELIs64;
// Set Privileged Access Never on taking an exception to EL1 (Arm
8.1+),
// unsupported
@@ -4946,7 +4946,7 @@
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_PAN)
.allPrivileges().exceptUserMode()
- .implemented(havePAN);
+ .implemented(release->has(ArmExtension::FEAT_PAN));
InitReg(MISCREG_UAO)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_NZCV)
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/51012
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: I2b0b2f113e7bb9e28ac86bf2139413e2a71eeb01
Gerrit-Change-Number: 51012
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
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