mirror of https://github.com/proxmox/mirror_qemu
target/riscv: Fix itrigger when icount is used
When I boot a ubuntu image, QEMU output a "Bad icount read" message and exit. The reason is that when execute helper_mret or helper_sret, it will cause a call to icount_get_raw_locked (), which needs set can_do_io flag on cpustate. Thus we setting this flag when execute these two instructions. Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20230324064011.976-1-zhiwei_liu@linux.alibaba.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>master
parent
00d312bd78
commit
df3ac6da47
|
@ -77,6 +77,9 @@ static bool trans_sret(DisasContext *ctx, arg_sret *a)
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
if (has_ext(ctx, RVS)) {
|
if (has_ext(ctx, RVS)) {
|
||||||
decode_save_opc(ctx);
|
decode_save_opc(ctx);
|
||||||
|
if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
|
||||||
|
gen_io_start();
|
||||||
|
}
|
||||||
gen_helper_sret(cpu_pc, cpu_env);
|
gen_helper_sret(cpu_pc, cpu_env);
|
||||||
exit_tb(ctx); /* no chaining */
|
exit_tb(ctx); /* no chaining */
|
||||||
ctx->base.is_jmp = DISAS_NORETURN;
|
ctx->base.is_jmp = DISAS_NORETURN;
|
||||||
|
@ -93,6 +96,9 @@ static bool trans_mret(DisasContext *ctx, arg_mret *a)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
decode_save_opc(ctx);
|
decode_save_opc(ctx);
|
||||||
|
if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
|
||||||
|
gen_io_start();
|
||||||
|
}
|
||||||
gen_helper_mret(cpu_pc, cpu_env);
|
gen_helper_mret(cpu_pc, cpu_env);
|
||||||
exit_tb(ctx); /* no chaining */
|
exit_tb(ctx); /* no chaining */
|
||||||
ctx->base.is_jmp = DISAS_NORETURN;
|
ctx->base.is_jmp = DISAS_NORETURN;
|
||||||
|
|
Loading…
Reference in New Issue