mirror of https://github.com/xemu-project/xemu.git
target/arm/sme: Reorg SME access handling in handle_msr_i()
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20230112102436.1913-2-philmd@linaro.org Message-Id: <20230112004322.161330-1-richard.henderson@linaro.org> [PMD: Split patch in multiple tiny steps] Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
500a64d82b
commit
535ca76425
|
@ -1841,18 +1841,20 @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
|
|||
goto do_unallocated;
|
||||
}
|
||||
if (sme_access_check(s)) {
|
||||
bool i = crm & 1;
|
||||
bool changed = false;
|
||||
int old = s->pstate_sm | (s->pstate_za << 1);
|
||||
int new = (crm & 1) * 3;
|
||||
int msk = (crm >> 1) & 3;
|
||||
|
||||
if ((crm & 2) && i != s->pstate_sm) {
|
||||
gen_helper_set_pstate_sm(cpu_env, tcg_constant_i32(i));
|
||||
changed = true;
|
||||
}
|
||||
if ((crm & 4) && i != s->pstate_za) {
|
||||
gen_helper_set_pstate_za(cpu_env, tcg_constant_i32(i));
|
||||
changed = true;
|
||||
}
|
||||
if (changed) {
|
||||
if ((old ^ new) & msk) {
|
||||
/* At least one bit changes. */
|
||||
bool i = crm & 1;
|
||||
|
||||
if ((crm & 2) && i != s->pstate_sm) {
|
||||
gen_helper_set_pstate_sm(cpu_env, tcg_constant_i32(i));
|
||||
}
|
||||
if ((crm & 4) && i != s->pstate_za) {
|
||||
gen_helper_set_pstate_za(cpu_env, tcg_constant_i32(i));
|
||||
}
|
||||
gen_rebuild_hflags(s);
|
||||
} else {
|
||||
s->base.is_jmp = DISAS_NEXT;
|
||||
|
|
Loading…
Reference in New Issue