target/riscv: rvzicbo: Fixup CBO extension register calculation
When running the instruction ``` cbo.flush 0(x0) ``` QEMU would segfault. The issue was in cpu_gpr[a->rs1] as QEMU does not have cpu_gpr[0] allocated. In order to fix this let's use the existing get_address() helper. This also has the benefit of performing pointer mask calculations on the address specified in rs1. The pointer masking specificiation specifically states: """ Cache Management Operations: All instructions in Zicbom, Zicbop and Zicboz """ So this is the correct behaviour and we previously have been incorrectly not masking the address. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reported-by: Fabian Thomas <fabian.thomas@cispa.de> Fixes: e05da09b7cfd ("target/riscv: implement Zicbom extension") Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Cc: qemu-stable <qemu-stable@nongnu.org> Message-ID: <20240514023910.301766-1-alistair.francis@wdc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> (cherry picked from commit c5eb8d6336741dbcb98efcc347f8265bf60bc9d1) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
a58758c5df
commit
fb1be88084
@ -31,27 +31,35 @@
|
||||
static bool trans_cbo_clean(DisasContext *ctx, arg_cbo_clean *a)
|
||||
{
|
||||
REQUIRE_ZICBOM(ctx);
|
||||
gen_helper_cbo_clean_flush(tcg_env, cpu_gpr[a->rs1]);
|
||||
TCGv src = get_address(ctx, a->rs1, 0);
|
||||
|
||||
gen_helper_cbo_clean_flush(tcg_env, src);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_cbo_flush(DisasContext *ctx, arg_cbo_flush *a)
|
||||
{
|
||||
REQUIRE_ZICBOM(ctx);
|
||||
gen_helper_cbo_clean_flush(tcg_env, cpu_gpr[a->rs1]);
|
||||
TCGv src = get_address(ctx, a->rs1, 0);
|
||||
|
||||
gen_helper_cbo_clean_flush(tcg_env, src);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_cbo_inval(DisasContext *ctx, arg_cbo_inval *a)
|
||||
{
|
||||
REQUIRE_ZICBOM(ctx);
|
||||
gen_helper_cbo_inval(tcg_env, cpu_gpr[a->rs1]);
|
||||
TCGv src = get_address(ctx, a->rs1, 0);
|
||||
|
||||
gen_helper_cbo_inval(tcg_env, src);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a)
|
||||
{
|
||||
REQUIRE_ZICBOZ(ctx);
|
||||
gen_helper_cbo_zero(tcg_env, cpu_gpr[a->rs1]);
|
||||
TCGv src = get_address(ctx, a->rs1, 0);
|
||||
|
||||
gen_helper_cbo_zero(tcg_env, src);
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user