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);
|
||||
s->base.is_jmp = DISAS_NORETURN;
|
||||
return true;
|
||||
} else {
|
||||
if (s->sew == 3) {
|
||||
if (!is_32bit(s)) {
|
||||
fn = fnsd[seq];
|
||||
} else {
|
||||
/* Check done in amo_check(). */
|
||||
g_assert_not_reached();
|
||||
}
|
||||
} else {
|
||||
assert(seq < ARRAY_SIZE(fnsw));
|
||||
fn = fnsw[seq];
|
||||
}
|
||||
}
|
||||
|
||||
switch (s->sew) {
|
||||
case 0 ... 2:
|
||||
assert(seq < ARRAY_SIZE(fnsw));
|
||||
fn = fnsw[seq];
|
||||
break;
|
||||
case 3:
|
||||
/* XLEN check done in amo_check(). */
|
||||
assert(seq < ARRAY_SIZE(fnsd));
|
||||
fn = fnsd[seq];
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
|
||||
|
Loading…
Reference in New Issue
Block a user