target/openrisc: fix icount handling for timer instructions
This patch adds icount handling to mfspr/mtspr instructions that may deal with hardware timers. Signed-off-by: Pavel Dovgalyuk <pavel.dovgalyuk@ispras.ru> Message-Id: <161700376169.1135890.8707223959310729949.stgit@pasha-ThinkPad-X280> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Stafford Horne <shorne@gmail.com>
This commit is contained in:
parent
46967b1a43
commit
b9e40bac9c
@ -884,6 +884,18 @@ static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a)
|
||||
gen_illegal_exception(dc);
|
||||
} else {
|
||||
TCGv spr = tcg_temp_new();
|
||||
|
||||
if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
if (dc->delayed_branch) {
|
||||
tcg_gen_mov_tl(cpu_pc, jmp_pc);
|
||||
tcg_gen_discard_tl(jmp_pc);
|
||||
} else {
|
||||
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next + 4);
|
||||
}
|
||||
dc->base.is_jmp = DISAS_EXIT;
|
||||
}
|
||||
|
||||
tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k);
|
||||
gen_helper_mfspr(cpu_R(dc, a->d), cpu_env, cpu_R(dc, a->d), spr);
|
||||
tcg_temp_free(spr);
|
||||
@ -898,6 +910,9 @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a)
|
||||
} else {
|
||||
TCGv spr;
|
||||
|
||||
if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
/* For SR, we will need to exit the TB to recognize the new
|
||||
* exception state. For NPC, in theory this counts as a branch
|
||||
* (although the SPR only exists for use by an ICE). Save all
|
||||
|
Loading…
Reference in New Issue
Block a user