OSDN Git Service

target/riscv: Fix checking of whether instruciton at 'pc_next' spans pages
authorShaobo Song <songshaobo@eswincomputing.com>
Mon, 20 Feb 2023 07:27:32 +0000 (07:27 +0000)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 2 Mar 2023 00:59:36 +0000 (16:59 -0800)
This bug has a noticeable behavior of falling back to the main loop and
respawning a redundant translation block including a single instruction
when the end address of the compressive instruction is exactly on a page
boundary, and slows down running system performance.

Signed-off-by: Shaobo Song <songshaobo@eswincomputing.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20230220072732.568-1-songshaobo@eswincomputing.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
target/riscv/translate.c

index 772f9d7..8ffa211 100644 (file)
@@ -1261,7 +1261,7 @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
                 uint16_t next_insn = cpu_lduw_code(env, ctx->base.pc_next);
                 int len = insn_len(next_insn);
 
-                if (!is_same_page(&ctx->base, ctx->base.pc_next + len)) {
+                if (!is_same_page(&ctx->base, ctx->base.pc_next + len - 1)) {
                     ctx->base.is_jmp = DISAS_TOO_MANY;
                 }
             }