From: James Hogan Date: Wed, 2 Aug 2017 09:59:17 +0000 (+0100) Subject: target/mips: Fix RDHWR CC with icount X-Git-Tag: v2.10.0-rc2~8^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d673a68db6963e86536b125af464bb6ed03eba33;p=thirdparty%2Fqemu.git target/mips: Fix RDHWR CC with icount RDHWR CC reads the CPU timer like MFC0 CP0_Count, so with icount enabled it must set can_do_io while it calls the helper to avoid the "Bad icount read" error. It should also break out of the translation loop to ensure that timer interrupts are immediately handled. Fixes: 2e70f6efa8b9 ("Add instruction counter.") Signed-off-by: James Hogan Cc: Aurelien Jarno Cc: Yongbok Kim Reviewed-by: Richard Henderson Signed-off-by: Yongbok Kim --- diff --git a/target/mips/translate.c b/target/mips/translate.c index bcea2a149ef..c78d27294c6 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -10755,8 +10755,19 @@ static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel) gen_store_gpr(t0, rt); break; case 2: + if (ctx->tb->cflags & CF_USE_ICOUNT) { + gen_io_start(); + } gen_helper_rdhwr_cc(t0, cpu_env); + if (ctx->tb->cflags & CF_USE_ICOUNT) { + gen_io_end(); + } gen_store_gpr(t0, rt); + /* Break the TB to be able to take timer interrupts immediately + after reading count. BS_STOP isn't sufficient, we need to ensure + we break completely out of translated code. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; break; case 3: gen_helper_rdhwr_ccres(t0, cpu_env);