mirror of https://github.com/xemu-project/xemu.git
target/riscv: Properly check SEW in amo_op
We're currently assuming SEW <= 3, and the "else" from the SEW == 3 must be less. Use a switch and explicitly bound both SEW and SEQ for all cases. Reviewed-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20211020031709.359469-8-richard.henderson@linaro.org Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
fbb48032e4
commit
4e97d459a0
|
@ -704,18 +704,20 @@ static bool amo_op(DisasContext *s, arg_rwdvm *a, uint8_t seq)
|
||||||
gen_helper_exit_atomic(cpu_env);
|
gen_helper_exit_atomic(cpu_env);
|
||||||
s->base.is_jmp = DISAS_NORETURN;
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
}
|
||||||
if (s->sew == 3) {
|
|
||||||
if (!is_32bit(s)) {
|
switch (s->sew) {
|
||||||
fn = fnsd[seq];
|
case 0 ... 2:
|
||||||
} else {
|
assert(seq < ARRAY_SIZE(fnsw));
|
||||||
/* Check done in amo_check(). */
|
fn = fnsw[seq];
|
||||||
g_assert_not_reached();
|
break;
|
||||||
}
|
case 3:
|
||||||
} else {
|
/* XLEN check done in amo_check(). */
|
||||||
assert(seq < ARRAY_SIZE(fnsw));
|
assert(seq < ARRAY_SIZE(fnsd));
|
||||||
fn = fnsw[seq];
|
fn = fnsd[seq];
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
||||||
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
|
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
|
||||||
|
|
Loading…
Reference in New Issue