target/arm: Force HPD for stage2 translations
Stage2 translations do not have hierarchial permissions. Setting HPD means we can eliminate an extra check against regime_is_stage2. Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20251008215613.300150-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
0277e0652b
commit
26c7b95eb1
2 changed files with 18 additions and 13 deletions
|
|
@ -9397,8 +9397,11 @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
|
|||
tsz = extract32(tcr, 0, 6);
|
||||
gran = tg0_to_gran_size(extract32(tcr, 14, 2));
|
||||
if (stage2) {
|
||||
/* VTCR_EL2 */
|
||||
hpd = false;
|
||||
/*
|
||||
* Stage2 does not have hierarchical permissions.
|
||||
* Thus disabling them makes things easier during ptw.
|
||||
*/
|
||||
hpd = true;
|
||||
} else {
|
||||
hpd = extract32(tcr, 24, 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1507,8 +1507,12 @@ static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
|||
}
|
||||
tsz = sextract32(tcr, 0, 4) + 8;
|
||||
select = 0;
|
||||
hpd = false;
|
||||
epd = false;
|
||||
/*
|
||||
* Stage2 does not have hierarchical permissions.
|
||||
* Thus disabling them makes things easier during ptw.
|
||||
*/
|
||||
hpd = true;
|
||||
} else if (el == 2) {
|
||||
/* HTCR */
|
||||
tsz = extract32(tcr, 0, 3);
|
||||
|
|
@ -2014,16 +2018,14 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
|
|||
* except NSTable (which we have already handled).
|
||||
*/
|
||||
attrs = new_descriptor & (MAKE_64BIT_MASK(2, 10) | MAKE_64BIT_MASK(50, 14));
|
||||
if (!regime_is_stage2(mmu_idx)) {
|
||||
if (!param.hpd) {
|
||||
attrs |= extract64(tableattrs, 0, 2) << 53; /* XN, PXN */
|
||||
/*
|
||||
* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1
|
||||
* means "force PL1 access only", which means forcing AP[1] to 0.
|
||||
*/
|
||||
attrs &= ~(extract64(tableattrs, 2, 1) << 6); /* !APT[0] => AP[1] */
|
||||
attrs |= extract32(tableattrs, 3, 1) << 7; /* APT[1] => AP[2] */
|
||||
}
|
||||
if (!param.hpd) {
|
||||
attrs |= extract64(tableattrs, 0, 2) << 53; /* XN, PXN */
|
||||
/*
|
||||
* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1
|
||||
* means "force PL1 access only", which means forcing AP[1] to 0.
|
||||
*/
|
||||
attrs &= ~(extract64(tableattrs, 2, 1) << 6); /* !APT[0] => AP[1] */
|
||||
attrs |= extract32(tableattrs, 3, 1) << 7; /* APT[1] => AP[2] */
|
||||
}
|
||||
|
||||
ap = extract32(attrs, 6, 2);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue