aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2025-03-07 11:04:15 -0800
committerPeter Maydell <peter.maydell@linaro.org>2025-03-14 12:54:33 +0000
commitcc7abc35dfa790ba6c20473c03745428c1c626b6 (patch)
treef6b469892886a3113024106ae72eca159647619b
parent298a04998fa4a6dc977abe9234d98dfcdab98423 (diff)
downloadqemu-cc7abc35dfa790ba6c20473c03745428c1c626b6.zip
qemu-cc7abc35dfa790ba6c20473c03745428c1c626b6.tar.gz
qemu-cc7abc35dfa790ba6c20473c03745428c1c626b6.tar.bz2
target/arm: Simplify pstate_sm check in sve_access_check
In StreamingMode, fp_access_checked is handled already. We cannot fall through to fp_access_check lest we fall foul of the double-check assertion. Cc: qemu-stable@nongnu.org Fixes: 285b1d5fcef ("target/arm: Handle SME in sve_access_check") Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250307190415.982049-3-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> [PMM: move declaration of 'ret' to top of block] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--target/arm/tcg/translate-a64.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
index 48e0ac7..3901432 100644
--- a/target/arm/tcg/translate-a64.c
+++ b/target/arm/tcg/translate-a64.c
@@ -1456,23 +1456,23 @@ static int fp_access_check_vector_hsd(DisasContext *s, bool is_q, MemOp esz)
bool sve_access_check(DisasContext *s)
{
if (s->pstate_sm || !dc_isar_feature(aa64_sve, s)) {
+ bool ret;
+
assert(dc_isar_feature(aa64_sme, s));
- if (!sme_sm_enabled_check(s)) {
- goto fail_exit;
- }
- } else if (s->sve_excp_el) {
+ ret = sme_sm_enabled_check(s);
+ s->sve_access_checked = (ret ? 1 : -1);
+ return ret;
+ }
+ if (s->sve_excp_el) {
+ /* Assert that we only raise one exception per instruction. */
+ assert(!s->sve_access_checked);
gen_exception_insn_el(s, 0, EXCP_UDEF,
syn_sve_access_trap(), s->sve_excp_el);
- goto fail_exit;
+ s->sve_access_checked = -1;
+ return false;
}
s->sve_access_checked = 1;
return fp_access_check(s);
-
- fail_exit:
- /* Assert that we only raise one exception per instruction. */
- assert(!s->sve_access_checked);
- s->sve_access_checked = -1;
- return false;
}
/*