From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: qemu-arm@nongnu.org
Subject: [PATCH v3 04/25] target/arm: Rewrite check_s2_mmu_setup
Date: Tue, 21 Feb 2023 16:33:15 -1000 [thread overview]
Message-ID: <20230222023336.915045-5-richard.henderson@linaro.org> (raw)
In-Reply-To: <20230222023336.915045-1-richard.henderson@linaro.org>
Integrate neighboring code from get_phys_addr_lpae which computed
starting level, as it is easier to validate when doing both at the
same time. Mirror the checks at the start of AArch{64,32}.S2Walk,
especially S2InvalidSL and S2InconsistentSL.
This reverts 49ba115bb74, which was incorrect -- there is nothing
in the ARM pseudocode that depends on TxSZ, i.e. outputsize; the
pseudocode is consistent in referencing PAMax.
Fixes: 49ba115bb74 ("target/arm: Pass outputsize down to check_s2_mmu_setup")
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/ptw.c | 173 ++++++++++++++++++++++++++---------------------
1 file changed, 97 insertions(+), 76 deletions(-)
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
index 2b125fff44..6fb72fb086 100644
--- a/target/arm/ptw.c
+++ b/target/arm/ptw.c
@@ -1077,70 +1077,119 @@ static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
* check_s2_mmu_setup
* @cpu: ARMCPU
* @is_aa64: True if the translation regime is in AArch64 state
- * @startlevel: Suggested starting level
- * @inputsize: Bitsize of IPAs
+ * @tcr: VTCR_EL2 or VSTCR_EL2
+ * @ds: Effective value of TCR.DS.
+ * @iasize: Bitsize of IPAs
* @stride: Page-table stride (See the ARM ARM)
*
- * Returns true if the suggested S2 translation parameters are OK and
- * false otherwise.
+ * Decode the starting level of the S2 lookup, returning INT_MIN if
+ * the configuration is invalid.
*/
-static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
- int inputsize, int stride, int outputsize)
+static int check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, uint64_t tcr,
+ bool ds, int iasize, int stride)
{
- const int grainsize = stride + 3;
- int startsizecheck;
-
- /*
- * Negative levels are usually not allowed...
- * Except for FEAT_LPA2, 4k page table, 52-bit address space, which
- * begins with level -1. Note that previous feature tests will have
- * eliminated this combination if it is not enabled.
- */
- if (level < (inputsize == 52 && stride == 9 ? -1 : 0)) {
- return false;
- }
-
- startsizecheck = inputsize - ((3 - level) * stride + grainsize);
- if (startsizecheck < 1 || startsizecheck > stride + 4) {
- return false;
- }
+ int sl0, sl2, startlevel, granulebits, levels;
+ int s1_min_iasize, s1_max_iasize;
+ sl0 = extract32(tcr, 6, 2);
if (is_aa64) {
+ /*
+ * AArch64.S2InvalidTxSZ: While we checked tsz_oob near the top of
+ * get_phys_addr_lpae, that used aa64_va_parameters which apply
+ * to aarch64. If Stage1 is aarch32, the min_txsz is larger.
+ * See AArch64.S2MinTxSZ, where min_tsz is 24, translated to
+ * inputsize is 64 - 24 = 40.
+ */
+ if (iasize < 40 && !arm_el_is_aa64(&cpu->env, 1)) {
+ goto fail;
+ }
+
+ /*
+ * AArch64.S2InvalidSL: Interpretation of SL depends on the page size,
+ * so interleave AArch64.S2StartLevel.
+ */
switch (stride) {
- case 13: /* 64KB Pages. */
- if (level == 0 || (level == 1 && outputsize <= 42)) {
- return false;
+ case 9: /* 4KB */
+ /* SL2 is RES0 unless DS=1 & 4KB granule. */
+ sl2 = extract64(tcr, 33, 1);
+ if (ds && sl2) {
+ if (sl0 != 0) {
+ goto fail;
+ }
+ startlevel = -1;
+ } else {
+ startlevel = 2 - sl0;
+ switch (sl0) {
+ case 2:
+ if (arm_pamax(cpu) < 44) {
+ goto fail;
+ }
+ break;
+ case 3:
+ if (!cpu_isar_feature(aa64_st, cpu)) {
+ goto fail;
+ }
+ startlevel = 3;
+ break;
+ }
}
break;
- case 11: /* 16KB Pages. */
- if (level == 0 || (level == 1 && outputsize <= 40)) {
- return false;
+ case 11: /* 16KB */
+ switch (sl0) {
+ case 2:
+ if (arm_pamax(cpu) < 42) {
+ goto fail;
+ }
+ break;
+ case 3:
+ if (!ds) {
+ goto fail;
+ }
+ break;
}
+ startlevel = 3 - sl0;
break;
- case 9: /* 4KB Pages. */
- if (level == 0 && outputsize <= 42) {
- return false;
+ case 13: /* 64KB */
+ switch (sl0) {
+ case 2:
+ if (arm_pamax(cpu) < 44) {
+ goto fail;
+ }
+ break;
+ case 3:
+ goto fail;
}
+ startlevel = 3 - sl0;
break;
default:
g_assert_not_reached();
}
-
- /* Inputsize checks. */
- if (inputsize > outputsize &&
- (arm_el_is_aa64(&cpu->env, 1) || inputsize > 40)) {
- /* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */
- return false;
- }
} else {
- /* AArch32 only supports 4KB pages. Assert on that. */
+ /*
+ * Things are simpler for AArch32 EL2, with only 4k pages.
+ * There is no separate S2InvalidSL function, but AArch32.S2Walk
+ * begins with walkparms.sl0 in {'1x'}.
+ */
assert(stride == 9);
-
- if (level == 0) {
- return false;
+ if (sl0 >= 2) {
+ goto fail;
}
+ startlevel = 2 - sl0;
}
- return true;
+
+ /* AArch{64,32}.S2InconsistentSL are functionally equivalent. */
+ levels = 3 - startlevel;
+ granulebits = stride + 3;
+
+ s1_min_iasize = levels * stride + granulebits + 1;
+ s1_max_iasize = s1_min_iasize + (stride - 1) + 4;
+
+ if (iasize >= s1_min_iasize && iasize <= s1_max_iasize) {
+ return startlevel;
+ }
+
+ fail:
+ return INT_MIN;
}
/**
@@ -1296,38 +1345,10 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
*/
level = 4 - (inputsize - 4) / stride;
} else {
- /*
- * For stage 2 translations the starting level is specified by the
- * VTCR_EL2.SL0 field (whose interpretation depends on the page size)
- */
- uint32_t sl0 = extract32(tcr, 6, 2);
- uint32_t sl2 = extract64(tcr, 33, 1);
- int32_t startlevel;
- bool ok;
-
- /* SL2 is RES0 unless DS=1 & 4kb granule. */
- if (param.ds && stride == 9 && sl2) {
- if (sl0 != 0) {
- level = 0;
- goto do_translation_fault;
- }
- startlevel = -1;
- } else if (!aarch64 || stride == 9) {
- /* AArch32 or 4KB pages */
- startlevel = 2 - sl0;
-
- if (cpu_isar_feature(aa64_st, cpu)) {
- startlevel &= 3;
- }
- } else {
- /* 16KB or 64KB pages */
- startlevel = 3 - sl0;
- }
-
- /* Check that the starting level is valid. */
- ok = check_s2_mmu_setup(cpu, aarch64, startlevel,
- inputsize, stride, outputsize);
- if (!ok) {
+ int startlevel = check_s2_mmu_setup(cpu, aarch64, tcr, param.ds,
+ inputsize, stride);
+ if (startlevel == INT_MIN) {
+ level = 0;
goto do_translation_fault;
}
level = startlevel;
--
2.34.1
next prev parent reply other threads:[~2023-02-22 2:38 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-22 2:33 [PATCH v3 00/25] target/arm: Implement FEAT_RME Richard Henderson
2023-02-22 2:33 ` [PATCH v3 01/25] target/arm: Handle m-profile in arm_is_secure Richard Henderson
2023-02-24 13:14 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 02/25] target/arm: Stub arm_hcr_el2_eff for m-profile Richard Henderson
2023-02-24 13:15 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 03/25] target/arm: Diagnose incorrect usage of arm_is_secure subroutines Richard Henderson
2023-02-22 9:39 ` Philippe Mathieu-Daudé
2023-02-24 13:16 ` Peter Maydell
2023-02-22 2:33 ` Richard Henderson [this message]
2023-02-24 13:53 ` [PATCH v3 04/25] target/arm: Rewrite check_s2_mmu_setup Peter Maydell
2023-02-22 2:33 ` [PATCH v3 05/25] target/arm: Add isar_feature_aa64_rme Richard Henderson
2023-02-22 9:41 ` Philippe Mathieu-Daudé
2023-02-22 2:33 ` [PATCH v3 06/25] target/arm: Update SCR and HCR for RME Richard Henderson
2023-02-22 2:33 ` [PATCH v3 07/25] target/arm: SCR_EL3.NS may be RES1 Richard Henderson
2023-02-24 14:24 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 08/25] target/arm: Add RME cpregs Richard Henderson
2023-02-22 2:33 ` [PATCH v3 09/25] target/arm: Introduce ARMSecuritySpace Richard Henderson
2023-02-22 2:33 ` [PATCH v3 10/25] include/exec/memattrs: Add two bits of space to MemTxAttrs Richard Henderson
2023-02-22 2:33 ` [PATCH v3 11/25] target/arm: Adjust the order of Phys and Stage2 ARMMMUIdx Richard Henderson
2023-02-22 2:33 ` [PATCH v3 12/25] target/arm: Introduce ARMMMUIdx_Phys_{Realm,Root} Richard Henderson
2023-02-22 9:44 ` Philippe Mathieu-Daudé
2023-02-22 2:33 ` [PATCH v3 13/25] target/arm: Remove __attribute__((nonnull)) from ptw.c Richard Henderson
2023-02-22 9:44 ` Philippe Mathieu-Daudé
2023-02-24 13:18 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 14/25] target/arm: Pipe ARMSecuritySpace through ptw.c Richard Henderson
2023-02-22 2:33 ` [PATCH v3 15/25] target/arm: NSTable is RES0 for the RME EL3 regime Richard Henderson
2023-02-24 14:28 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 16/25] target/arm: Handle Block and Page bits for security space Richard Henderson
2023-02-24 14:51 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 17/25] target/arm: Handle no-execute for Realm and Root regimes Richard Henderson
2023-02-24 14:58 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 18/25] target/arm: Use get_phys_addr_with_struct in S1_ptw_translate Richard Henderson
2023-02-22 2:33 ` [PATCH v3 19/25] target/arm: Move s1_is_el0 into S1Translate Richard Henderson
2023-02-22 9:46 ` Philippe Mathieu-Daudé
2023-02-22 2:33 ` [PATCH v3 20/25] target/arm: Use get_phys_addr_with_struct for stage2 Richard Henderson
2023-02-22 9:50 ` Philippe Mathieu-Daudé
2023-02-24 15:06 ` Peter Maydell
2023-02-22 2:33 ` [PATCH v3 21/25] target/arm: Add GPC syndrome Richard Henderson
2023-02-22 2:33 ` [PATCH v3 22/25] target/arm: Implement GPC exceptions Richard Henderson
2023-02-22 2:33 ` [PATCH v3 23/25] target/arm: Implement the granule protection check Richard Henderson
2023-02-22 2:33 ` [PATCH NOTFORMERGE v3 24/25] target/arm: Enable RME for -cpu max Richard Henderson
2023-02-22 2:33 ` [PATCH NOTFORMERGE v3 25/25] hw/arm/virt: Add some memory for Realm Management Monitor Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230222023336.915045-5-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).