From nobody Tue Feb 10 05:26:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1523039307825476.5545779286141; Fri, 6 Apr 2018 11:28:27 -0700 (PDT) Received: from localhost ([::1]:45428 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W66-0002AS-Rz for importer@patchew.org; Fri, 06 Apr 2018 14:28:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48686) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy7-0003lP-Ml for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy4-0000UI-7Y for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:11 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:48029) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy4-0000Tk-1h for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:08 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id B9BCF20F2D; Fri, 6 Apr 2018 14:20:07 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:07 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 75EF71025C; Fri, 6 Apr 2018 14:20:07 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=braap.org; h=cc :date:from:in-reply-to:message-id:references:subject:to :x-me-sender:x-me-sender:x-sasl-enc; s=mesmtp; bh=xEkmH7m2r2zPnt zlit3XGOPUOeC5bvfDSkh+XiPdSbA=; b=OyRMbgsQMbQiNIPF/kkHg5loZ6MKd4 jeXFzl/sn+1nmY9jzez/Fqb5iilnF+hquxY6IiAzNiPOAOfoIMG8DHusBl9ajHLd vYtRWTbrYA2y5p+IqTyorAJBoDq1/nblq1JyYeQClwZOHZrjM1zITdHKlpUiT0wN uzSDpqNgOsOlc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=xEkmH7m2r2zPntzlit3XGOPUOeC5bvfDSkh+XiPdSbA=; b=iiqDB05W ghCt1LiS1NNCYYe+PbwlCOPxZ5rH+/agADVTwhOlZ7m4ye2tzi2zxmRcyRd18PTc 8b99vUQlvh++Auyy/c3w2w/LzagPtIsRCs+hNAbtG2uCuVsNoYodR1TrzMTZs/qq 8lZMTNgTmQvntleiDThTyfFB6v0ju/MIp5Xe5UoWgVbvRWvsHHq8K7KJpfgcKKFP Wx4KmMSlzRg/fDLip4Yhwfof6WhY1O9xxUWZPyZPZLmiIHcCByWy1qSo/dCj2p5Y zDHiFum6KR64dLwoKthVK32Ogj0D8uWBuBU0QFyDhXqAiv8sMiAfLViloXX637hf mWRQybEaXrnuhQ== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:58 -0400 Message-Id: <1523038800-2494-16-git-send-email-cota@braap.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523038800-2494-1-git-send-email-cota@braap.org> References: <1523038800-2494-1-git-send-email-cota@braap.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.111.4.29 Subject: [Qemu-devel] [PATCH v2 15/17] target/riscv: convert to DisasJumpType X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bastian Koppelmann , Michael Clark , Richard Henderson , Sagar Karandikar , Palmer Dabbelt Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Cc: Michael Clark Cc: Palmer Dabbelt Cc: Sagar Karandikar Cc: Bastian Koppelmann Signed-off-by: Emilio G. Cota Reviewed-by: Bastian Koppelmann Reviewed-by: Richard Henderson --- target/riscv/translate.c | 72 +++++++++++++++++++-------------------------= ---- 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 808eab7..a5c25ab 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -26,6 +26,7 @@ #include "exec/helper-proto.h" #include "exec/helper-gen.h" =20 +#include "exec/translator.h" #include "exec/log.h" =20 #include "instmap.h" @@ -46,7 +47,7 @@ typedef struct DisasContext { uint32_t flags; uint32_t mem_idx; int singlestep_enabled; - int bstate; + DisasJumpType is_jmp; /* Remember the rounding mode encoded in the previous fp instruction, which we have already installed into env->fp_status. Or -1 for no previous fp instruction. Note that we exit the TB when writing @@ -55,13 +56,6 @@ typedef struct DisasContext { int frm; } DisasContext; =20 -enum { - BS_NONE =3D 0, /* When seen outside of translation while loop, ind= icates - need to exit tb due to end of page. */ - BS_STOP =3D 1, /* Need to exit tb for syscall, sret, etc. */ - BS_BRANCH =3D 2, /* Need to exit tb for branch, jal, etc. */ -}; - /* convert riscv funct3 to qemu memop for load/store */ static const int tcg_memop_lookup[8] =3D { [0 ... 7] =3D -1, @@ -88,7 +82,7 @@ static void generate_exception(DisasContext *ctx, int exc= p) TCGv_i32 helper_tmp =3D tcg_const_i32(excp); gen_helper_raise_exception(cpu_env, helper_tmp); tcg_temp_free_i32(helper_tmp); - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } =20 static void generate_exception_mbadaddr(DisasContext *ctx, int excp) @@ -98,7 +92,7 @@ static void generate_exception_mbadaddr(DisasContext *ctx= , int excp) TCGv_i32 helper_tmp =3D tcg_const_i32(excp); gen_helper_raise_exception(cpu_env, helper_tmp); tcg_temp_free_i32(helper_tmp); - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } =20 static void gen_exception_debug(void) @@ -532,7 +526,7 @@ static void gen_jal(CPURISCVState *env, DisasContext *c= tx, int rd, } =20 gen_goto_tb(ctx, 0, ctx->pc + imm); /* must use this for safety */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } =20 static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, @@ -563,7 +557,7 @@ static void gen_jalr(CPURISCVState *env, DisasContext *= ctx, uint32_t opc, gen_set_label(misaligned); gen_exception_inst_addr_mis(ctx); } - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; break; =20 default: @@ -617,7 +611,7 @@ static void gen_branch(CPURISCVState *env, DisasContext= *ctx, uint32_t opc, } else { gen_goto_tb(ctx, 0, ctx->pc + bimm); } - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } =20 static void gen_load(DisasContext *ctx, uint32_t opc, int rd, int rs1, @@ -1345,12 +1339,12 @@ static void gen_system(CPURISCVState *env, DisasCon= text *ctx, uint32_t opc, /* always generates U-level ECALL, fixed in do_interrupt handl= er */ generate_exception(ctx, RISCV_EXCP_U_ECALL); tcg_gen_exit_tb(0); /* no chaining */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; break; case 0x1: /* EBREAK */ generate_exception(ctx, RISCV_EXCP_BREAKPOINT); tcg_gen_exit_tb(0); /* no chaining */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; break; #ifndef CONFIG_USER_ONLY case 0x002: /* URET */ @@ -1360,7 +1354,7 @@ static void gen_system(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, if (riscv_has_ext(env, RVS)) { gen_helper_sret(cpu_pc, cpu_env, cpu_pc); tcg_gen_exit_tb(0); /* no chaining */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } else { gen_exception_illegal(ctx); } @@ -1371,7 +1365,7 @@ static void gen_system(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, case 0x302: /* MRET */ gen_helper_mret(cpu_pc, cpu_env, cpu_pc); tcg_gen_exit_tb(0); /* no chaining */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; break; case 0x7b2: /* DRET */ gen_exception_illegal(ctx); @@ -1418,7 +1412,7 @@ static void gen_system(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, /* end tb since we may be changing priv modes, to get mmu_index ri= ght */ tcg_gen_movi_tl(cpu_pc, ctx->next_pc); tcg_gen_exit_tb(0); /* no chaining */ - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; break; } tcg_temp_free(source1); @@ -1811,7 +1805,7 @@ static void decode_RV32_64G(CPURISCVState *env, Disas= Context *ctx) * however we need to end the translation block */ tcg_gen_movi_tl(cpu_pc, ctx->next_pc); tcg_gen_exit_tb(0); - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; } else { /* FENCE is a full memory barrier. */ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC); @@ -1861,7 +1855,7 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock *tb) ctx.singlestep_enabled =3D cs->singlestep_enabled; =20 ctx.tb =3D tb; - ctx.bstate =3D BS_NONE; + ctx.is_jmp =3D DISAS_NEXT; ctx.flags =3D tb->flags; ctx.mem_idx =3D tb->flags & TB_FLAGS_MMU_MASK; ctx.frm =3D -1; /* unknown rounding mode */ @@ -1876,13 +1870,13 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) } gen_tb_start(tb); =20 - while (ctx.bstate =3D=3D BS_NONE) { + while (ctx.is_jmp =3D=3D DISAS_NEXT) { tcg_gen_insn_start(ctx.pc); num_insns++; =20 if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) { tcg_gen_movi_tl(cpu_pc, ctx.pc); - ctx.bstate =3D BS_BRANCH; + ctx.is_jmp =3D DISAS_NORETURN; gen_exception_debug(); /* The address covered by the breakpoint must be included in [tb->pc, tb->pc + tb->size) in order to for it to be @@ -1900,31 +1894,20 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) decode_opc(env, &ctx); ctx.pc =3D ctx.next_pc; =20 - if (cs->singlestep_enabled) { - break; - } - if (ctx.pc >=3D next_page_start) { - break; - } - if (tcg_op_buf_full()) { - break; + if (ctx.is_jmp =3D=3D DISAS_NEXT && + (cs->singlestep_enabled || + ctx.pc >=3D next_page_start || + tcg_op_buf_full() || + num_insns >=3D max_insns || + singlestep)) { + ctx.is_jmp =3D DISAS_TOO_MANY; } - if (num_insns >=3D max_insns) { - break; - } - if (singlestep) { - break; - } - } if (tb->cflags & CF_LAST_IO) { gen_io_end(); } - switch (ctx.bstate) { - case BS_STOP: - gen_goto_tb(&ctx, 0, ctx.pc); - break; - case BS_NONE: /* handle end of page - DO NOT CHAIN. See gen_goto_tb. */ + switch (ctx.is_jmp) { + case DISAS_TOO_MANY: tcg_gen_movi_tl(cpu_pc, ctx.pc); if (cs->singlestep_enabled) { gen_exception_debug(); @@ -1932,9 +1915,10 @@ void gen_intermediate_code(CPUState *cs, Translation= Block *tb) tcg_gen_exit_tb(0); } break; - case BS_BRANCH: /* ops using BS_BRANCH generate own exit seq */ - default: + case DISAS_NORETURN: break; + default: + g_assert_not_reached(); } done_generating: gen_tb_end(tb, num_insns); --=20 2.7.4