From nobody Tue Dec 16 05:38:17 2025 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 1519944985801465.517542169839; Thu, 1 Mar 2018 14:56:25 -0800 (PST) Received: from localhost ([::1]:59631 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erX7d-0001lO-EX for importer@patchew.org; Thu, 01 Mar 2018 17:56:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erX5V-0000KB-JW for qemu-devel@nongnu.org; Thu, 01 Mar 2018 17:54:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erX5O-0004rv-N3 for qemu-devel@nongnu.org; Thu, 01 Mar 2018 17:54:09 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:35543) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1erX5O-0004rK-Eo for qemu-devel@nongnu.org; Thu, 01 Mar 2018 17:54:02 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 0520D2112E; Thu, 1 Mar 2018 17:54:02 -0500 (EST) Received: from frontend2 ([10.202.2.161]) by compute4.internal (MEProxy); Thu, 01 Mar 2018 17:54:02 -0500 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id A5C8E2483A; Thu, 1 Mar 2018 17:54:01 -0500 (EST) 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=XTbbUfdxMsawfQ pRz1Ud9tceVWyXOi3z4BQI8UU3Kd0=; b=WSBpzv8KfQ7NfRquORo3qp9nY5TusJ 7UnvHpHu/tOHx+wNz+/c9/i89KdYphsJq+pnF4NqlIu+RCunX9QKJ9MWdr++7sZ9 /jMnNmkc3DuwrjATvVqsO+1mt6PLyOuU34yh9+dkk7xPPhjS/SPqAaB5MKdtfeGQ AkKgAqwaoCFwA= 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=XTbbUfdxMsawfQpRz1Ud9tceVWyXOi3z4BQI8UU3Kd0=; b=bfxSUUqP trOjZ/gk9Msb3/00+jfHqfp/nDoxHNvC8jJ8IIB2A+1YGqIC/stFT1gOAmDfjDVA fZDgDYsCM/IvJhTaJmjSRihLkOiHk2qqpNZ0QSsx6YlwpnKo07MlomURSU7FE7CG dLbSagp6kzHghYeUmZqQvBznc6JFhsTNmaY761UyA0ZlcjbIzRk8RHX6TcGImLWw 720BKM8y5qltCifS6MVG6bxjgrTCTdDABlmAFA9B/rfO/fyTocXmdwZBLH+mLP/X TTaGF0cOI64TpMRKhQueem9+ojxhaVxDnUC/DDb85tZ2ONn0J4yBSzygHdXs7F/2 /QwMjQduqtKpZA== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:53:57 -0500 Message-Id: <1519944838-12430-14-git-send-email-cota@braap.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1519944838-12430-1-git-send-email-cota@braap.org> References: <1519944838-12430-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] [PATCHv1 13/14] target/openrisc: convert to DisasContextBase 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: Stafford Horne , Richard Henderson 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" While at it, set is_jmp to DISAS_NORETURN when generating an exception. Cc: Stafford Horne Signed-off-by: Emilio G. Cota --- target/openrisc/translate.c | 93 ++++++++++++++++++++++-------------------= ---- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c index 2747b24..b37414f 100644 --- a/target/openrisc/translate.c +++ b/target/openrisc/translate.c @@ -36,7 +36,8 @@ #include "exec/log.h" =20 #define LOG_DIS(str, ...) \ - qemu_log_mask(CPU_LOG_TB_IN_ASM, "%08x: " str, dc->pc, ## __VA_ARGS__) + qemu_log_mask(CPU_LOG_TB_IN_ASM, "%08x: " str, dc->base.pc_next, \ + ## __VA_ARGS__) =20 /* is_jmp field values */ #define DISAS_JUMP DISAS_TARGET_0 /* only pc was modified dynamically */ @@ -44,13 +45,10 @@ #define DISAS_TB_JUMP DISAS_TARGET_2 /* only pc was modified statically */ =20 typedef struct DisasContext { - TranslationBlock *tb; - target_ulong pc; - uint32_t is_jmp; + DisasContextBase base; uint32_t mem_idx; uint32_t tb_flags; uint32_t delayed_branch; - bool singlestep_enabled; } DisasContext; =20 static TCGv cpu_sr; @@ -126,9 +124,9 @@ static void gen_exception(DisasContext *dc, unsigned in= t excp) =20 static void gen_illegal_exception(DisasContext *dc) { - tcg_gen_movi_tl(cpu_pc, dc->pc); + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); gen_exception(dc, EXCP_ILLEGAL); - dc->is_jmp =3D DISAS_UPDATE; + dc->base.is_jmp =3D DISAS_NORETURN; } =20 /* not used yet, open it when we need or64. */ @@ -166,12 +164,12 @@ static void check_ov64s(DisasContext *dc) =20 static inline bool use_goto_tb(DisasContext *dc, target_ulong dest) { - if (unlikely(dc->singlestep_enabled)) { + if (unlikely(dc->base.singlestep_enabled)) { return false; } =20 #ifndef CONFIG_USER_ONLY - return (dc->tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAGE_MASK= ); + return (dc->base.tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAGE= _MASK); #else return true; #endif @@ -182,10 +180,10 @@ static void gen_goto_tb(DisasContext *dc, int n, targ= et_ulong dest) if (use_goto_tb(dc, dest)) { tcg_gen_movi_tl(cpu_pc, dest); tcg_gen_goto_tb(n); - tcg_gen_exit_tb((uintptr_t)dc->tb + n); + tcg_gen_exit_tb((uintptr_t)dc->base.tb + n); } else { tcg_gen_movi_tl(cpu_pc, dest); - if (dc->singlestep_enabled) { + if (dc->base.singlestep_enabled) { gen_exception(dc, EXCP_DEBUG); } tcg_gen_exit_tb(0); @@ -194,16 +192,16 @@ static void gen_goto_tb(DisasContext *dc, int n, targ= et_ulong dest) =20 static void gen_jump(DisasContext *dc, int32_t n26, uint32_t reg, uint32_t= op0) { - target_ulong tmp_pc =3D dc->pc + n26 * 4; + target_ulong tmp_pc =3D dc->base.pc_next + n26 * 4; =20 switch (op0) { case 0x00: /* l.j */ tcg_gen_movi_tl(jmp_pc, tmp_pc); break; case 0x01: /* l.jal */ - tcg_gen_movi_tl(cpu_R[9], dc->pc + 8); + tcg_gen_movi_tl(cpu_R[9], dc->base.pc_next + 8); /* Optimize jal being used to load the PC for PIC. */ - if (tmp_pc =3D=3D dc->pc + 8) { + if (tmp_pc =3D=3D dc->base.pc_next + 8) { return; } tcg_gen_movi_tl(jmp_pc, tmp_pc); @@ -211,7 +209,7 @@ static void gen_jump(DisasContext *dc, int32_t n26, uin= t32_t reg, uint32_t op0) case 0x03: /* l.bnf */ case 0x04: /* l.bf */ { - TCGv t_next =3D tcg_const_tl(dc->pc + 8); + TCGv t_next =3D tcg_const_tl(dc->base.pc_next + 8); TCGv t_true =3D tcg_const_tl(tmp_pc); TCGv t_zero =3D tcg_const_tl(0); =20 @@ -227,7 +225,7 @@ static void gen_jump(DisasContext *dc, int32_t n26, uin= t32_t reg, uint32_t op0) tcg_gen_mov_tl(jmp_pc, cpu_R[reg]); break; case 0x12: /* l.jalr */ - tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8)); + tcg_gen_movi_tl(cpu_R[9], (dc->base.pc_next + 8)); tcg_gen_mov_tl(jmp_pc, cpu_R[reg]); break; default: @@ -795,7 +793,7 @@ static void dec_misc(DisasContext *dc, uint32_t insn) return; } gen_helper_rfe(cpu_env); - dc->is_jmp =3D DISAS_UPDATE; + dc->base.is_jmp =3D DISAS_UPDATE; #endif } break; @@ -1254,15 +1252,16 @@ static void dec_sys(DisasContext *dc, uint32_t insn) switch (op0) { case 0x000: /* l.sys */ LOG_DIS("l.sys %d\n", K16); - tcg_gen_movi_tl(cpu_pc, dc->pc); + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); gen_exception(dc, EXCP_SYSCALL); - dc->is_jmp =3D DISAS_UPDATE; + dc->base.is_jmp =3D DISAS_NORETURN; break; =20 case 0x100: /* l.trap */ LOG_DIS("l.trap %d\n", K16); - tcg_gen_movi_tl(cpu_pc, dc->pc); + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); gen_exception(dc, EXCP_TRAP); + dc->base.is_jmp =3D DISAS_NORETURN; break; =20 case 0x300: /* l.csync */ @@ -1479,7 +1478,7 @@ static void disas_openrisc_insn(DisasContext *dc, Ope= nRISCCPU *cpu) { uint32_t op0; uint32_t insn; - insn =3D cpu_ldl_code(&cpu->env, dc->pc); + insn =3D cpu_ldl_code(&cpu->env, dc->base.pc_next); op0 =3D extract32(insn, 26, 6); =20 switch (op0) { @@ -1532,14 +1531,15 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) int max_insns; =20 pc_start =3D tb->pc; - dc->tb =3D tb; =20 - dc->is_jmp =3D DISAS_NEXT; - dc->pc =3D pc_start; + dc->base.tb =3D tb; + dc->base.singlestep_enabled =3D cs->singlestep_enabled; + dc->base.pc_next =3D pc_start; + dc->base.is_jmp =3D DISAS_NEXT; + dc->mem_idx =3D cpu_mmu_index(&cpu->env, false); - dc->tb_flags =3D tb->flags; + dc->tb_flags =3D dc->base.tb->flags; dc->delayed_branch =3D (dc->tb_flags & TB_FLAGS_DFLAG) !=3D 0; - dc->singlestep_enabled =3D cs->singlestep_enabled; =20 next_page_start =3D (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; num_insns =3D 0; @@ -1570,19 +1570,19 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) } =20 do { - tcg_gen_insn_start(dc->pc, (dc->delayed_branch ? 1 : 0) + tcg_gen_insn_start(dc->base.pc_next, (dc->delayed_branch ? 1 : 0) | (num_insns ? 2 : 0)); num_insns++; =20 - if (unlikely(cpu_breakpoint_test(cs, dc->pc, BP_ANY))) { - tcg_gen_movi_tl(cpu_pc, dc->pc); + if (unlikely(cpu_breakpoint_test(cs, dc->base.pc_next, BP_ANY))) { + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); gen_exception(dc, EXCP_DEBUG); - dc->is_jmp =3D DISAS_UPDATE; + dc->base.is_jmp =3D DISAS_NORETURN; /* The address covered by the breakpoint must be included in [tb->pc, tb->pc + tb->size) in order to for it to be properly cleared -- thus we increment the PC here so that the logic setting tb->size below does the right thing. */ - dc->pc +=3D 4; + dc->base.pc_next +=3D 4; break; } =20 @@ -1590,7 +1590,7 @@ void gen_intermediate_code(CPUState *cs, struct Trans= lationBlock *tb) gen_io_start(); } disas_openrisc_insn(dc, cpu); - dc->pc =3D dc->pc + 4; + dc->base.pc_next +=3D 4; =20 /* delay slot */ if (dc->delayed_branch) { @@ -1598,15 +1598,15 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) if (!dc->delayed_branch) { tcg_gen_mov_tl(cpu_pc, jmp_pc); tcg_gen_discard_tl(jmp_pc); - dc->is_jmp =3D DISAS_UPDATE; + dc->base.is_jmp =3D DISAS_UPDATE; break; } } - } while (!dc->is_jmp + } while (!dc->base.is_jmp && !tcg_op_buf_full() - && !cs->singlestep_enabled + && !dc->base.singlestep_enabled && !singlestep - && (dc->pc < next_page_start) + && (dc->base.pc_next < next_page_start) && num_insns < max_insns); =20 if (tb_cflags(tb) & CF_LAST_IO) { @@ -1617,35 +1617,34 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) tcg_gen_movi_i32(cpu_dflag, dc->delayed_branch !=3D 0); } =20 - tcg_gen_movi_tl(cpu_ppc, dc->pc - 4); - if (dc->is_jmp =3D=3D DISAS_NEXT) { - dc->is_jmp =3D DISAS_UPDATE; - tcg_gen_movi_tl(cpu_pc, dc->pc); + tcg_gen_movi_tl(cpu_ppc, dc->base.pc_next - 4); + if (dc->base.is_jmp =3D=3D DISAS_NEXT) { + dc->base.is_jmp =3D DISAS_UPDATE; + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); } - if (unlikely(cs->singlestep_enabled)) { + if (unlikely(dc->base.singlestep_enabled)) { gen_exception(dc, EXCP_DEBUG); } else { - switch (dc->is_jmp) { + switch (dc->base.is_jmp) { case DISAS_NEXT: - gen_goto_tb(dc, 0, dc->pc); + gen_goto_tb(dc, 0, dc->base.pc_next); break; default: + case DISAS_NORETURN: case DISAS_JUMP: + case DISAS_TB_JUMP: break; case DISAS_UPDATE: /* indicate that the hash table must be used to find the next TB */ tcg_gen_exit_tb(0); break; - case DISAS_TB_JUMP: - /* nothing more to generate */ - break; } } =20 gen_tb_end(tb, num_insns); =20 - tb->size =3D dc->pc - pc_start; + tb->size =3D dc->base.pc_next - pc_start; tb->icount =3D num_insns; =20 if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) --=20 2.7.4