From fe2372910a09034591fd2cfc2d70cca43fccaa95 Mon Sep 17 00:00:00 2001 From: Leon Alrae Date: Mon, 26 Jan 2015 15:53:16 +0000 Subject: target-mips: fix detection of the end of the page during translation The test is supposed to terminate TB if the end of the page is reached. However, with current implementation it may never succeed for microMIPS or mips16. Reported-by: Richard Henderson Signed-off-by: Leon Alrae Reviewed-by: Maciej W. Rozycki Reviewed-by: Richard Henderson --- target-mips/translate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'target-mips') diff --git a/target-mips/translate.c b/target-mips/translate.c index 881e7fb6d6..a24863c09f 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -19095,6 +19095,7 @@ gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb, CPUMIPSState *env = &cpu->env; DisasContext ctx; target_ulong pc_start; + target_ulong next_page_start; CPUBreakpoint *bp; int j, lj = -1; int num_insns; @@ -19106,6 +19107,7 @@ gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb, qemu_log("search pc %d\n", search_pc); pc_start = tb->pc; + next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; ctx.pc = pc_start; ctx.saved_pc = -1; ctx.singlestep_enabled = cs->singlestep_enabled; @@ -19204,8 +19206,9 @@ gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb, break; } - if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) + if (ctx.pc >= next_page_start) { break; + } if (tcg_op_buf_full()) { break; -- cgit v1.2.3