From nobody Tue May 7 23:22:28 2024 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 1523039125139467.7674198076983; Fri, 6 Apr 2018 11:25:25 -0700 (PDT) Received: from localhost ([::1]:45405 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W38-0007nx-37 for importer@patchew.org; Fri, 06 Apr 2018 14:25:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48616) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kV-74 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy0-0000Qc-8F for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:52953) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vxz-0000PG-WD for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:04 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id A766220D9A; Fri, 6 Apr 2018 14:20:01 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:01 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 57DCE1025B; Fri, 6 Apr 2018 14:20:01 -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=4kqDF2yR+VB8Bu rYNQOCiC7VCQcyYGz+kfK5Gd51Ewk=; b=iAi05eaEABdui3DLjSkW+RCt6HuTIG AdoJF1g4XT+Fb/0a99SO9Y11GkOvMuByCkhWZcZqUInIOAs0MlSVp9Wpm70a8ECS 2Bmw0h7qBB7Zu4ymOAp5G1mU929mYf3oNwFClhfKSCrM3Z4tMLRAMKalhBF9gqPB JEhGbuWvSxoSU= 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=4kqDF2yR+VB8BurYNQOCiC7VCQcyYGz+kfK5Gd51Ewk=; b=Q3ntMA7l P1LmLnm+IdQ0hwQLIffcd4dRV+LoEA900ZYLuXXNDuVdxacCmfXrtmWkHUlILeCH 6yZwYGVGwqX8PiYwcRR52/kmltJLa90nzMBmLGtMejVV5KwY7UHFm3HntmmkEvB5 6lxfBzD9Dq+YojVAPRkOWIfZ3LvUR9RNdu8rKNML6SsnsaZij00Y2fXRq3sA7H/B eav+FBNTQ1RGIlb7Di3sIdeSWM2qaLQHou7LCESrqLkp9b3670QwYGMyP8tLzou0 CdUyyFIXhf7xdj9fxUdUIFpXD50FyrFBNWPyBm1E97Wk/q4yVDKs4ssYGyDAzsHU CsYPsDZUx/FnfA== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:44 -0400 Message-Id: <1523038800-2494-2-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 01/17] translator: merge max_insns into 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: 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, use int for both num_insns and max_insns to make sure we have same-type comparisons. Reviewed-by: Richard Henderson Signed-off-by: Emilio G. Cota --- include/exec/translator.h | 8 ++++---- accel/tcg/translator.c | 21 ++++++++++----------- target/alpha/translate.c | 6 ++---- target/arm/translate-a64.c | 8 +++----- target/arm/translate.c | 9 +++------ target/hppa/translate.c | 7 ++----- target/i386/translate.c | 5 +---- target/ppc/translate.c | 5 ++--- 8 files changed, 27 insertions(+), 42 deletions(-) diff --git a/include/exec/translator.h b/include/exec/translator.h index e2dc2a0..71e7b2c 100644 --- a/include/exec/translator.h +++ b/include/exec/translator.h @@ -58,6 +58,7 @@ typedef enum DisasJumpType { * disassembly). * @is_jmp: What instruction to disassemble next. * @num_insns: Number of translated instructions (including current). + * @max_insns: Maximum number of instructions to be translated in this TB. * @singlestep_enabled: "Hardware" single stepping enabled. * * Architecture-agnostic disassembly context. @@ -67,7 +68,8 @@ typedef struct DisasContextBase { target_ulong pc_first; target_ulong pc_next; DisasJumpType is_jmp; - unsigned int num_insns; + int num_insns; + int max_insns; bool singlestep_enabled; } DisasContextBase; =20 @@ -76,7 +78,6 @@ typedef struct DisasContextBase { * @init_disas_context: * Initialize the target-specific portions of DisasContext struct. * The generic DisasContextBase has already been initialized. - * Return max_insns, modified as necessary by db->tb->flags. * * @tb_start: * Emit any code required before the start of the main loop, @@ -106,8 +107,7 @@ typedef struct DisasContextBase { * Print instruction disassembly to log. */ typedef struct TranslatorOps { - int (*init_disas_context)(DisasContextBase *db, CPUState *cpu, - int max_insns); + void (*init_disas_context)(DisasContextBase *db, CPUState *cpu); void (*tb_start)(DisasContextBase *db, CPUState *cpu); void (*insn_start)(DisasContextBase *db, CPUState *cpu); bool (*breakpoint_check)(DisasContextBase *db, CPUState *cpu, diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c index 23c6602..0f9dca9 100644 --- a/accel/tcg/translator.c +++ b/accel/tcg/translator.c @@ -34,8 +34,6 @@ void translator_loop_temp_check(DisasContextBase *db) void translator_loop(const TranslatorOps *ops, DisasContextBase *db, CPUState *cpu, TranslationBlock *tb) { - int max_insns; - /* Initialize DisasContext */ db->tb =3D tb; db->pc_first =3D tb->pc; @@ -45,18 +43,18 @@ void translator_loop(const TranslatorOps *ops, DisasCon= textBase *db, db->singlestep_enabled =3D cpu->singlestep_enabled; =20 /* Instruction counting */ - max_insns =3D tb_cflags(db->tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; + db->max_insns =3D tb_cflags(db->tb) & CF_COUNT_MASK; + if (db->max_insns =3D=3D 0) { + db->max_insns =3D CF_COUNT_MASK; } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; + if (db->max_insns > TCG_MAX_INSNS) { + db->max_insns =3D TCG_MAX_INSNS; } if (db->singlestep_enabled || singlestep) { - max_insns =3D 1; + db->max_insns =3D 1; } =20 - max_insns =3D ops->init_disas_context(db, cpu, max_insns); + ops->init_disas_context(db, cpu); tcg_debug_assert(db->is_jmp =3D=3D DISAS_NEXT); /* no early exit */ =20 /* Reset the temp count so that we can identify leaks */ @@ -95,7 +93,8 @@ void translator_loop(const TranslatorOps *ops, DisasConte= xtBase *db, update db->pc_next and db->is_jmp to indicate what should be done next -- either exiting this loop or locate the start of the next instruction. */ - if (db->num_insns =3D=3D max_insns && (tb_cflags(db->tb) & CF_LAST= _IO)) { + if (db->num_insns =3D=3D db->max_insns + && (tb_cflags(db->tb) & CF_LAST_IO)) { /* Accept I/O on the last instruction. */ gen_io_start(); ops->translate_insn(db, cpu); @@ -111,7 +110,7 @@ void translator_loop(const TranslatorOps *ops, DisasCon= textBase *db, =20 /* Stop translation if the output buffer is full, or we have executed all of the allowed instructions. */ - if (tcg_op_buf_full() || db->num_insns >=3D max_insns) { + if (tcg_op_buf_full() || db->num_insns >=3D db->max_insns) { db->is_jmp =3D DISAS_TOO_MANY; break; } diff --git a/target/alpha/translate.c b/target/alpha/translate.c index 73a1b5e..15eca71 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -2919,8 +2919,7 @@ static DisasJumpType translate_one(DisasContext *ctx,= uint32_t insn) return ret; } =20 -static int alpha_tr_init_disas_context(DisasContextBase *dcbase, - CPUState *cpu, int max_insns) +static void alpha_tr_init_disas_context(DisasContextBase *dcbase, CPUState= *cpu) { DisasContext *ctx =3D container_of(dcbase, DisasContext, base); CPUAlphaState *env =3D cpu->env_ptr; @@ -2959,8 +2958,7 @@ static int alpha_tr_init_disas_context(DisasContextBa= se *dcbase, mask =3D TARGET_PAGE_MASK; } bound =3D -(ctx->base.pc_first | mask) / 4; - - return MIN(max_insns, bound); + ctx->base.max_insns =3D MIN(ctx->base.max_insns, bound); } =20 static void alpha_tr_tb_start(DisasContextBase *db, CPUState *cpu) diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index c913292..1bf16ff 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -13218,8 +13218,8 @@ static void disas_a64_insn(CPUARMState *env, DisasC= ontext *s) free_tmp_a64(s); } =20 -static int aarch64_tr_init_disas_context(DisasContextBase *dcbase, - CPUState *cpu, int max_insns) +static void aarch64_tr_init_disas_context(DisasContextBase *dcbase, + CPUState *cpu) { DisasContext *dc =3D container_of(dcbase, DisasContext, base); CPUARMState *env =3D cpu->env_ptr; @@ -13282,11 +13282,9 @@ static int aarch64_tr_init_disas_context(DisasCont= extBase *dcbase, if (dc->ss_active) { bound =3D 1; } - max_insns =3D MIN(max_insns, bound); + dc->base.max_insns =3D MIN(dc->base.max_insns, bound); =20 init_tmp_a64_array(dc); - - return max_insns; } =20 static void aarch64_tr_tb_start(DisasContextBase *db, CPUState *cpu) diff --git a/target/arm/translate.c b/target/arm/translate.c index fc03b5b..18886a1 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -12211,8 +12211,7 @@ static bool insn_crosses_page(CPUARMState *env, Dis= asContext *s) return !thumb_insn_is_16bit(s, insn); } =20 -static int arm_tr_init_disas_context(DisasContextBase *dcbase, - CPUState *cs, int max_insns) +static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *= cs) { DisasContext *dc =3D container_of(dcbase, DisasContext, base); CPUARMState *env =3D cs->env_ptr; @@ -12274,14 +12273,14 @@ static int arm_tr_init_disas_context(DisasContext= Base *dcbase, =20 /* If architectural single step active, limit to 1. */ if (is_singlestepping(dc)) { - max_insns =3D 1; + dc->base.max_insns =3D 1; } =20 /* ARM is a fixed-length ISA. Bound the number of insns to execute to those left on the page. */ if (!dc->thumb) { int bound =3D (dc->next_page_start - dc->base.pc_first) / 4; - max_insns =3D MIN(max_insns, bound); + dc->base.max_insns =3D MIN(dc->base.max_insns, bound); } =20 cpu_F0s =3D tcg_temp_new_i32(); @@ -12292,8 +12291,6 @@ static int arm_tr_init_disas_context(DisasContextBa= se *dcbase, cpu_V1 =3D cpu_F1d; /* FIXME: cpu_M0 can probably be the same as cpu_V0. */ cpu_M0 =3D tcg_temp_new_i64(); - - return max_insns; } =20 static void arm_tr_tb_start(DisasContextBase *dcbase, CPUState *cpu) diff --git a/target/hppa/translate.c b/target/hppa/translate.c index c532889..424991f 100644 --- a/target/hppa/translate.c +++ b/target/hppa/translate.c @@ -4681,8 +4681,7 @@ static DisasJumpType translate_one(DisasContext *ctx,= uint32_t insn) return gen_illegal(ctx); } =20 -static int hppa_tr_init_disas_context(DisasContextBase *dcbase, - CPUState *cs, int max_insns) +static void hppa_tr_init_disas_context(DisasContextBase *dcbase, CPUState = *cs) { DisasContext *ctx =3D container_of(dcbase, DisasContext, base); int bound; @@ -4712,14 +4711,12 @@ static int hppa_tr_init_disas_context(DisasContextB= ase *dcbase, =20 /* Bound the number of instructions by those left on the page. */ bound =3D -(ctx->base.pc_first | TARGET_PAGE_MASK) / 4; - bound =3D MIN(max_insns, bound); + ctx->base.max_insns =3D MIN(ctx->base.max_insns, bound); =20 ctx->ntempr =3D 0; ctx->ntempl =3D 0; memset(ctx->tempr, 0, sizeof(ctx->tempr)); memset(ctx->templ, 0, sizeof(ctx->templ)); - - return bound; } =20 static void hppa_tr_tb_start(DisasContextBase *dcbase, CPUState *cs) diff --git a/target/i386/translate.c b/target/i386/translate.c index 0135415..a462913 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -8400,8 +8400,7 @@ void tcg_x86_init(void) } } =20 -static int i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *= cpu, - int max_insns) +static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState = *cpu) { DisasContext *dc =3D container_of(dcbase, DisasContext, base); CPUX86State *env =3D cpu->env_ptr; @@ -8468,8 +8467,6 @@ static int i386_tr_init_disas_context(DisasContextBas= e *dcbase, CPUState *cpu, cpu_ptr0 =3D tcg_temp_new_ptr(); cpu_ptr1 =3D tcg_temp_new_ptr(); cpu_cc_srcT =3D tcg_temp_local_new(); - - return max_insns; } =20 static void i386_tr_tb_start(DisasContextBase *db, CPUState *cpu) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 218665b..d168d6e 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -7212,8 +7212,7 @@ void ppc_cpu_dump_statistics(CPUState *cs, FILE*f, #endif } =20 -static int ppc_tr_init_disas_context(DisasContextBase *dcbase, - CPUState *cs, int max_insns) +static void ppc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *= cs) { DisasContext *ctx =3D container_of(dcbase, DisasContext, base); CPUPPCState *env =3D cs->env_ptr; @@ -7279,7 +7278,7 @@ static int ppc_tr_init_disas_context(DisasContextBase= *dcbase, #endif =20 bound =3D -(ctx->base.pc_first | TARGET_PAGE_MASK) / 4; - return MIN(max_insns, bound); + ctx->base.max_insns =3D MIN(ctx->base.max_insns, bound); } =20 static void ppc_tr_tb_start(DisasContextBase *db, CPUState *cs) --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039131378738.2425387424922; Fri, 6 Apr 2018 11:25:31 -0700 (PDT) Received: from localhost ([::1]:45406 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W3G-0007v1-Fq for importer@patchew.org; Fri, 06 Apr 2018 14:25:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48622) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kZ-9j for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy0-0000Qx-KL for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:34641) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy0-0000PQ-Gh for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:04 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id ED12320D89; Fri, 6 Apr 2018 14:20:01 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:01 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 9DB34E47D1; Fri, 6 Apr 2018 14:20:01 -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=tP5L48XJq79U3F iIjQrpO1Jq8x45piysErT/AA981HM=; b=cMxDl3i0Dwt5X8jrNTqyNt/1CSGUp9 O1+f337jItlsO3egh5+a8l5NSb47MGhhWyNIfJqpAllG0pGfRIou6VHzMdJx+klB R/vA7MHX6ViKcK+zyDR4wzr7TwwqgPD9ANGaHVgP8l3GWvyVd3YcKF2qEs3nOcXI o7zXlzQm86CqU= 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=tP5L48XJq79U3FiIjQrpO1Jq8x45piysErT/AA981HM=; b=U+JYk4kD E/XPNfJHMHaf4f4AJ+dKgzj/Q9QyF0ZtTXrQ57G3bkPC746aZqH1ZuTim7CG6Wad yZ3at4mKHYVaHnOx4EPtRvQ3RpfVGwGEWNT15ugKyuTAxfmOPaxFs/MgChJH9oQz 4Qv6t+oxOtpZq6FwF4dxoez+oa0sdEb9psV+XzMQg5CJrdWvXeXfjZtLxTsAo88G gSLoEBhi53U9TGqQSxOU6XMeniAdhp0KP7uratEQag/l932D8YpSGGW7irmMpO8l O8zoWfrFCfAxwMKC65OaLCd3DfAQvQuGO91ARwrAjm9XoGioarBq0VwSnu+/gYP1 +YKf8On4C9gODQ== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:45 -0400 Message-Id: <1523038800-2494-3-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 02/17] target/sh4: convert to TranslatorOps 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: Richard Henderson , Aurelien Jarno 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" This was fairly straightforward since it had already been converted to DisasContextBase; just had to add TARGET_TOO_MANY to the switch in tb_stop. Reviewed-by: Richard Henderson Cc: Aurelien Jarno Signed-off-by: Emilio G. Cota --- target/sh4/translate.c | 171 +++++++++++++++++++++++++--------------------= ---- 1 file changed, 86 insertions(+), 85 deletions(-) diff --git a/target/sh4/translate.c b/target/sh4/translate.c index 012156b..58bdfeb 100644 --- a/target/sh4/translate.c +++ b/target/sh4/translate.c @@ -2258,126 +2258,127 @@ static int decode_gusa(DisasContext *ctx, CPUSH4S= tate *env, int *pmax_insns) } #endif =20 -void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +static void sh4_tr_init_disas_context(DisasContextBase *dcbase, CPUState *= cs) { + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); CPUSH4State *env =3D cs->env_ptr; - DisasContext ctx; - target_ulong pc_start; - int num_insns; - int max_insns; - - pc_start =3D tb->pc; - ctx.base.pc_next =3D pc_start; - ctx.tbflags =3D (uint32_t)tb->flags; - ctx.envflags =3D tb->flags & TB_FLAG_ENVFLAGS_MASK; - ctx.base.is_jmp =3D DISAS_NEXT; - ctx.memidx =3D (ctx.tbflags & (1u << SR_MD)) =3D=3D 0 ? 1 : 0; + int bound; + + ctx->tbflags =3D (uint32_t)ctx->base.tb->flags; + ctx->envflags =3D ctx->base.tb->flags & TB_FLAG_ENVFLAGS_MASK; + ctx->memidx =3D (ctx->tbflags & (1u << SR_MD)) =3D=3D 0 ? 1 : 0; /* We don't know if the delayed pc came from a dynamic or static branc= h, so assume it is a dynamic branch. */ - ctx.delayed_pc =3D -1; /* use delayed pc from env pointer */ - ctx.base.tb =3D tb; - ctx.base.singlestep_enabled =3D cs->singlestep_enabled; - ctx.features =3D env->features; - ctx.has_movcal =3D (ctx.tbflags & TB_FLAG_PENDING_MOVCA); - ctx.gbank =3D ((ctx.tbflags & (1 << SR_MD)) && - (ctx.tbflags & (1 << SR_RB))) * 0x10; - ctx.fbank =3D ctx.tbflags & FPSCR_FR ? 0x10 : 0; - - max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - max_insns =3D MIN(max_insns, TCG_MAX_INSNS); + ctx->delayed_pc =3D -1; /* use delayed pc from env pointer */ + ctx->features =3D env->features; + ctx->has_movcal =3D (ctx->tbflags & TB_FLAG_PENDING_MOVCA); + ctx->gbank =3D ((ctx->tbflags & (1 << SR_MD)) && + (ctx->tbflags & (1 << SR_RB))) * 0x10; + ctx->fbank =3D ctx->tbflags & FPSCR_FR ? 0x10 : 0; =20 /* Since the ISA is fixed-width, we can bound by the number of instructions remaining on the page. */ - num_insns =3D -(ctx.base.pc_next | TARGET_PAGE_MASK) / 2; - max_insns =3D MIN(max_insns, num_insns); - - /* Single stepping means just that. */ - if (ctx.base.singlestep_enabled || singlestep) { - max_insns =3D 1; - } - - gen_tb_start(tb); - num_insns =3D 0; + bound =3D -(ctx->base.pc_next | TARGET_PAGE_MASK) / 2; + ctx->base.max_insns =3D MIN(ctx->base.max_insns, bound); +} =20 +static void sh4_tr_tb_start(DisasContextBase *dcbase, CPUState *cs) +{ #ifdef CONFIG_USER_ONLY - if (ctx.tbflags & GUSA_MASK) { - num_insns =3D decode_gusa(&ctx, env, &max_insns); + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + CPUSH4State *env =3D cs->env_ptr; + + if (ctx->tbflags & GUSA_MASK) { + ctx->base.num_insns =3D decode_gusa(ctx, env, &ctx->base.max_insns= ); } #endif +} =20 - while (ctx.base.is_jmp =3D=3D DISAS_NEXT - && num_insns < max_insns - && !tcg_op_buf_full()) { - tcg_gen_insn_start(ctx.base.pc_next, ctx.envflags); - num_insns++; +static void sh4_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) { - /* We have hit a breakpoint - make sure PC is up-to-date */ - gen_save_cpu_state(&ctx, true); - gen_helper_debug(cpu_env); - ctx.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. */ - ctx.base.pc_next +=3D 2; - break; - } + tcg_gen_insn_start(ctx->base.pc_next, ctx->envflags); +} =20 - if (num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAST_IO)) { - gen_io_start(); - } +static bool sh4_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs, + const CPUBreakpoint *bp) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - ctx.opcode =3D cpu_lduw_code(env, ctx.base.pc_next); - decode_opc(&ctx); - ctx.base.pc_next +=3D 2; - } - if (tb_cflags(tb) & CF_LAST_IO) { - gen_io_end(); - } + /* We have hit a breakpoint - make sure PC is up-to-date */ + gen_save_cpu_state(ctx, true); + gen_helper_debug(cpu_env); + ctx->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. */ + ctx->base.pc_next +=3D 2; + return true; +} + +static void sh4_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) +{ + CPUSH4State *env =3D cs->env_ptr; + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - if (ctx.tbflags & GUSA_EXCLUSIVE) { + ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); + decode_opc(ctx); + ctx->base.pc_next +=3D 2; +} + +static void sh4_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + + if (ctx->tbflags & GUSA_EXCLUSIVE) { /* Ending the region of exclusivity. Clear the bits. */ - ctx.envflags &=3D ~GUSA_MASK; + ctx->envflags &=3D ~GUSA_MASK; } =20 - switch (ctx.base.is_jmp) { + switch (ctx->base.is_jmp) { case DISAS_STOP: - gen_save_cpu_state(&ctx, true); - if (ctx.base.singlestep_enabled) { + gen_save_cpu_state(ctx, true); + if (ctx->base.singlestep_enabled) { gen_helper_debug(cpu_env); } else { tcg_gen_exit_tb(0); } break; case DISAS_NEXT: - gen_save_cpu_state(&ctx, false); - gen_goto_tb(&ctx, 0, ctx.base.pc_next); + case DISAS_TOO_MANY: + gen_save_cpu_state(ctx, false); + gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_NORETURN: break; default: g_assert_not_reached(); } +} =20 - gen_tb_end(tb, num_insns); +static void sh4_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs) +{ + qemu_log("IN:\n"); /* , lookup_symbol(dcbase->pc_first)); */ + log_target_disas(cs, dcbase->pc_first, dcbase->tb->size); +} =20 - tb->size =3D ctx.base.pc_next - pc_start; - tb->icount =3D num_insns; +static const TranslatorOps sh4_tr_ops =3D { + .init_disas_context =3D sh4_tr_init_disas_context, + .tb_start =3D sh4_tr_tb_start, + .insn_start =3D sh4_tr_insn_start, + .breakpoint_check =3D sh4_tr_breakpoint_check, + .translate_insn =3D sh4_tr_translate_insn, + .tb_stop =3D sh4_tr_tb_stop, + .disas_log =3D sh4_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +{ + DisasContext ctx; =20 -#ifdef DEBUG_DISAS - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { - qemu_log_lock(); - qemu_log("IN:\n"); /* , lookup_symbol(pc_start)); */ - log_target_disas(cs, pc_start, ctx.base.pc_next - pc_start); - qemu_log("\n"); - qemu_log_unlock(); - } -#endif + translator_loop(&sh4_tr_ops, &ctx.base, cs, tb); } =20 void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb, --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 152303895239355.15536314790404; Fri, 6 Apr 2018 11:22:32 -0700 (PDT) Received: from localhost ([::1]:45392 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W0I-0005JS-ER for importer@patchew.org; Fri, 06 Apr 2018 14:22:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48615) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kU-6A for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy0-0000Qq-FJ for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:37091) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy0-0000Pd-Ax for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:04 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 69C2D208C0; Fri, 6 Apr 2018 14:20:02 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:02 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id E577010260; Fri, 6 Apr 2018 14:20:01 -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=CQLEMvhC+ynKvl 0OBSR7hQg3Q9ivVWNg2kwzhRNJsqY=; b=teI228Q2uXMfu5ZJ/l8oklDoqCNgjB lypPZAoOLFmzGY2zF4/Yx5wxnMHCel80TXX5wb2q+APch46CBb+M6OlgfPzG8I4U S7C/h8VPdsu4fGrka5b61dda3tzEByWlDtuYTqmaecXgC9aeQLIYVWEUAzVlYrYQ s8F2YDufG5MB0= 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=CQLEMvhC+ynKvl0OBSR7hQg3Q9ivVWNg2kwzhRNJsqY=; b=PKCPerDW H7Fc0rWUb9w/UXcsRjCiOBn6zPD8YSodBj4PsOluDTKtokMmljXm0OER6myOzb3s ifHdm6ZSJwfGVukz4x/Re5C+l4KunvgQgmwaHaKMO88rU0w50vHjlQ2/HPBQBr56 RPSUV/8bU3/z2MXHMQHSHzaWOeSj0pf4hM4ewubtkIugnGUynTp9JmTbl21fsTwN EYr3vU92mIEJXa6zoWZNOOX/SYf99fmI2ySaXTwKZpkAnalKTZirjVe02cUEUvge twJjJD0BeyQWF0r8AQ1k/g0TNpFyZKAxzsqBcUwVUk2vn4Qisujo8ojiQ7D3tKY7 RuGrTr8mIgjKoA== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:46 -0400 Message-Id: <1523038800-2494-4-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 03/17] target/sparc: 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: Mark Cave-Ayland , Richard Henderson , Artyom Tarasenko 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" Reviewed-by: Richard Henderson Cc: Mark Cave-Ayland Cc: Artyom Tarasenko Signed-off-by: Emilio G. Cota --- target/sparc/translate.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/target/sparc/translate.c b/target/sparc/translate.c index 5aa367a..03c6510 100644 --- a/target/sparc/translate.c +++ b/target/sparc/translate.c @@ -30,6 +30,7 @@ #include "exec/helper-gen.h" =20 #include "trace-tcg.h" +#include "exec/translator.h" #include "exec/log.h" #include "asi.h" =20 @@ -69,7 +70,7 @@ typedef struct DisasContext { target_ulong pc; /* current Program Counter: integer or DYNAMIC_PC = */ target_ulong npc; /* next PC: integer or DYNAMIC_PC or JUMP_PC */ target_ulong jump_pc[2]; /* used when JUMP_PC pc value is used */ - int is_br; + DisasJumpType is_jmp; int mem_idx; bool fpu_enabled; bool address_mask_32bit; @@ -995,7 +996,7 @@ static void gen_branch_a(DisasContext *dc, target_ulong= pc1) gen_set_label(l1); gen_goto_tb(dc, 1, npc + 4, npc + 8); =20 - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; } =20 static void gen_branch_n(DisasContext *dc, target_ulong pc1) @@ -1078,7 +1079,7 @@ static void gen_exception(DisasContext *dc, int which) t =3D tcg_const_i32(which); gen_helper_raise_exception(cpu_env, t); tcg_temp_free_i32(t); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; } =20 static void gen_check_align(TCGv addr, int mask) @@ -3351,7 +3352,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) =20 if (cond =3D=3D 8) { /* An unconditional trap ends the TB. */ - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; goto jmp_insn; } else { /* A conditional trap falls through to the next insn. = */ @@ -4331,7 +4332,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; break; case 0x6: /* V9 wrfprs */ tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src= 2); @@ -4340,7 +4341,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; break; case 0xf: /* V9 sir, nop if user */ #if !defined(CONFIG_USER_ONLY) @@ -4468,7 +4469,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; #endif } break; @@ -4624,7 +4625,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; break; case 1: // htstate // XXX gen_op_wrhtstate(); @@ -5690,7 +5691,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) } else if (dc->npc =3D=3D JUMP_PC) { /* we can do a static jump */ gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], cpu_cond); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; } else { dc->pc =3D dc->npc; dc->npc =3D dc->npc + 4; @@ -5752,6 +5753,7 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) pc_start =3D tb->pc; dc->pc =3D pc_start; last_pc =3D dc->pc; + dc->is_jmp =3D DISAS_NEXT; dc->npc =3D (target_ulong) tb->cs_base; dc->cc_op =3D CC_OP_DYNAMIC; dc->mem_idx =3D tb->flags & TB_FLAG_MMU_MASK; @@ -5796,7 +5798,7 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) } gen_helper_debug(cpu_env); tcg_gen_exit_tb(0); - dc->is_br =3D 1; + dc->is_jmp =3D DISAS_NORETURN; goto exit_gen_loop; } =20 @@ -5808,8 +5810,9 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) =20 disas_sparc_insn(dc, insn); =20 - if (dc->is_br) + if (dc->is_jmp =3D=3D DISAS_NORETURN) { break; + } /* if the next PC is different, we abort now */ if (dc->pc !=3D (last_pc + 4)) break; @@ -5830,7 +5833,7 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } - if (!dc->is_br) { + if (dc->is_jmp !=3D DISAS_NORETURN) { if (dc->pc !=3D DYNAMIC_PC && (dc->npc !=3D DYNAMIC_PC && dc->npc !=3D JUMP_PC)) { /* static PC and NPC: we can use direct chaining */ --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039138679704.3097625091925; Fri, 6 Apr 2018 11:25:38 -0700 (PDT) Received: from localhost ([::1]:45408 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W3N-00081A-OT for importer@patchew.org; Fri, 06 Apr 2018 14:25:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48620) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kX-9N for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy1-0000RR-9W for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:46937) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy1-0000RB-3x for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:05 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id D27E620D9A; Fri, 6 Apr 2018 14:20:04 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:04 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 673D4E4925; Fri, 6 Apr 2018 14:20:04 -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=Fl1VxZb+0l6L3h d0mSHvFotjnxEIXhq3yxrTP1YHKuE=; b=srk22Bektr0qEoC01YSw5VJS6fVipV 3OCYClOuxStEokcNQF12lTSApevJA1uywrwnZMQL//wiO/Wx7bxdMm1869gMLBs8 eOwsjsVwtyp8Dmypuk9/nYAeKYJ0+/7zP3Cok40JquzmwgXkuN2I6xDLHJ9kxmF3 JsXLOWlCF+d/8= 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=Fl1VxZb+0l6L3hd0mSHvFotjnxEIXhq3yxrTP1YHKuE=; b=JjFylrRv 4P4xfN2sC58bcMB2OIW4MUgv6X/BzO+xkzsUe0XSVShrPGgHoXkmpGestreDX1Op 72DZ917runJa4sN77wrlQ1cQka+nBlST5jD9Zze/7v5TIAEQYMT1dVv70gR9v6Xk kk09xpLPuFZYYYqJ0/PL2jNxJx5qJkYumWg3wdmsTNUJ/foHXuGwQ0X1mCDajrgE kuljZeqXgWDTW6eBqrzKkZ/o7T5O884UfSXpPR6kYBeDMlaLArgb5NPURUPIYuKE QB+h1Ug605vz2oVN7CVNQ8Tviyguh4mel4f4LundvSwKHT1yhyq/fjSMCB2IuZjd AqDnCLA5kdJupQ== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:47 -0400 Message-Id: <1523038800-2494-5-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 04/17] target/sparc: 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: Mark Cave-Ayland , Richard Henderson , Artyom Tarasenko 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" Notes: - pc and npc are left unmodified, since they can point to out-of-TB jump targets. - Got rid of last_pc in gen_intermediate_code(), using base.pc_next instead. Only update pc_next (1) on a breakpoint (so that tb->size includes the insn), and (2) after reading the current instruction from memory. This allows us to use base.pc_next in the BP check, which is what the translator loop does. Cc: Mark Cave-Ayland Cc: Artyom Tarasenko Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/sparc/translate.c | 92 +++++++++++++++++++++++---------------------= ---- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/target/sparc/translate.c b/target/sparc/translate.c index 03c6510..889c439 100644 --- a/target/sparc/translate.c +++ b/target/sparc/translate.c @@ -67,14 +67,13 @@ static TCGv_i64 cpu_fpr[TARGET_DPREGS]; #include "exec/gen-icount.h" =20 typedef struct DisasContext { + DisasContextBase base; target_ulong pc; /* current Program Counter: integer or DYNAMIC_PC = */ target_ulong npc; /* next PC: integer or DYNAMIC_PC or JUMP_PC */ target_ulong jump_pc[2]; /* used when JUMP_PC pc value is used */ - DisasJumpType is_jmp; int mem_idx; bool fpu_enabled; bool address_mask_32bit; - bool singlestep; #ifndef CONFIG_USER_ONLY bool supervisor; #ifdef TARGET_SPARC64 @@ -83,7 +82,6 @@ typedef struct DisasContext { #endif =20 uint32_t cc_op; /* current CC operation */ - struct TranslationBlock *tb; sparc_def_t *def; TCGv_i32 t32[3]; TCGv ttl[5]; @@ -342,13 +340,13 @@ static inline TCGv gen_dest_gpr(DisasContext *dc, int= reg) static inline bool use_goto_tb(DisasContext *s, target_ulong pc, target_ulong npc) { - if (unlikely(s->singlestep)) { + if (unlikely(s->base.singlestep_enabled || singlestep)) { return false; } =20 #ifndef CONFIG_USER_ONLY - return (pc & TARGET_PAGE_MASK) =3D=3D (s->tb->pc & TARGET_PAGE_MASK) && - (npc & TARGET_PAGE_MASK) =3D=3D (s->tb->pc & TARGET_PAGE_MASK); + return (pc & TARGET_PAGE_MASK) =3D=3D (s->base.tb->pc & TARGET_PAGE_MA= SK) && + (npc & TARGET_PAGE_MASK) =3D=3D (s->base.tb->pc & TARGET_PAGE_M= ASK); #else return true; #endif @@ -362,7 +360,7 @@ static inline void gen_goto_tb(DisasContext *s, int tb_= num, tcg_gen_goto_tb(tb_num); tcg_gen_movi_tl(cpu_pc, pc); tcg_gen_movi_tl(cpu_npc, npc); - tcg_gen_exit_tb((uintptr_t)s->tb + tb_num); + tcg_gen_exit_tb((uintptr_t)s->base.tb + tb_num); } else { /* jump to another page: currently not optimized */ tcg_gen_movi_tl(cpu_pc, pc); @@ -996,7 +994,7 @@ static void gen_branch_a(DisasContext *dc, target_ulong= pc1) gen_set_label(l1); gen_goto_tb(dc, 1, npc + 4, npc + 8); =20 - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; } =20 static void gen_branch_n(DisasContext *dc, target_ulong pc1) @@ -1079,7 +1077,7 @@ static void gen_exception(DisasContext *dc, int which) t =3D tcg_const_i32(which); gen_helper_raise_exception(cpu_env, t); tcg_temp_free_i32(t); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; } =20 static void gen_check_align(TCGv addr, int mask) @@ -2442,7 +2440,7 @@ static void gen_ldstub_asi(DisasContext *dc, TCGv dst= , TCGv addr, int insn) default: /* ??? In theory, this should be raise DAE_invalid_asi. But the SS-20 roms do ldstuba [%l0] #ASI_M_CTL, %o1. */ - if (tb_cflags(dc->tb) & CF_PARALLEL) { + if (tb_cflags(dc->base.tb) & CF_PARALLEL) { gen_helper_exit_atomic(cpu_env); } else { TCGv_i32 r_asi =3D tcg_const_i32(da.asi); @@ -3352,7 +3350,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) =20 if (cond =3D=3D 8) { /* An unconditional trap ends the TB. */ - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; goto jmp_insn; } else { /* A conditional trap falls through to the next insn. = */ @@ -4332,7 +4330,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; break; case 0x6: /* V9 wrfprs */ tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src= 2); @@ -4341,7 +4339,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; break; case 0xf: /* V9 sir, nop if user */ #if !defined(CONFIG_USER_ONLY) @@ -4469,7 +4467,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; #endif } break; @@ -4625,7 +4623,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) save_state(dc); gen_op_next_insn(); tcg_gen_exit_tb(0); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; break; case 1: // htstate // XXX gen_op_wrhtstate(); @@ -5691,7 +5689,7 @@ static void disas_sparc_insn(DisasContext * dc, unsig= ned int insn) } else if (dc->npc =3D=3D JUMP_PC) { /* we can do a static jump */ gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], cpu_cond); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; } else { dc->pc =3D dc->npc; dc->npc =3D dc->npc + 4; @@ -5742,25 +5740,25 @@ static void disas_sparc_insn(DisasContext * dc, uns= igned int insn) void gen_intermediate_code(CPUState *cs, TranslationBlock * tb) { CPUSPARCState *env =3D cs->env_ptr; - target_ulong pc_start, last_pc; DisasContext dc1, *dc =3D &dc1; - int num_insns; int max_insns; unsigned int insn; =20 memset(dc, 0, sizeof(DisasContext)); - dc->tb =3D tb; - pc_start =3D tb->pc; - dc->pc =3D pc_start; - last_pc =3D dc->pc; - dc->is_jmp =3D DISAS_NEXT; + dc->base.tb =3D tb; + dc->base.pc_first =3D tb->pc; + dc->base.pc_next =3D tb->pc; + dc->base.is_jmp =3D DISAS_NEXT; + dc->base.num_insns =3D 0; + dc->base.singlestep_enabled =3D cs->singlestep_enabled; + + dc->pc =3D dc->base.pc_first; dc->npc =3D (target_ulong) tb->cs_base; dc->cc_op =3D CC_OP_DYNAMIC; dc->mem_idx =3D tb->flags & TB_FLAG_MMU_MASK; dc->def =3D &env->def; dc->fpu_enabled =3D tb_fpu_enabled(tb->flags); dc->address_mask_32bit =3D tb_am_enabled(tb->flags); - dc->singlestep =3D (cs->singlestep_enabled || singlestep); #ifndef CONFIG_USER_ONLY dc->supervisor =3D (tb->flags & TB_FLAG_SUPER) !=3D 0; #endif @@ -5772,7 +5770,6 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) #endif #endif =20 - num_insns =3D 0; max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; if (max_insns =3D=3D 0) { max_insns =3D CF_COUNT_MASK; @@ -5780,6 +5777,9 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock * tb) if (max_insns > TCG_MAX_INSNS) { max_insns =3D TCG_MAX_INSNS; } + if (dc->base.singlestep_enabled || singlestep) { + max_insns =3D 1; + } =20 gen_tb_start(tb); do { @@ -5789,51 +5789,48 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock * tb) } else { tcg_gen_insn_start(dc->pc, dc->npc); } - num_insns++; - last_pc =3D dc->pc; + dc->base.num_insns++; =20 - if (unlikely(cpu_breakpoint_test(cs, dc->pc, BP_ANY))) { - if (dc->pc !=3D pc_start) { + if (unlikely(cpu_breakpoint_test(cs, dc->base.pc_next, BP_ANY))) { + if (dc->pc !=3D dc->base.pc_first) { save_state(dc); } gen_helper_debug(cpu_env); tcg_gen_exit_tb(0); - dc->is_jmp =3D DISAS_NORETURN; + dc->base.is_jmp =3D DISAS_NORETURN; + dc->base.pc_next +=3D 4; goto exit_gen_loop; } =20 - if (num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAST_IO)) { + if (dc->base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAS= T_IO)) { gen_io_start(); } =20 insn =3D cpu_ldl_code(env, dc->pc); + dc->base.pc_next +=3D 4; =20 disas_sparc_insn(dc, insn); =20 - if (dc->is_jmp =3D=3D DISAS_NORETURN) { + if (dc->base.is_jmp =3D=3D DISAS_NORETURN) { break; } /* if the next PC is different, we abort now */ - if (dc->pc !=3D (last_pc + 4)) + if (dc->pc !=3D dc->base.pc_next) { break; + } /* if we reach a page boundary, we stop generation so that the PC of a TT_TFAULT exception is always in the right page */ if ((dc->pc & (TARGET_PAGE_SIZE - 1)) =3D=3D 0) break; - /* if single step mode, we generate only one instruction and - generate an exception */ - if (dc->singlestep) { - break; - } } while (!tcg_op_buf_full() && - (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) && - num_insns < max_insns); + (dc->pc - dc->base.pc_first) < (TARGET_PAGE_SIZE - 32) && + dc->base.num_insns < max_insns); =20 exit_gen_loop: if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } - if (dc->is_jmp !=3D DISAS_NORETURN) { + if (dc->base.is_jmp !=3D DISAS_NORETURN) { if (dc->pc !=3D DYNAMIC_PC && (dc->npc !=3D DYNAMIC_PC && dc->npc !=3D JUMP_PC)) { /* static PC and NPC: we can use direct chaining */ @@ -5846,18 +5843,19 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock * tb) tcg_gen_exit_tb(0); } } - gen_tb_end(tb, num_insns); + gen_tb_end(tb, dc->base.num_insns); =20 - tb->size =3D last_pc + 4 - pc_start; - tb->icount =3D num_insns; + tb->size =3D dc->base.pc_next - dc->base.pc_first; + tb->icount =3D dc->base.num_insns; =20 #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { + && qemu_log_in_addr_range(dc->base.pc_first)) { qemu_log_lock(); qemu_log("--------------\n"); - qemu_log("IN: %s\n", lookup_symbol(pc_start)); - log_target_disas(cs, pc_start, last_pc + 4 - pc_start); + qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first)); + log_target_disas(cs, dc->base.pc_first, + dc->base.pc_next - dc->base.pc_first); qemu_log("\n"); qemu_log_unlock(); } --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523038952388574.4706219219172; Fri, 6 Apr 2018 11:22:32 -0700 (PDT) Received: from localhost ([::1]:45393 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W0K-0005NC-Sa for importer@patchew.org; Fri, 06 Apr 2018 14:22:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48619) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kW-95 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy1-0000RY-DV for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:47869) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy1-0000RH-8q for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:05 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id F0F6120E56; Fri, 6 Apr 2018 14:20:04 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:04 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id C258110263; Fri, 6 Apr 2018 14:20:04 -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=ufvtkWJ7JM81al V+t73feCdRkdAGABKHBmBDLrKmz6o=; b=clUnv3NqGbu0XwwsvkOIsf+tZkxx8e 4q/3knDwPB+5EdoULf4mz/evMA1Fa2iJzJ0UEBwLoe7kj+PuVCnXX6KYFQcsRC4P nv9+84nJ/MkP8YG4Uoo8GvJrJ/xVvXLYxK1ZXPaB2Gkgu25amnFfruQUoPHTGJXH xLtq6I18jL7Sk= 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=ufvtkWJ7JM81alV+t73feCdRkdAGABKHBmBDLrKmz6o=; b=XaIi6hVG D45+0ofaAbn9pN4xjTljVQPFLcSFnoXkhIQ4hmJMNZnqWOhXlc9DCMqj2ct+Xfec YPLEf2SOJRhz81Y3OGzUdW/XdsOAscnyJ105U3FSRAq7kgayB0rX8egfqQjabIwC wVp1MUYPQPQi5uFGmNjguZHUIxiJl/tybYGZUGDPuvdL/+uKHb4g+vfEtvcFY++y GHPlJq0I6gNKdtRRTiy69gww7K7690ptZNRxl64Fh1PQRTUJwLBlrnGl64DxJm+D XVU+sKi25cjA/DWyECv8+ySPXPD3/xAG3OmFwjqqSsSNkYTAHUXqrd1Ua9mGKwXr C8K7eC1XxOr7wA== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:48 -0400 Message-Id: <1523038800-2494-6-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 05/17] target/sparc: convert to TranslatorOps 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: Mark Cave-Ayland , Richard Henderson , Artyom Tarasenko 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" Notes: - Moved the cross-page check from the end of translate_insn to init_disas_context. Tested-by: Mark Cave-Ayland Cc: Mark Cave-Ayland Cc: Artyom Tarasenko Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/sparc/translate.c | 174 +++++++++++++++++++++++--------------------= ---- 1 file changed, 86 insertions(+), 88 deletions(-) diff --git a/target/sparc/translate.c b/target/sparc/translate.c index 889c439..40b2eaa 100644 --- a/target/sparc/translate.c +++ b/target/sparc/translate.c @@ -5737,99 +5737,91 @@ static void disas_sparc_insn(DisasContext * dc, uns= igned int insn) } } =20 -void gen_intermediate_code(CPUState *cs, TranslationBlock * tb) +static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState= *cs) { + DisasContext *dc =3D container_of(dcbase, DisasContext, base); CPUSPARCState *env =3D cs->env_ptr; - DisasContext dc1, *dc =3D &dc1; - int max_insns; - unsigned int insn; - - memset(dc, 0, sizeof(DisasContext)); - dc->base.tb =3D tb; - dc->base.pc_first =3D tb->pc; - dc->base.pc_next =3D tb->pc; - dc->base.is_jmp =3D DISAS_NEXT; - dc->base.num_insns =3D 0; - dc->base.singlestep_enabled =3D cs->singlestep_enabled; + int bound; =20 dc->pc =3D dc->base.pc_first; - dc->npc =3D (target_ulong) tb->cs_base; + dc->npc =3D (target_ulong)dc->base.tb->cs_base; dc->cc_op =3D CC_OP_DYNAMIC; - dc->mem_idx =3D tb->flags & TB_FLAG_MMU_MASK; + dc->mem_idx =3D dc->base.tb->flags & TB_FLAG_MMU_MASK; dc->def =3D &env->def; - dc->fpu_enabled =3D tb_fpu_enabled(tb->flags); - dc->address_mask_32bit =3D tb_am_enabled(tb->flags); + dc->fpu_enabled =3D tb_fpu_enabled(dc->base.tb->flags); + dc->address_mask_32bit =3D tb_am_enabled(dc->base.tb->flags); #ifndef CONFIG_USER_ONLY - dc->supervisor =3D (tb->flags & TB_FLAG_SUPER) !=3D 0; + dc->supervisor =3D (dc->base.tb->flags & TB_FLAG_SUPER) !=3D 0; #endif #ifdef TARGET_SPARC64 dc->fprs_dirty =3D 0; - dc->asi =3D (tb->flags >> TB_FLAG_ASI_SHIFT) & 0xff; + dc->asi =3D (dc->base.tb->flags >> TB_FLAG_ASI_SHIFT) & 0xff; #ifndef CONFIG_USER_ONLY - dc->hypervisor =3D (tb->flags & TB_FLAG_HYPER) !=3D 0; + dc->hypervisor =3D (dc->base.tb->flags & TB_FLAG_HYPER) !=3D 0; #endif #endif + /* + * if we reach a page boundary, we stop generation so that the + * PC of a TT_TFAULT exception is always in the right page + */ + bound =3D -(dc->base.pc_first | TARGET_PAGE_MASK) / 4; + dc->base.max_insns =3D MIN(dc->base.max_insns, bound); +} =20 - max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; - } - if (dc->base.singlestep_enabled || singlestep) { - max_insns =3D 1; - } +static void sparc_tr_tb_start(DisasContextBase *db, CPUState *cs) +{ +} =20 - gen_tb_start(tb); - do { - if (dc->npc & JUMP_PC) { - assert(dc->jump_pc[1] =3D=3D dc->pc + 4); - tcg_gen_insn_start(dc->pc, dc->jump_pc[0] | JUMP_PC); - } else { - tcg_gen_insn_start(dc->pc, dc->npc); - } - dc->base.num_insns++; +static void sparc_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - if (unlikely(cpu_breakpoint_test(cs, dc->base.pc_next, BP_ANY))) { - if (dc->pc !=3D dc->base.pc_first) { - save_state(dc); - } - gen_helper_debug(cpu_env); - tcg_gen_exit_tb(0); - dc->base.is_jmp =3D DISAS_NORETURN; - dc->base.pc_next +=3D 4; - goto exit_gen_loop; - } + if (dc->npc & JUMP_PC) { + assert(dc->jump_pc[1] =3D=3D dc->pc + 4); + tcg_gen_insn_start(dc->pc, dc->jump_pc[0] | JUMP_PC); + } else { + tcg_gen_insn_start(dc->pc, dc->npc); + } +} =20 - if (dc->base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAS= T_IO)) { - gen_io_start(); - } +static bool sparc_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *= cs, + const CPUBreakpoint *bp) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - insn =3D cpu_ldl_code(env, dc->pc); - dc->base.pc_next +=3D 4; + if (dc->pc !=3D dc->base.pc_first) { + save_state(dc); + } + gen_helper_debug(cpu_env); + tcg_gen_exit_tb(0); + dc->base.is_jmp =3D DISAS_NORETURN; + /* update pc_next so that the current instruction is included in tb->s= ize */ + dc->base.pc_next +=3D 4; + return true; +} =20 - disas_sparc_insn(dc, insn); +static void sparc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); + CPUSPARCState *env =3D cs->env_ptr; + unsigned int insn; =20 - if (dc->base.is_jmp =3D=3D DISAS_NORETURN) { - break; - } - /* if the next PC is different, we abort now */ - if (dc->pc !=3D dc->base.pc_next) { - break; - } - /* if we reach a page boundary, we stop generation so that the - PC of a TT_TFAULT exception is always in the right page */ - if ((dc->pc & (TARGET_PAGE_SIZE - 1)) =3D=3D 0) - break; - } while (!tcg_op_buf_full() && - (dc->pc - dc->base.pc_first) < (TARGET_PAGE_SIZE - 32) && - dc->base.num_insns < max_insns); + insn =3D cpu_ldl_code(env, dc->pc); + dc->base.pc_next +=3D 4; + disas_sparc_insn(dc, insn); =20 - exit_gen_loop: - if (tb_cflags(tb) & CF_LAST_IO) { - gen_io_end(); + if (dc->base.is_jmp =3D=3D DISAS_NORETURN) { + return; + } + if (dc->pc !=3D dc->base.pc_next) { + dc->base.is_jmp =3D DISAS_TOO_MANY; } +} + +static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); + if (dc->base.is_jmp !=3D DISAS_NORETURN) { if (dc->pc !=3D DYNAMIC_PC && (dc->npc !=3D DYNAMIC_PC && dc->npc !=3D JUMP_PC)) { @@ -5843,23 +5835,29 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock * tb) tcg_gen_exit_tb(0); } } - gen_tb_end(tb, dc->base.num_insns); - - tb->size =3D dc->base.pc_next - dc->base.pc_first; - tb->icount =3D dc->base.num_insns; - -#ifdef DEBUG_DISAS - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(dc->base.pc_first)) { - qemu_log_lock(); - qemu_log("--------------\n"); - qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first)); - log_target_disas(cs, dc->base.pc_first, - dc->base.pc_next - dc->base.pc_first); - qemu_log("\n"); - qemu_log_unlock(); - } -#endif +} + +static void sparc_tr_disas_log(const DisasContextBase *dcbase, CPUState *c= pu) +{ + qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); + log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size); +} + +static const TranslatorOps sparc_tr_ops =3D { + .init_disas_context =3D sparc_tr_init_disas_context, + .tb_start =3D sparc_tr_tb_start, + .insn_start =3D sparc_tr_insn_start, + .breakpoint_check =3D sparc_tr_breakpoint_check, + .translate_insn =3D sparc_tr_translate_insn, + .tb_stop =3D sparc_tr_tb_stop, + .disas_log =3D sparc_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +{ + DisasContext dc =3D {}; + + translator_loop(&sparc_tr_ops, &dc.base, cs, tb); } =20 void sparc_tcg_init(void) --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039479005877.7622427156373; Fri, 6 Apr 2018 11:31:19 -0700 (PDT) Received: from localhost ([::1]:45453 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W8s-0004p6-3J for importer@patchew.org; Fri, 06 Apr 2018 14:31:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48628) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kc-BD for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy2-0000Ry-1e for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:54257) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy1-0000Rh-RL for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:05 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 877B820E8C; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:05 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 1D07EE4925; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=braap.org; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=mesmtp; bh=9dZQn2JOhhqtEIlfTgfDNSwEHY eAS2dJOeD1gY5OORw=; b=HuPyzm2/nlhL81pplOdD2eta4G+OwmdJmjC1exDYD/ 6ekXakGSEUb8hqWoX9fxvShIvM1PRZNCxqK9wWpUjLqwkva5WX0Bwb1N1p0rZREN zCoTY2XS+Tjl+nvpG9CGQQDKhvUVsF3LhIsaGSBUQRt8ZUQCAxfbeeP8r16NgsRb c= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=9dZQn2 JOhhqtEIlfTgfDNSwEHYeAS2dJOeD1gY5OORw=; b=ZfECFM7oFk2Bu60upzCNF2 eELGphJVl6EXKPlfn+rtLXExmv4XQmcFnqNwz2yLvg6XkUamxjL9vpLL8SKSr5Or fZe4Ry3fGadWFx4GosRlW3Ed4OouMWljdOibVbYWjONd9ukD+W7IzZedeumCteG2 gGRgHAeZk1Vfv9trEDURrEqqXRP2UcZA4GEzqaAhS62z1tWtru/SprsDS7MDIeuy AXQdeABTsToFg1bNcXc/tHkg9xrTZEQAMXCsznRw8oA/AP/ty6QVhN1hLL8Z/+7N y1sSJVdNI/KoSJs+NY0twHnVHGA2b7fooBOnwK0u1Xw7XQ3CUzOeBLr2QGjtsItQ == X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:49 -0400 Message-Id: <1523038800-2494-7-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> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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 06/17] target/mips: 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: Yongbok Kim , Richard Henderson , Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Reviewed-by: Philippe Mathieu-Daud=C3=A9 Cc: Aurelien Jarno Cc: Yongbok Kim Signed-off-by: Emilio G. Cota --- target/mips/translate.c | 186 +++++++++++++++++++++++---------------------= ---- 1 file changed, 91 insertions(+), 95 deletions(-) diff --git a/target/mips/translate.c b/target/mips/translate.c index d05ee67..a133205 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -36,6 +36,7 @@ =20 #include "target/mips/trace.h" #include "trace-tcg.h" +#include "exec/translator.h" #include "exec/log.h" =20 #define MIPS_DEBUG_DISAS 0 @@ -1439,7 +1440,7 @@ typedef struct DisasContext { int mem_idx; TCGMemOp default_tcg_memop_mask; uint32_t hflags, saved_hflags; - int bstate; + DisasJumpType is_jmp; target_ulong btarget; bool ulri; int kscrexist; @@ -1460,13 +1461,8 @@ typedef struct DisasContext { bool abs2008; } DisasContext; =20 -enum { - BS_NONE =3D 0, /* We go out of the TB without reaching a branch or= an - * exception condition */ - BS_STOP =3D 1, /* We want to stop translation for any reason */ - BS_BRANCH =3D 2, /* We reached a branch condition */ - BS_EXCP =3D 3, /* We reached an exception condition */ -}; +#define DISAS_STOP DISAS_TARGET_0 +#define DISAS_EXCP DISAS_TARGET_1 =20 static const char * const regnames[] =3D { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", @@ -1639,7 +1635,7 @@ static inline void generate_exception_err(DisasContex= t *ctx, int excp, int err) gen_helper_raise_exception_err(cpu_env, texcp, terr); tcg_temp_free_i32(terr); tcg_temp_free_i32(texcp); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; } =20 static inline void generate_exception(DisasContext *ctx, int excp) @@ -5334,10 +5330,10 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) gen_io_end(); } /* Break the TB to be able to take timer interrupts immediately - after reading count. BS_STOP isn't sufficient, we need to e= nsure - we break completely out of translated code. */ + after reading count. DISAS_STOP isn't sufficient, we need to + ensure we break completely out of translated code. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Count"; break; /* 6,7 are implementation dependent */ @@ -5905,7 +5901,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_pagegrain(cpu_env, arg); rn =3D "PageGrain"; - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 2: CP0_CHECK(ctx->sc); @@ -5966,7 +5962,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) case 0: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_hwrena(cpu_env, arg); - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "HWREna"; break; default: @@ -6028,30 +6024,30 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) case 0: save_cpu_state(ctx, 1); gen_helper_mtc0_status(cpu_env, arg); - /* BS_STOP isn't good enough here, hflags may have changed. */ + /* DISAS_STOP isn't good enough here, hflags may have changed.= */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Status"; break; case 1: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_intctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "IntCtl"; break; case 2: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_srsctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "SRSCtl"; break; case 3: check_insn(ctx, ISA_MIPS32R2); gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap)); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "SRSMap"; break; default: @@ -6063,11 +6059,11 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) case 0: save_cpu_state(ctx, 1); gen_helper_mtc0_cause(cpu_env, arg); - /* Stop translation as we may have triggered an interrupt. BS_= STOP - * isn't sufficient, we need to ensure we break out of transla= ted - * code to check for pending interrupts. */ + /* Stop translation as we may have triggered an interrupt. + * DISAS_STOP isn't sufficient, we need to ensure we break out= of + * translated code to check for pending interrupts. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Cause"; break; default: @@ -6105,7 +6101,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) gen_helper_mtc0_config0(cpu_env, arg); rn =3D "Config"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 1: /* ignored, read only */ @@ -6115,24 +6111,24 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) gen_helper_mtc0_config2(cpu_env, arg); rn =3D "Config2"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 3: gen_helper_mtc0_config3(cpu_env, arg); rn =3D "Config3"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 4: gen_helper_mtc0_config4(cpu_env, arg); rn =3D "Config4"; - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 5: gen_helper_mtc0_config5(cpu_env, arg); rn =3D "Config5"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; /* 6,7 are implementation dependent */ case 6: @@ -6221,35 +6217,35 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) switch (sel) { case 0: gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ - /* BS_STOP isn't good enough here, hflags may have changed. */ + /* DISAS_STOP isn't good enough here, hflags may have changed.= */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Debug"; break; case 1: // gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace suppo= rt */ rn =3D "TraceControl"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 2: // gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace supp= ort */ rn =3D "TraceControl2"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 3: /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; // gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace supp= ort */ rn =3D "UserTraceData"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 4: // gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "TraceBPC"; goto cp0_unimplemented; default: @@ -6309,7 +6305,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) switch (sel) { case 0: gen_helper_mtc0_errctl(cpu_env, arg); - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "ErrCtl"; break; default: @@ -6402,10 +6398,10 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) /* For simplicity assume that all writes can cause interrupts. */ if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { gen_io_end(); - /* BS_STOP isn't sufficient, we need to ensure we break out of + /* DISAS_STOP isn't sufficient, we need to ensure we break out of * translated code to check for pending interrupts. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; } return; =20 @@ -6686,10 +6682,10 @@ static void gen_dmfc0(DisasContext *ctx, TCGv arg, = int reg, int sel) gen_io_end(); } /* Break the TB to be able to take timer interrupts immediately - after reading count. BS_STOP isn't sufficient, we need to e= nsure - we break completely out of translated code. */ + after reading count. DISAS_STOP isn't sufficient, we need to + ensure we break completely out of translated code. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Count"; break; /* 6,7 are implementation dependent */ @@ -7301,7 +7297,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) case 0: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_hwrena(cpu_env, arg); - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "HWREna"; break; default: @@ -7337,7 +7333,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) goto cp0_unimplemented; } /* Stop translation as we may have switched the execution mode */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 10: switch (sel) { @@ -7360,37 +7356,37 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) goto cp0_unimplemented; } /* Stop translation as we may have switched the execution mode */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 12: switch (sel) { case 0: save_cpu_state(ctx, 1); gen_helper_mtc0_status(cpu_env, arg); - /* BS_STOP isn't good enough here, hflags may have changed. */ + /* DISAS_STOP isn't good enough here, hflags may have changed.= */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Status"; break; case 1: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_intctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "IntCtl"; break; case 2: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_srsctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "SRSCtl"; break; case 3: check_insn(ctx, ISA_MIPS32R2); gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap)); /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "SRSMap"; break; default: @@ -7402,11 +7398,11 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) case 0: save_cpu_state(ctx, 1); gen_helper_mtc0_cause(cpu_env, arg); - /* Stop translation as we may have triggered an intetrupt. BS_= STOP - * isn't sufficient, we need to ensure we break out of transla= ted - * code to check for pending interrupts. */ + /* Stop translation as we may have triggered an intetrupt. + * DISAS_STOP isn't sufficient, we need to ensure we break out= of + * translated code to check for pending interrupts. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Cause"; break; default: @@ -7444,7 +7440,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) gen_helper_mtc0_config0(cpu_env, arg); rn =3D "Config"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 1: /* ignored, read only */ @@ -7454,13 +7450,13 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) gen_helper_mtc0_config2(cpu_env, arg); rn =3D "Config2"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 3: gen_helper_mtc0_config3(cpu_env, arg); rn =3D "Config3"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case 4: /* currently ignored */ @@ -7470,7 +7466,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) gen_helper_mtc0_config5(cpu_env, arg); rn =3D "Config5"; /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; /* 6,7 are implementation dependent */ default: @@ -7549,33 +7545,33 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) switch (sel) { case 0: gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ - /* BS_STOP isn't good enough here, hflags may have changed. */ + /* DISAS_STOP isn't good enough here, hflags may have changed.= */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; rn =3D "Debug"; break; case 1: // gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace suppo= rt */ /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "TraceControl"; goto cp0_unimplemented; case 2: // gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace supp= ort */ /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "TraceControl2"; goto cp0_unimplemented; case 3: // gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace supp= ort */ /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "UserTraceData"; goto cp0_unimplemented; case 4: // gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ /* Stop translation as we may have switched the execution mode= */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "TraceBPC"; goto cp0_unimplemented; default: @@ -7635,7 +7631,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) switch (sel) { case 0: gen_helper_mtc0_errctl(cpu_env, arg); - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; rn =3D "ErrCtl"; break; default: @@ -7728,10 +7724,10 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) /* For simplicity assume that all writes can cause interrupts. */ if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { gen_io_end(); - /* BS_STOP isn't sufficient, we need to ensure we break out of + /* DISAS_STOP isn't sufficient, we need to ensure we break out of * translated code to check for pending interrupts. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; } return; =20 @@ -8142,7 +8138,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext = *ctx, int rd, int rt, tcg_temp_free_i32(fs_tmp); } /* Stop translation as we may have changed hflags */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; /* COP2: Not implemented. */ case 4: @@ -8301,7 +8297,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext = *ctx, uint32_t opc, int rt, check_insn(ctx, ISA_MIPS2); gen_helper_eret(cpu_env); } - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; } break; case OPC_DERET: @@ -8316,7 +8312,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext = *ctx, uint32_t opc, int rt, generate_exception_end(ctx, EXCP_RI); } else { gen_helper_deret(cpu_env); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; } break; case OPC_WAIT: @@ -8331,7 +8327,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext = *ctx, uint32_t opc, int rt, save_cpu_state(ctx, 1); ctx->pc -=3D 4; gen_helper_wait(cpu_env); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; break; default: die: @@ -8756,7 +8752,7 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc,= int rt, int fs) tcg_temp_free_i32(fs_tmp); } /* Stop translation as we may have changed hflags */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; #if defined(TARGET_MIPS64) case OPC_DMFC1: @@ -10764,10 +10760,10 @@ static void gen_rdhwr(DisasContext *ctx, int rt, = int rd, int sel) } 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 + after reading count. DISAS_STOP isn't sufficient, we need to en= sure we break completely out of translated code. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; break; case 3: gen_helper_rdhwr_ccres(t0, cpu_env); @@ -10817,7 +10813,7 @@ static void gen_rdhwr(DisasContext *ctx, int rt, in= t rd, int sel) static inline void clear_branch_hflags(DisasContext *ctx) { ctx->hflags &=3D ~MIPS_HFLAG_BMASK; - if (ctx->bstate =3D=3D BS_NONE) { + if (ctx->is_jmp =3D=3D DISAS_NEXT) { save_cpu_state(ctx, 0); } else { /* it is not safe to save ctx->hflags as hflags may be changed @@ -10832,7 +10828,7 @@ static void gen_branch(DisasContext *ctx, int insn_= bytes) int proc_hflags =3D ctx->hflags & MIPS_HFLAG_BMASK; /* Branches completion */ clear_branch_hflags(ctx); - ctx->bstate =3D BS_BRANCH; + ctx->is_jmp =3D DISAS_NORETURN; /* FIXME: Need to clear can_do_io. */ switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) { case MIPS_HFLAG_FBNSLOT: @@ -13574,7 +13570,7 @@ static void gen_pool32axf (CPUMIPSState *env, Disas= Context *ctx, int rt, int rs) gen_helper_di(t0, cpu_env); gen_store_gpr(t0, rs); /* Stop translation as we may have switched the execution = mode */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; tcg_temp_free(t0); } break; @@ -13586,10 +13582,10 @@ static void gen_pool32axf (CPUMIPSState *env, Dis= asContext *ctx, int rt, int rs) save_cpu_state(ctx, 1); gen_helper_ei(t0, cpu_env); gen_store_gpr(t0, rs); - /* BS_STOP isn't sufficient, we need to ensure we break out + /* DISAS_STOP isn't sufficient, we need to ensure we break= out of translated code to check for pending interrupts. */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; tcg_temp_free(t0); } break; @@ -14745,7 +14741,7 @@ static void decode_micromips32_opc(CPUMIPSState *en= v, DisasContext *ctx) /* SYNCI */ /* Break the TB to be able to sync copied instructions immediately */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; } else { /* TNEI */ mips32_op =3D OPC_TNEI; @@ -14776,7 +14772,7 @@ static void decode_micromips32_opc(CPUMIPSState *en= v, DisasContext *ctx) check_insn_opc_removed(ctx, ISA_MIPS32R6); /* Break the TB to be able to sync copied instructions immediately */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case BC2F: case BC2T: @@ -19601,7 +19597,7 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) check_insn(ctx, ISA_MIPS32R2); /* Break the TB to be able to sync copied instructions immediately */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case OPC_BPOSGE32: /* MIPS DSP branch */ #if defined(TARGET_MIPS64) @@ -19704,17 +19700,17 @@ static void decode_opc(CPUMIPSState *env, DisasCo= ntext *ctx) gen_store_gpr(t0, rt); /* Stop translation as we may have switched the execution mode. */ - ctx->bstate =3D BS_STOP; + ctx->is_jmp =3D DISAS_STOP; break; case OPC_EI: check_insn(ctx, ISA_MIPS32R2); save_cpu_state(ctx, 1); gen_helper_ei(t0, cpu_env); gen_store_gpr(t0, rt); - /* BS_STOP isn't sufficient, we need to ensure we brea= k out - of translated code to check for pending interrupts.= */ + /* DISAS_STOP isn't sufficient, we need to ensure we b= reak + out of translated code to check for pending interru= pts */ gen_save_pc(ctx->pc + 4); - ctx->bstate =3D BS_EXCP; + ctx->is_jmp =3D DISAS_EXCP; break; default: /* Invalid */ MIPS_INVAL("mfmc0"); @@ -20216,7 +20212,7 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) ctx.insn_flags =3D env->insn_flags; ctx.CP0_Config1 =3D env->CP0_Config1; ctx.tb =3D tb; - ctx.bstate =3D BS_NONE; + ctx.is_jmp =3D DISAS_NEXT; ctx.btarget =3D 0; ctx.kscrexist =3D (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; ctx.rxi =3D (env->CP0_Config3 >> CP0C3_RXI) & 1; @@ -20257,13 +20253,13 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) =20 LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags); gen_tb_start(tb); - while (ctx.bstate =3D=3D BS_NONE) { + while (ctx.is_jmp =3D=3D DISAS_NEXT) { tcg_gen_insn_start(ctx.pc, ctx.hflags & MIPS_HFLAG_BMASK, ctx.btar= get); num_insns++; =20 if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) { save_cpu_state(&ctx, 1); - ctx.bstate =3D BS_BRANCH; + ctx.is_jmp =3D DISAS_NORETURN; gen_helper_raise_exception_debug(cpu_env); /* The address covered by the breakpoint must be included in [tb->pc, tb->pc + tb->size) in order to for it to be @@ -20337,22 +20333,22 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } - if (cs->singlestep_enabled && ctx.bstate !=3D BS_BRANCH) { - save_cpu_state(&ctx, ctx.bstate !=3D BS_EXCP); + if (cs->singlestep_enabled && ctx.is_jmp !=3D DISAS_NORETURN) { + save_cpu_state(&ctx, ctx.is_jmp !=3D DISAS_EXCP); gen_helper_raise_exception_debug(cpu_env); } else { - switch (ctx.bstate) { - case BS_STOP: + switch (ctx.is_jmp) { + case DISAS_STOP: gen_goto_tb(&ctx, 0, ctx.pc); break; - case BS_NONE: + case DISAS_NEXT: save_cpu_state(&ctx, 0); gen_goto_tb(&ctx, 0, ctx.pc); break; - case BS_EXCP: + case DISAS_EXCP: tcg_gen_exit_tb(0); break; - case BS_BRANCH: + case DISAS_NORETURN: default: break; } --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039869397995.3846586192451; Fri, 6 Apr 2018 11:37:49 -0700 (PDT) Received: from localhost ([::1]:46109 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4WF5-0002e0-7c for importer@patchew.org; Fri, 06 Apr 2018 14:37:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48783) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4VyB-0003oh-0V for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy2-0000SP-FB for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:14 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:48389) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy2-0000S2-9G for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:06 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id E5D1F20ED0; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:05 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 7AB8E1025A; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=braap.org; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=mesmtp; bh=0WlTDnEq11NE/sMmyq/pjobnLi BWavYzxrwi56axZGI=; b=TAVDyMwL+6Dwbsvwjb7vIx7pYalV3W8CAO8dG25lpR OlKt6yyhb148trSOgLlxfxkBGq9H96leaxQmAjFZzcq+9OEuwMiriJqjX9rLoYrj uw56S4teu62pMdt2f9Eg25uzddOg0RQObfTMIrQJmSvtjnl6ME4UBebGyNwEwnhx E= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=0WlTDn Eq11NE/sMmyq/pjobnLiBWavYzxrwi56axZGI=; b=V7S/uNlrKlXZX419IyEWzx YS/+pov56FNjudEYCnU36XkaKHNlDx/DN4mPmyHeLkMDeYYjCchaNwGg5sAGzfRd mV/sytCY/JZR7HQ3ZWuQlQaSG7dDji0zA9nxVpZtMf5WGJ2OelsV9g/Yyt3CRoTG AjXiCdkvJiDCJte9+BsRPMPjZC58Nc3FswwDgJVlocuuaK6cE0WeI3OYGC8lxtVa gswAxal71vFF63xElAN6fbDiD1W6xe5/iIZALK36WnKiwk/WA5QS/DDL++QEomGD h530OwgYC9OXw7OAHVhwxahFegNuIudJIltNg8UJc4xMTXO7JUWy1L1+kiPXX8Dg == X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:50 -0400 Message-Id: <1523038800-2494-8-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> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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 07/17] target/mips: 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: Yongbok Kim , Richard Henderson , Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Reviewed-by: Philippe Mathieu-Daud=C3=A9 Cc: Aurelien Jarno Cc: Yongbok Kim Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/mips/translate.c | 346 ++++++++++++++++++++++++--------------------= ---- 1 file changed, 175 insertions(+), 171 deletions(-) diff --git a/target/mips/translate.c b/target/mips/translate.c index a133205..aefd729 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -1430,17 +1430,15 @@ static TCGv_i64 msa_wr_d[64]; } while(0) =20 typedef struct DisasContext { - struct TranslationBlock *tb; - target_ulong pc, saved_pc; + DisasContextBase base; + target_ulong saved_pc; uint32_t opcode; - int singlestep_enabled; int insn_flags; int32_t CP0_Config1; /* Routine used to access memory */ int mem_idx; TCGMemOp default_tcg_memop_mask; uint32_t hflags, saved_hflags; - DisasJumpType is_jmp; target_ulong btarget; bool ulri; int kscrexist; @@ -1517,8 +1515,9 @@ static const char * const msaregnames[] =3D { if (MIPS_DEBUG_DISAS) { = \ qemu_log_mask(CPU_LOG_TB_IN_ASM, = \ TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\= n", \ - ctx->pc, ctx->opcode, op, ctx->opcode >> 26, = \ - ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F)= ); \ + ctx->base.pc_next, ctx->opcode, op, = \ + ctx->opcode >> 26, ctx->opcode & 0x3F, = \ + ((ctx->opcode >> 16) & 0x1F)); = \ } = \ } while (0) =20 @@ -1594,9 +1593,9 @@ static inline void gen_save_pc(target_ulong pc) static inline void save_cpu_state(DisasContext *ctx, int do_save_pc) { LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags); - if (do_save_pc && ctx->pc !=3D ctx->saved_pc) { - gen_save_pc(ctx->pc); - ctx->saved_pc =3D ctx->pc; + if (do_save_pc && ctx->base.pc_next !=3D ctx->saved_pc) { + gen_save_pc(ctx->base.pc_next); + ctx->saved_pc =3D ctx->base.pc_next; } if (ctx->hflags !=3D ctx->saved_hflags) { tcg_gen_movi_i32(hflags, ctx->hflags); @@ -1635,7 +1634,7 @@ static inline void generate_exception_err(DisasContex= t *ctx, int excp, int err) gen_helper_raise_exception_err(cpu_env, texcp, terr); tcg_temp_free_i32(terr); tcg_temp_free_i32(texcp); - ctx->is_jmp =3D DISAS_EXCP; + ctx->base.is_jmp =3D DISAS_EXCP; } =20 static inline void generate_exception(DisasContext *ctx, int excp) @@ -2126,7 +2125,7 @@ static void gen_base_offset_addr (DisasContext *ctx, = TCGv addr, =20 static target_ulong pc_relative_pc (DisasContext *ctx) { - target_ulong pc =3D ctx->pc; + target_ulong pc =3D ctx->base.pc_next; =20 if (ctx->hflags & MIPS_HFLAG_BMASK) { int branch_bytes =3D ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4; @@ -4275,12 +4274,12 @@ static void gen_trap (DisasContext *ctx, uint32_t o= pc, =20 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest) { - if (unlikely(ctx->singlestep_enabled)) { + if (unlikely(ctx->base.singlestep_enabled)) { return false; } =20 #ifndef CONFIG_USER_ONLY - return (ctx->tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAGE_MAS= K); + return (ctx->base.tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAG= E_MASK); #else return true; #endif @@ -4291,10 +4290,10 @@ static inline void gen_goto_tb(DisasContext *ctx, i= nt n, target_ulong dest) if (use_goto_tb(ctx, dest)) { tcg_gen_goto_tb(n); gen_save_pc(dest); - tcg_gen_exit_tb((uintptr_t)ctx->tb + n); + tcg_gen_exit_tb((uintptr_t)ctx->base.tb + n); } else { gen_save_pc(dest); - if (ctx->singlestep_enabled) { + if (ctx->base.singlestep_enabled) { save_cpu_state(ctx, 0); gen_helper_raise_exception_debug(cpu_env); } @@ -4317,7 +4316,7 @@ static void gen_compute_branch (DisasContext *ctx, ui= nt32_t opc, if (ctx->hflags & MIPS_HFLAG_BMASK) { #ifdef MIPS_DEBUG_DISAS LOG_DISAS("Branch in delay / forbidden slot at PC 0x" - TARGET_FMT_lx "\n", ctx->pc); + TARGET_FMT_lx "\n", ctx->base.pc_next); #endif generate_exception_end(ctx, EXCP_RI); goto out; @@ -4335,7 +4334,7 @@ static void gen_compute_branch (DisasContext *ctx, ui= nt32_t opc, gen_load_gpr(t1, rt); bcond_compute =3D 1; } - btgt =3D ctx->pc + insn_bytes + offset; + btgt =3D ctx->base.pc_next + insn_bytes + offset; break; case OPC_BGEZ: case OPC_BGEZAL: @@ -4354,7 +4353,7 @@ static void gen_compute_branch (DisasContext *ctx, ui= nt32_t opc, gen_load_gpr(t0, rs); bcond_compute =3D 1; } - btgt =3D ctx->pc + insn_bytes + offset; + btgt =3D ctx->base.pc_next + insn_bytes + offset; break; case OPC_BPOSGE32: #if defined(TARGET_MIPS64) @@ -4364,13 +4363,14 @@ static void gen_compute_branch (DisasContext *ctx, = uint32_t opc, tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F); #endif bcond_compute =3D 1; - btgt =3D ctx->pc + insn_bytes + offset; + btgt =3D ctx->base.pc_next + insn_bytes + offset; break; case OPC_J: case OPC_JAL: case OPC_JALX: /* Jump to immediate */ - btgt =3D ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_= t)offset; + btgt =3D ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) | + (uint32_t)offset; break; case OPC_JR: case OPC_JALR: @@ -4416,19 +4416,19 @@ static void gen_compute_branch (DisasContext *ctx, = uint32_t opc, /* Handle as an unconditional branch to get correct delay slot checking. */ blink =3D 31; - btgt =3D ctx->pc + insn_bytes + delayslot_size; + btgt =3D ctx->base.pc_next + insn_bytes + delayslot_size; ctx->hflags |=3D MIPS_HFLAG_B; break; case OPC_BLTZALL: /* 0 < 0 likely */ - tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8); + tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8); /* Skip the instruction in the delay slot */ - ctx->pc +=3D 4; + ctx->base.pc_next +=3D 4; goto out; case OPC_BNEL: /* rx !=3D rx likely */ case OPC_BGTZL: /* 0 > 0 likely */ case OPC_BLTZL: /* 0 < 0 likely */ /* Skip the instruction in the delay slot */ - ctx->pc +=3D 4; + ctx->base.pc_next +=3D 4; goto out; case OPC_J: ctx->hflags |=3D MIPS_HFLAG_B; @@ -4540,7 +4540,8 @@ static void gen_compute_branch (DisasContext *ctx, ui= nt32_t opc, int post_delay =3D insn_bytes + delayslot_size; int lowbit =3D !!(ctx->hflags & MIPS_HFLAG_M16); =20 - tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit); + tcg_gen_movi_tl(cpu_gpr[blink], + ctx->base.pc_next + post_delay + lowbit); } =20 out: @@ -5322,18 +5323,18 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) switch (sel) { case 0: /* Mark as an IO operation because we read the time. */ - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_start(); } gen_helper_mfc0_count(arg, cpu_env); - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_end(); } /* Break the TB to be able to take timer interrupts immediately after reading count. DISAS_STOP isn't sufficient, we need to ensure we break completely out of translated code. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Count"; break; /* 6,7 are implementation dependent */ @@ -5729,7 +5730,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) if (sel !=3D 0) check_insn(ctx, ISA_MIPS32); =20 - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_start(); } =20 @@ -5901,7 +5902,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_pagegrain(cpu_env, arg); rn =3D "PageGrain"; - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 2: CP0_CHECK(ctx->sc); @@ -5962,7 +5963,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) case 0: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_hwrena(cpu_env, arg); - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "HWREna"; break; default: @@ -6025,29 +6026,29 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) save_cpu_state(ctx, 1); gen_helper_mtc0_status(cpu_env, arg); /* DISAS_STOP isn't good enough here, hflags may have changed.= */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Status"; break; case 1: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_intctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "IntCtl"; break; case 2: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_srsctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "SRSCtl"; break; case 3: check_insn(ctx, ISA_MIPS32R2); gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap)); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "SRSMap"; break; default: @@ -6062,8 +6063,8 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) /* Stop translation as we may have triggered an interrupt. * DISAS_STOP isn't sufficient, we need to ensure we break out= of * translated code to check for pending interrupts. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Cause"; break; default: @@ -6101,7 +6102,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) gen_helper_mtc0_config0(cpu_env, arg); rn =3D "Config"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 1: /* ignored, read only */ @@ -6111,24 +6112,24 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) gen_helper_mtc0_config2(cpu_env, arg); rn =3D "Config2"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 3: gen_helper_mtc0_config3(cpu_env, arg); rn =3D "Config3"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 4: gen_helper_mtc0_config4(cpu_env, arg); rn =3D "Config4"; - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 5: gen_helper_mtc0_config5(cpu_env, arg); rn =3D "Config5"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; /* 6,7 are implementation dependent */ case 6: @@ -6218,34 +6219,34 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) case 0: gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ /* DISAS_STOP isn't good enough here, hflags may have changed.= */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Debug"; break; case 1: // gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace suppo= rt */ rn =3D "TraceControl"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 2: // gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace supp= ort */ rn =3D "TraceControl2"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 3: /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; // gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace supp= ort */ rn =3D "UserTraceData"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; goto cp0_unimplemented; case 4: // gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "TraceBPC"; goto cp0_unimplemented; default: @@ -6305,7 +6306,7 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int= reg, int sel) switch (sel) { case 0: gen_helper_mtc0_errctl(cpu_env, arg); - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "ErrCtl"; break; default: @@ -6396,12 +6397,12 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, i= nt reg, int sel) trace_mips_translate_c0("mtc0", rn, reg, sel); =20 /* For simplicity assume that all writes can cause interrupts. */ - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_end(); /* DISAS_STOP isn't sufficient, we need to ensure we break out of * translated code to check for pending interrupts. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; } return; =20 @@ -6674,18 +6675,18 @@ static void gen_dmfc0(DisasContext *ctx, TCGv arg, = int reg, int sel) switch (sel) { case 0: /* Mark as an IO operation because we read the time. */ - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_start(); } gen_helper_mfc0_count(arg, cpu_env); - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_end(); } /* Break the TB to be able to take timer interrupts immediately after reading count. DISAS_STOP isn't sufficient, we need to ensure we break completely out of translated code. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Count"; break; /* 6,7 are implementation dependent */ @@ -7067,7 +7068,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) if (sel !=3D 0) check_insn(ctx, ISA_MIPS64); =20 - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_start(); } =20 @@ -7297,7 +7298,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) case 0: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_hwrena(cpu_env, arg); - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "HWREna"; break; default: @@ -7333,7 +7334,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) goto cp0_unimplemented; } /* Stop translation as we may have switched the execution mode */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 10: switch (sel) { @@ -7356,7 +7357,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) goto cp0_unimplemented; } /* Stop translation as we may have switched the execution mode */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 12: switch (sel) { @@ -7364,29 +7365,29 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) save_cpu_state(ctx, 1); gen_helper_mtc0_status(cpu_env, arg); /* DISAS_STOP isn't good enough here, hflags may have changed.= */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Status"; break; case 1: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_intctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "IntCtl"; break; case 2: check_insn(ctx, ISA_MIPS32R2); gen_helper_mtc0_srsctl(cpu_env, arg); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "SRSCtl"; break; case 3: check_insn(ctx, ISA_MIPS32R2); gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap)); /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "SRSMap"; break; default: @@ -7401,8 +7402,8 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) /* Stop translation as we may have triggered an intetrupt. * DISAS_STOP isn't sufficient, we need to ensure we break out= of * translated code to check for pending interrupts. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Cause"; break; default: @@ -7440,7 +7441,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) gen_helper_mtc0_config0(cpu_env, arg); rn =3D "Config"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 1: /* ignored, read only */ @@ -7450,13 +7451,13 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) gen_helper_mtc0_config2(cpu_env, arg); rn =3D "Config2"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 3: gen_helper_mtc0_config3(cpu_env, arg); rn =3D "Config3"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case 4: /* currently ignored */ @@ -7466,7 +7467,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) gen_helper_mtc0_config5(cpu_env, arg); rn =3D "Config5"; /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; /* 6,7 are implementation dependent */ default: @@ -7546,32 +7547,32 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) case 0: gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ /* DISAS_STOP isn't good enough here, hflags may have changed.= */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; rn =3D "Debug"; break; case 1: // gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace suppo= rt */ /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "TraceControl"; goto cp0_unimplemented; case 2: // gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace supp= ort */ /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "TraceControl2"; goto cp0_unimplemented; case 3: // gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace supp= ort */ /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "UserTraceData"; goto cp0_unimplemented; case 4: // gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ /* Stop translation as we may have switched the execution mode= */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "TraceBPC"; goto cp0_unimplemented; default: @@ -7631,7 +7632,7 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, in= t reg, int sel) switch (sel) { case 0: gen_helper_mtc0_errctl(cpu_env, arg); - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; rn =3D "ErrCtl"; break; default: @@ -7722,12 +7723,12 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, = int reg, int sel) trace_mips_translate_c0("dmtc0", rn, reg, sel); =20 /* For simplicity assume that all writes can cause interrupts. */ - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_end(); /* DISAS_STOP isn't sufficient, we need to ensure we break out of * translated code to check for pending interrupts. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; } return; =20 @@ -8138,7 +8139,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext = *ctx, int rd, int rt, tcg_temp_free_i32(fs_tmp); } /* Stop translation as we may have changed hflags */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; /* COP2: Not implemented. */ case 4: @@ -8297,7 +8298,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext = *ctx, uint32_t opc, int rt, check_insn(ctx, ISA_MIPS2); gen_helper_eret(cpu_env); } - ctx->is_jmp =3D DISAS_EXCP; + ctx->base.is_jmp =3D DISAS_EXCP; } break; case OPC_DERET: @@ -8312,7 +8313,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext = *ctx, uint32_t opc, int rt, generate_exception_end(ctx, EXCP_RI); } else { gen_helper_deret(cpu_env); - ctx->is_jmp =3D DISAS_EXCP; + ctx->base.is_jmp =3D DISAS_EXCP; } break; case OPC_WAIT: @@ -8323,11 +8324,11 @@ static void gen_cp0 (CPUMIPSState *env, DisasContex= t *ctx, uint32_t opc, int rt, goto die; } /* If we get an exception, we want to restart at next instruction = */ - ctx->pc +=3D 4; + ctx->base.pc_next +=3D 4; save_cpu_state(ctx, 1); - ctx->pc -=3D 4; + ctx->base.pc_next -=3D 4; gen_helper_wait(cpu_env); - ctx->is_jmp =3D DISAS_EXCP; + ctx->base.is_jmp =3D DISAS_EXCP; break; default: die: @@ -8354,7 +8355,7 @@ static void gen_compute_branch1(DisasContext *ctx, ui= nt32_t op, if (cc !=3D 0) check_insn(ctx, ISA_MIPS4 | ISA_MIPS32); =20 - btarget =3D ctx->pc + 4 + offset; + btarget =3D ctx->base.pc_next + 4 + offset; =20 switch (op) { case OPC_BC1F: @@ -8457,7 +8458,7 @@ static void gen_compute_branch1_r6(DisasContext *ctx,= uint32_t op, if (ctx->hflags & MIPS_HFLAG_BMASK) { #ifdef MIPS_DEBUG_DISAS LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx - "\n", ctx->pc); + "\n", ctx->base.pc_next); #endif generate_exception_end(ctx, EXCP_RI); goto out; @@ -8466,7 +8467,7 @@ static void gen_compute_branch1_r6(DisasContext *ctx,= uint32_t op, gen_load_fpr64(ctx, t0, ft); tcg_gen_andi_i64(t0, t0, 1); =20 - btarget =3D addr_add(ctx, ctx->pc + 4, offset); + btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); =20 switch (op) { case OPC_BC1EQZ: @@ -8752,7 +8753,7 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc,= int rt, int fs) tcg_temp_free_i32(fs_tmp); } /* Stop translation as we may have changed hflags */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; #if defined(TARGET_MIPS64) case OPC_DMFC1: @@ -10751,19 +10752,19 @@ static void gen_rdhwr(DisasContext *ctx, int rt, = int rd, int sel) gen_store_gpr(t0, rt); break; case 2: - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { gen_io_start(); } gen_helper_rdhwr_cc(t0, cpu_env); - if (tb_cflags(ctx->tb) & CF_USE_ICOUNT) { + if (tb_cflags(ctx->base.tb) & 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. DISAS_STOP isn't sufficient, we need to en= sure we break completely out of translated code. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; break; case 3: gen_helper_rdhwr_ccres(t0, cpu_env); @@ -10813,7 +10814,7 @@ static void gen_rdhwr(DisasContext *ctx, int rt, in= t rd, int sel) static inline void clear_branch_hflags(DisasContext *ctx) { ctx->hflags &=3D ~MIPS_HFLAG_BMASK; - if (ctx->is_jmp =3D=3D DISAS_NEXT) { + if (ctx->base.is_jmp =3D=3D DISAS_NEXT) { save_cpu_state(ctx, 0); } else { /* it is not safe to save ctx->hflags as hflags may be changed @@ -10828,11 +10829,11 @@ static void gen_branch(DisasContext *ctx, int ins= n_bytes) int proc_hflags =3D ctx->hflags & MIPS_HFLAG_BMASK; /* Branches completion */ clear_branch_hflags(ctx); - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; /* FIXME: Need to clear can_do_io. */ switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) { case MIPS_HFLAG_FBNSLOT: - gen_goto_tb(ctx, 0, ctx->pc + insn_bytes); + gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes); break; case MIPS_HFLAG_B: /* unconditional branch */ @@ -10851,7 +10852,7 @@ static void gen_branch(DisasContext *ctx, int insn_= bytes) TCGLabel *l1 =3D gen_new_label(); =20 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1); - gen_goto_tb(ctx, 1, ctx->pc + insn_bytes); + gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes); gen_set_label(l1); gen_goto_tb(ctx, 0, ctx->btarget); } @@ -10874,7 +10875,7 @@ static void gen_branch(DisasContext *ctx, int insn_= bytes) } else { tcg_gen_mov_tl(cpu_PC, btarget); } - if (ctx->singlestep_enabled) { + if (ctx->base.singlestep_enabled) { save_cpu_state(ctx, 0); gen_helper_raise_exception_debug(cpu_env); } @@ -10899,7 +10900,7 @@ static void gen_compute_compact_branch(DisasContext= *ctx, uint32_t opc, if (ctx->hflags & MIPS_HFLAG_BMASK) { #ifdef MIPS_DEBUG_DISAS LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx - "\n", ctx->pc); + "\n", ctx->base.pc_next); #endif generate_exception_end(ctx, EXCP_RI); goto out; @@ -10913,10 +10914,10 @@ static void gen_compute_compact_branch(DisasConte= xt *ctx, uint32_t opc, gen_load_gpr(t0, rs); gen_load_gpr(t1, rt); bcond_compute =3D 1; - ctx->btarget =3D addr_add(ctx, ctx->pc + 4, offset); + ctx->btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); if (rs <=3D rt && rs =3D=3D 0) { /* OPC_BEQZALC, OPC_BNEZALC */ - tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit); + tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbi= t); } break; case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */ @@ -10924,23 +10925,23 @@ static void gen_compute_compact_branch(DisasConte= xt *ctx, uint32_t opc, gen_load_gpr(t0, rs); gen_load_gpr(t1, rt); bcond_compute =3D 1; - ctx->btarget =3D addr_add(ctx, ctx->pc + 4, offset); + ctx->btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); break; case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */ case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */ if (rs =3D=3D 0 || rs =3D=3D rt) { /* OPC_BLEZALC, OPC_BGEZALC */ /* OPC_BGTZALC, OPC_BLTZALC */ - tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit); + tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbi= t); } gen_load_gpr(t0, rs); gen_load_gpr(t1, rt); bcond_compute =3D 1; - ctx->btarget =3D addr_add(ctx, ctx->pc + 4, offset); + ctx->btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); break; case OPC_BC: case OPC_BALC: - ctx->btarget =3D addr_add(ctx, ctx->pc + 4, offset); + ctx->btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); break; case OPC_BEQZC: case OPC_BNEZC: @@ -10948,7 +10949,7 @@ static void gen_compute_compact_branch(DisasContext= *ctx, uint32_t opc, /* OPC_BEQZC, OPC_BNEZC */ gen_load_gpr(t0, rs); bcond_compute =3D 1; - ctx->btarget =3D addr_add(ctx, ctx->pc + 4, offset); + ctx->btarget =3D addr_add(ctx, ctx->base.pc_next + 4, offset); } else { /* OPC_JIC, OPC_JIALC */ TCGv tbase =3D tcg_temp_new(); @@ -10971,13 +10972,13 @@ static void gen_compute_compact_branch(DisasConte= xt *ctx, uint32_t opc, /* Uncoditional compact branch */ switch (opc) { case OPC_JIALC: - tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit); + tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbi= t); /* Fallthrough */ case OPC_JIC: ctx->hflags |=3D MIPS_HFLAG_BR; break; case OPC_BALC: - tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit); + tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbi= t); /* Fallthrough */ case OPC_BC: ctx->hflags |=3D MIPS_HFLAG_B; @@ -11602,7 +11603,7 @@ static void decode_i64_mips16 (DisasContext *ctx, =20 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ct= x) { - int extend =3D cpu_lduw_code(env, ctx->pc + 2); + int extend =3D cpu_lduw_code(env, ctx->base.pc_next + 2); int op, rx, ry, funct, sa; int16_t imm, offset; =20 @@ -11842,7 +11843,7 @@ static int decode_mips16_opc (CPUMIPSState *env, Di= sasContext *ctx) /* No delay slot, so just process as a normal instruction */ break; case M16_OPC_JAL: - offset =3D cpu_lduw_code(env, ctx->pc + 2); + offset =3D cpu_lduw_code(env, ctx->base.pc_next + 2); offset =3D (((ctx->opcode & 0x1f) << 21) | ((ctx->opcode >> 5) & 0x1f) << 16 | offset) << 2; @@ -13570,7 +13571,7 @@ static void gen_pool32axf (CPUMIPSState *env, Disas= Context *ctx, int rt, int rs) gen_helper_di(t0, cpu_env); gen_store_gpr(t0, rs); /* Stop translation as we may have switched the execution = mode */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; tcg_temp_free(t0); } break; @@ -13584,8 +13585,8 @@ static void gen_pool32axf (CPUMIPSState *env, Disas= Context *ctx, int rt, int rs) gen_store_gpr(t0, rs); /* DISAS_STOP isn't sufficient, we need to ensure we break= out of translated code to check for pending interrupts. */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; tcg_temp_free(t0); } break; @@ -13940,7 +13941,7 @@ static void decode_micromips32_opc(CPUMIPSState *en= v, DisasContext *ctx) uint32_t op, minor, minor2, mips32_op; uint32_t cond, fmt, cc; =20 - insn =3D cpu_lduw_code(env, ctx->pc + 2); + insn =3D cpu_lduw_code(env, ctx->base.pc_next + 2); ctx->opcode =3D (ctx->opcode << 16) | insn; =20 rt =3D (ctx->opcode >> 21) & 0x1f; @@ -14741,7 +14742,7 @@ static void decode_micromips32_opc(CPUMIPSState *en= v, DisasContext *ctx) /* SYNCI */ /* Break the TB to be able to sync copied instructions immediately */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; } else { /* TNEI */ mips32_op =3D OPC_TNEI; @@ -14772,7 +14773,7 @@ static void decode_micromips32_opc(CPUMIPSState *en= v, DisasContext *ctx) check_insn_opc_removed(ctx, ISA_MIPS32R6); /* Break the TB to be able to sync copied instructions immediately */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case BC2F: case BC2T: @@ -15135,16 +15136,16 @@ static void decode_micromips32_opc(CPUMIPSState *= env, DisasContext *ctx) /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */ switch ((ctx->opcode >> 16) & 0x1f) { case ADDIUPC_00 ... ADDIUPC_07: - gen_pcrel(ctx, OPC_ADDIUPC, ctx->pc & ~0x3, rt); + gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt); break; case AUIPC: - gen_pcrel(ctx, OPC_AUIPC, ctx->pc, rt); + gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt); break; case ALUIPC: - gen_pcrel(ctx, OPC_ALUIPC, ctx->pc, rt); + gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt); break; case LWPC_08 ... LWPC_0F: - gen_pcrel(ctx, R6_OPC_LWPC, ctx->pc & ~0x3, rt); + gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt); break; default: generate_exception(ctx, EXCP_RI); @@ -15276,8 +15277,8 @@ static int decode_micromips_opc (CPUMIPSState *env,= DisasContext *ctx) uint32_t op; =20 /* make sure instructions are on a halfword boundary */ - if (ctx->pc & 0x1) { - env->CP0_BadVAddr =3D ctx->pc; + if (ctx->base.pc_next & 0x1) { + env->CP0_BadVAddr =3D ctx->base.pc_next; generate_exception_end(ctx, EXCP_AdEL); return 2; } @@ -18503,7 +18504,7 @@ static void gen_msa_branch(CPUMIPSState *env, Disas= Context *ctx, uint32_t op1) break; } =20 - ctx->btarget =3D ctx->pc + (s16 << 2) + 4; + ctx->btarget =3D ctx->base.pc_next + (s16 << 2) + 4; =20 ctx->hflags |=3D MIPS_HFLAG_BC; ctx->hflags |=3D MIPS_HFLAG_BDS32; @@ -19524,8 +19525,8 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) int16_t imm; =20 /* make sure instructions are on a word boundary */ - if (ctx->pc & 0x3) { - env->CP0_BadVAddr =3D ctx->pc; + if (ctx->base.pc_next & 0x3) { + env->CP0_BadVAddr =3D ctx->base.pc_next; generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL); return; } @@ -19536,7 +19537,7 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) =20 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1); tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK); - gen_goto_tb(ctx, 1, ctx->pc + 4); + gen_goto_tb(ctx, 1, ctx->base.pc_next + 4); gen_set_label(l1); } =20 @@ -19597,7 +19598,7 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) check_insn(ctx, ISA_MIPS32R2); /* Break the TB to be able to sync copied instructions immediately */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case OPC_BPOSGE32: /* MIPS DSP branch */ #if defined(TARGET_MIPS64) @@ -19700,7 +19701,7 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) gen_store_gpr(t0, rt); /* Stop translation as we may have switched the execution mode. */ - ctx->is_jmp =3D DISAS_STOP; + ctx->base.is_jmp =3D DISAS_STOP; break; case OPC_EI: check_insn(ctx, ISA_MIPS32R2); @@ -19709,8 +19710,8 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) gen_store_gpr(t0, rt); /* DISAS_STOP isn't sufficient, we need to ensure we b= reak out of translated code to check for pending interru= pts */ - gen_save_pc(ctx->pc + 4); - ctx->is_jmp =3D DISAS_EXCP; + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXCP; break; default: /* Invalid */ MIPS_INVAL("mfmc0"); @@ -20184,7 +20185,7 @@ static void decode_opc(CPUMIPSState *env, DisasCont= ext *ctx) break; case OPC_PCREL: check_insn(ctx, ISA_MIPS32R6); - gen_pcrel(ctx, ctx->opcode, ctx->pc, rs); + gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs); break; default: /* Invalid */ MIPS_INVAL("major opcode"); @@ -20197,22 +20198,22 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) { CPUMIPSState *env =3D cs->env_ptr; DisasContext ctx; - target_ulong pc_start; target_ulong next_page_start; - int num_insns; int max_insns; int insn_bytes; int is_slot; =20 - pc_start =3D tb->pc; - next_page_start =3D (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; - ctx.pc =3D pc_start; + ctx.base.tb =3D tb; + ctx.base.pc_first =3D tb->pc; + ctx.base.pc_next =3D tb->pc; + ctx.base.is_jmp =3D DISAS_NEXT; + ctx.base.singlestep_enabled =3D cs->singlestep_enabled; + ctx.base.num_insns =3D 0; + + next_page_start =3D (ctx.base.pc_first & TARGET_PAGE_MASK) + TARGET_PA= GE_SIZE; ctx.saved_pc =3D -1; - ctx.singlestep_enabled =3D cs->singlestep_enabled; ctx.insn_flags =3D env->insn_flags; ctx.CP0_Config1 =3D env->CP0_Config1; - ctx.tb =3D tb; - ctx.is_jmp =3D DISAS_NEXT; ctx.btarget =3D 0; ctx.kscrexist =3D (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; ctx.rxi =3D (env->CP0_Config3 >> CP0C3_RXI) & 1; @@ -20226,7 +20227,7 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) ctx.CP0_LLAddr_shift =3D env->CP0_LLAddr_shift; ctx.cmgcr =3D (env->CP0_Config3 >> CP0C3_CMGCR) & 1; /* Restore delay slot state from the tb context. */ - ctx.hflags =3D (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? = */ + ctx.hflags =3D (uint32_t)ctx.base.tb->flags; /* FIXME: maybe use 64 bi= ts? */ ctx.ulri =3D (env->CP0_Config3 >> CP0C3_ULRI) & 1; ctx.ps =3D ((env->active_fpu.fcr0 >> FCR0_PS) & 1) || (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)); @@ -20242,7 +20243,6 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) #endif ctx.default_tcg_memop_mask =3D (ctx.insn_flags & ISA_MIPS32R6) ? MO_UNALN : MO_ALIGN; - num_insns =3D 0; max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; if (max_insns =3D=3D 0) { max_insns =3D CF_COUNT_MASK; @@ -20253,36 +20253,37 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) =20 LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags); gen_tb_start(tb); - while (ctx.is_jmp =3D=3D DISAS_NEXT) { - tcg_gen_insn_start(ctx.pc, ctx.hflags & MIPS_HFLAG_BMASK, ctx.btar= get); - num_insns++; + while (ctx.base.is_jmp =3D=3D DISAS_NEXT) { + tcg_gen_insn_start(ctx.base.pc_next, ctx.hflags & MIPS_HFLAG_BMASK, + ctx.btarget); + ctx.base.num_insns++; =20 - if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) { + if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) { save_cpu_state(&ctx, 1); - ctx.is_jmp =3D DISAS_NORETURN; + ctx.base.is_jmp =3D DISAS_NORETURN; gen_helper_raise_exception_debug(cpu_env); /* 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. */ - ctx.pc +=3D 4; + ctx.base.pc_next +=3D 4; goto done_generating; } =20 - if (num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAST_IO)) { + if (ctx.base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAS= T_IO)) { gen_io_start(); } =20 is_slot =3D ctx.hflags & MIPS_HFLAG_BMASK; if (!(ctx.hflags & MIPS_HFLAG_M16)) { - ctx.opcode =3D cpu_ldl_code(env, ctx.pc); + ctx.opcode =3D cpu_ldl_code(env, ctx.base.pc_next); insn_bytes =3D 4; decode_opc(env, &ctx); } else if (ctx.insn_flags & ASE_MICROMIPS) { - ctx.opcode =3D cpu_lduw_code(env, ctx.pc); + ctx.opcode =3D cpu_lduw_code(env, ctx.base.pc_next); insn_bytes =3D decode_micromips_opc(env, &ctx); } else if (ctx.insn_flags & ASE_MIPS16) { - ctx.opcode =3D cpu_lduw_code(env, ctx.pc); + ctx.opcode =3D cpu_lduw_code(env, ctx.base.pc_next); insn_bytes =3D decode_mips16_opc(env, &ctx); } else { generate_exception_end(&ctx, EXCP_RI); @@ -20306,17 +20307,18 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) if (is_slot) { gen_branch(&ctx, insn_bytes); } - ctx.pc +=3D insn_bytes; + ctx.base.pc_next +=3D insn_bytes; =20 /* Execute a branch and its delay slot as a single instruction. This is what GDB expects and is consistent with what the hardware does (e.g. if a delay slot instruction faults, the reported PC is the PC of the branch). */ - if (cs->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) =3D= =3D 0) { + if (ctx.base.singlestep_enabled && + (ctx.hflags & MIPS_HFLAG_BMASK) =3D=3D 0) { break; } =20 - if (ctx.pc >=3D next_page_start) { + if (ctx.base.pc_next >=3D next_page_start) { break; } =20 @@ -20324,8 +20326,9 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) break; } =20 - if (num_insns >=3D max_insns) + if (ctx.base.num_insns >=3D max_insns) { break; + } =20 if (singlestep) break; @@ -20333,17 +20336,17 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } - if (cs->singlestep_enabled && ctx.is_jmp !=3D DISAS_NORETURN) { - save_cpu_state(&ctx, ctx.is_jmp !=3D DISAS_EXCP); + if (ctx.base.singlestep_enabled && ctx.base.is_jmp !=3D DISAS_NORETURN= ) { + save_cpu_state(&ctx, ctx.base.is_jmp !=3D DISAS_EXCP); gen_helper_raise_exception_debug(cpu_env); } else { - switch (ctx.is_jmp) { + switch (ctx.base.is_jmp) { case DISAS_STOP: - gen_goto_tb(&ctx, 0, ctx.pc); + gen_goto_tb(&ctx, 0, ctx.base.pc_next); break; case DISAS_NEXT: save_cpu_state(&ctx, 0); - gen_goto_tb(&ctx, 0, ctx.pc); + gen_goto_tb(&ctx, 0, ctx.base.pc_next); break; case DISAS_EXCP: tcg_gen_exit_tb(0); @@ -20354,18 +20357,19 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) } } done_generating: - gen_tb_end(tb, num_insns); + gen_tb_end(tb, ctx.base.num_insns); =20 - tb->size =3D ctx.pc - pc_start; - tb->icount =3D num_insns; + tb->size =3D ctx.base.pc_next - ctx.base.pc_first; + tb->icount =3D ctx.base.num_insns; =20 #ifdef DEBUG_DISAS LOG_DISAS("\n"); if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { + && qemu_log_in_addr_range(ctx.base.pc_first)) { qemu_log_lock(); - qemu_log("IN: %s\n", lookup_symbol(pc_start)); - log_target_disas(cs, pc_start, ctx.pc - pc_start); + qemu_log("IN: %s\n", lookup_symbol(ctx.base.pc_first)); + log_target_disas(cs, ctx.base.pc_first, + ctx.base.pc_next - ctx.base.pc_first); qemu_log("\n"); qemu_log_unlock(); } --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039304900659.2761409461788; Fri, 6 Apr 2018 11:28:24 -0700 (PDT) Received: from localhost ([::1]:45426 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W5z-00021F-9T for importer@patchew.org; Fri, 06 Apr 2018 14:28:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48621) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kY-9z for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy2-0000SK-EG for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:44091) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy2-0000S3-9h for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:06 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id ECF7920EEF; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:05 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id AF036E4437; Fri, 6 Apr 2018 14:20:05 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=braap.org; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=mesmtp; bh=quWc4HW0ZJS10HpJBObKTgMaUP /pjpa4GZ3+buTkkJs=; b=IIRBdTGdi6y0eL8TJmTf+RVb3Jsb8DxHCNkbD92R8v A4qbbUq+pDABUvUrbBJVlRbIgdPwl0/WFl+nke3eqaebIdD67+F6nHp+pWNCWUFp T+GgrIuMUeuqwc4qblPDVklRhardHHM+PaGJ0kUtMc2JRUUn3Ny8dYmCJHQAAq9L w= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=quWc4H W0ZJS10HpJBObKTgMaUP/pjpa4GZ3+buTkkJs=; b=kPNhgN7NTH4jlTGDZhhaUI oMdciEc3L7W51/JTsazcUIzB17BGJFZkejexNRUZS+ISNL3si8xqpa7eDuk/1PrW 4rDTDcqNHrtflyeP4pjtr1uqsrtn7skS4/R0FFa7eW88FOPViG7lmm8mzwYSwtMv 8QqG+Ze+63uKAX3STVViuE7s7vtnxf0b78KfKHwgQ4cMC0RzXsB1qVXoa1io+QRB Dt4vhRJ0T8Og7lupyxmdSSz20/VkB/A+2ql/GSILFd34OfECugpdEz4nePz2uqrE yRAJT2RV2yMtu6BsD+3ibCA54qb4/6vtz4Z3tXJ4iIjNYS6L/qrfaAmaJakt0fBw == X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:51 -0400 Message-Id: <1523038800-2494-9-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> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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 08/17] target/mips: use *ctx for DisasContext 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: Yongbok Kim , Richard Henderson , Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 No changes to the logic here; this is just to make the diff that follows easier to read. While at it, remove the unnecessary 'struct' in 'struct TranslationBlock'. Note that checkpatch complains with a false positive: ERROR: space prohibited after that '&' (ctx:WxW) #75: FILE: target/mips/translate.c:20220: + ctx->kscrexist =3D (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; ^ Reviewed-by: Philippe Mathieu-Daud=C3=A9 Cc: Aurelien Jarno Cc: Yongbok Kim Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/mips/translate.c | 166 ++++++++++++++++++++++++--------------------= ---- 1 file changed, 84 insertions(+), 82 deletions(-) diff --git a/target/mips/translate.c b/target/mips/translate.c index aefd729..08bd140 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -20194,55 +20194,57 @@ static void decode_opc(CPUMIPSState *env, DisasCo= ntext *ctx) } } =20 -void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) { CPUMIPSState *env =3D cs->env_ptr; - DisasContext ctx; + DisasContext ctx1; + DisasContext *ctx =3D &ctx1; target_ulong next_page_start; int max_insns; int insn_bytes; int is_slot; =20 - ctx.base.tb =3D tb; - ctx.base.pc_first =3D tb->pc; - ctx.base.pc_next =3D tb->pc; - ctx.base.is_jmp =3D DISAS_NEXT; - ctx.base.singlestep_enabled =3D cs->singlestep_enabled; - ctx.base.num_insns =3D 0; - - next_page_start =3D (ctx.base.pc_first & TARGET_PAGE_MASK) + TARGET_PA= GE_SIZE; - ctx.saved_pc =3D -1; - ctx.insn_flags =3D env->insn_flags; - ctx.CP0_Config1 =3D env->CP0_Config1; - ctx.btarget =3D 0; - ctx.kscrexist =3D (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; - ctx.rxi =3D (env->CP0_Config3 >> CP0C3_RXI) & 1; - ctx.ie =3D (env->CP0_Config4 >> CP0C4_IE) & 3; - ctx.bi =3D (env->CP0_Config3 >> CP0C3_BI) & 1; - ctx.bp =3D (env->CP0_Config3 >> CP0C3_BP) & 1; - ctx.PAMask =3D env->PAMask; - ctx.mvh =3D (env->CP0_Config5 >> CP0C5_MVH) & 1; - ctx.eva =3D (env->CP0_Config5 >> CP0C5_EVA) & 1; - ctx.sc =3D (env->CP0_Config3 >> CP0C3_SC) & 1; - ctx.CP0_LLAddr_shift =3D env->CP0_LLAddr_shift; - ctx.cmgcr =3D (env->CP0_Config3 >> CP0C3_CMGCR) & 1; + ctx->base.tb =3D tb; + ctx->base.pc_first =3D tb->pc; + ctx->base.pc_next =3D tb->pc; + ctx->base.is_jmp =3D DISAS_NEXT; + ctx->base.singlestep_enabled =3D cs->singlestep_enabled; + ctx->base.num_insns =3D 0; + + next_page_start =3D (ctx->base.pc_first & TARGET_PAGE_MASK) + + TARGET_PAGE_SIZE; + ctx->saved_pc =3D -1; + ctx->insn_flags =3D env->insn_flags; + ctx->CP0_Config1 =3D env->CP0_Config1; + ctx->btarget =3D 0; + ctx->kscrexist =3D (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; + ctx->rxi =3D (env->CP0_Config3 >> CP0C3_RXI) & 1; + ctx->ie =3D (env->CP0_Config4 >> CP0C4_IE) & 3; + ctx->bi =3D (env->CP0_Config3 >> CP0C3_BI) & 1; + ctx->bp =3D (env->CP0_Config3 >> CP0C3_BP) & 1; + ctx->PAMask =3D env->PAMask; + ctx->mvh =3D (env->CP0_Config5 >> CP0C5_MVH) & 1; + ctx->eva =3D (env->CP0_Config5 >> CP0C5_EVA) & 1; + ctx->sc =3D (env->CP0_Config3 >> CP0C3_SC) & 1; + ctx->CP0_LLAddr_shift =3D env->CP0_LLAddr_shift; + ctx->cmgcr =3D (env->CP0_Config3 >> CP0C3_CMGCR) & 1; /* Restore delay slot state from the tb context. */ - ctx.hflags =3D (uint32_t)ctx.base.tb->flags; /* FIXME: maybe use 64 bi= ts? */ - ctx.ulri =3D (env->CP0_Config3 >> CP0C3_ULRI) & 1; - ctx.ps =3D ((env->active_fpu.fcr0 >> FCR0_PS) & 1) || + ctx->hflags =3D (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 = bits? */ + ctx->ulri =3D (env->CP0_Config3 >> CP0C3_ULRI) & 1; + ctx->ps =3D ((env->active_fpu.fcr0 >> FCR0_PS) & 1) || (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)); - ctx.vp =3D (env->CP0_Config5 >> CP0C5_VP) & 1; - ctx.mrp =3D (env->CP0_Config5 >> CP0C5_MRP) & 1; - ctx.nan2008 =3D (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1; - ctx.abs2008 =3D (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1; - restore_cpu_state(env, &ctx); + ctx->vp =3D (env->CP0_Config5 >> CP0C5_VP) & 1; + ctx->mrp =3D (env->CP0_Config5 >> CP0C5_MRP) & 1; + ctx->nan2008 =3D (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1; + ctx->abs2008 =3D (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1; + restore_cpu_state(env, ctx); #ifdef CONFIG_USER_ONLY - ctx.mem_idx =3D MIPS_HFLAG_UM; + ctx->mem_idx =3D MIPS_HFLAG_UM; #else - ctx.mem_idx =3D hflags_mmu_index(ctx.hflags); + ctx->mem_idx =3D hflags_mmu_index(ctx->hflags); #endif - ctx.default_tcg_memop_mask =3D (ctx.insn_flags & ISA_MIPS32R6) ? - MO_UNALN : MO_ALIGN; + ctx->default_tcg_memop_mask =3D (ctx->insn_flags & ISA_MIPS32R6) ? + MO_UNALN : MO_ALIGN; max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; if (max_insns =3D=3D 0) { max_insns =3D CF_COUNT_MASK; @@ -20251,74 +20253,74 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) max_insns =3D TCG_MAX_INSNS; } =20 - LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags); + LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx->mem_idx, ctx->hflag= s); gen_tb_start(tb); - while (ctx.base.is_jmp =3D=3D DISAS_NEXT) { - tcg_gen_insn_start(ctx.base.pc_next, ctx.hflags & MIPS_HFLAG_BMASK, - ctx.btarget); - ctx.base.num_insns++; - - if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) { - save_cpu_state(&ctx, 1); - ctx.base.is_jmp =3D DISAS_NORETURN; + while (ctx->base.is_jmp =3D=3D DISAS_NEXT) { + tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMA= SK, + ctx->btarget); + ctx->base.num_insns++; + + if (unlikely(cpu_breakpoint_test(cs, ctx->base.pc_next, BP_ANY))) { + save_cpu_state(ctx, 1); + ctx->base.is_jmp =3D DISAS_NORETURN; gen_helper_raise_exception_debug(cpu_env); /* 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. */ - ctx.base.pc_next +=3D 4; + ctx->base.pc_next +=3D 4; goto done_generating; } =20 - if (ctx.base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAS= T_IO)) { + if (ctx->base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LA= ST_IO)) { gen_io_start(); } =20 - is_slot =3D ctx.hflags & MIPS_HFLAG_BMASK; - if (!(ctx.hflags & MIPS_HFLAG_M16)) { - ctx.opcode =3D cpu_ldl_code(env, ctx.base.pc_next); + is_slot =3D ctx->hflags & MIPS_HFLAG_BMASK; + if (!(ctx->hflags & MIPS_HFLAG_M16)) { + ctx->opcode =3D cpu_ldl_code(env, ctx->base.pc_next); insn_bytes =3D 4; - decode_opc(env, &ctx); - } else if (ctx.insn_flags & ASE_MICROMIPS) { - ctx.opcode =3D cpu_lduw_code(env, ctx.base.pc_next); - insn_bytes =3D decode_micromips_opc(env, &ctx); - } else if (ctx.insn_flags & ASE_MIPS16) { - ctx.opcode =3D cpu_lduw_code(env, ctx.base.pc_next); - insn_bytes =3D decode_mips16_opc(env, &ctx); + decode_opc(env, ctx); + } else if (ctx->insn_flags & ASE_MICROMIPS) { + ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); + insn_bytes =3D decode_micromips_opc(env, ctx); + } else if (ctx->insn_flags & ASE_MIPS16) { + ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); + insn_bytes =3D decode_mips16_opc(env, ctx); } else { - generate_exception_end(&ctx, EXCP_RI); + generate_exception_end(ctx, EXCP_RI); break; } =20 - if (ctx.hflags & MIPS_HFLAG_BMASK) { - if (!(ctx.hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 | + if (ctx->hflags & MIPS_HFLAG_BMASK) { + if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 | MIPS_HFLAG_FBNSLOT))) { /* force to generate branch as there is neither delay nor forbidden slot */ is_slot =3D 1; } - if ((ctx.hflags & MIPS_HFLAG_M16) && - (ctx.hflags & MIPS_HFLAG_FBNSLOT)) { + if ((ctx->hflags & MIPS_HFLAG_M16) && + (ctx->hflags & MIPS_HFLAG_FBNSLOT)) { /* Force to generate branch as microMIPS R6 doesn't restri= ct branches in the forbidden slot. */ is_slot =3D 1; } } if (is_slot) { - gen_branch(&ctx, insn_bytes); + gen_branch(ctx, insn_bytes); } - ctx.base.pc_next +=3D insn_bytes; + ctx->base.pc_next +=3D insn_bytes; =20 /* Execute a branch and its delay slot as a single instruction. This is what GDB expects and is consistent with what the hardware does (e.g. if a delay slot instruction faults, the reported PC is the PC of the branch). */ - if (ctx.base.singlestep_enabled && - (ctx.hflags & MIPS_HFLAG_BMASK) =3D=3D 0) { + if (ctx->base.singlestep_enabled && + (ctx->hflags & MIPS_HFLAG_BMASK) =3D=3D 0) { break; } =20 - if (ctx.base.pc_next >=3D next_page_start) { + if (ctx->base.pc_next >=3D next_page_start) { break; } =20 @@ -20326,7 +20328,7 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) break; } =20 - if (ctx.base.num_insns >=3D max_insns) { + if (ctx->base.num_insns >=3D max_insns) { break; } =20 @@ -20336,17 +20338,17 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } - if (ctx.base.singlestep_enabled && ctx.base.is_jmp !=3D DISAS_NORETURN= ) { - save_cpu_state(&ctx, ctx.base.is_jmp !=3D DISAS_EXCP); + if (ctx->base.singlestep_enabled && ctx->base.is_jmp !=3D DISAS_NORETU= RN) { + save_cpu_state(ctx, ctx->base.is_jmp !=3D DISAS_EXCP); gen_helper_raise_exception_debug(cpu_env); } else { - switch (ctx.base.is_jmp) { + switch (ctx->base.is_jmp) { case DISAS_STOP: - gen_goto_tb(&ctx, 0, ctx.base.pc_next); + gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_NEXT: - save_cpu_state(&ctx, 0); - gen_goto_tb(&ctx, 0, ctx.base.pc_next); + save_cpu_state(ctx, 0); + gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_EXCP: tcg_gen_exit_tb(0); @@ -20357,19 +20359,19 @@ void gen_intermediate_code(CPUState *cs, struct T= ranslationBlock *tb) } } done_generating: - gen_tb_end(tb, ctx.base.num_insns); + gen_tb_end(tb, ctx->base.num_insns); =20 - tb->size =3D ctx.base.pc_next - ctx.base.pc_first; - tb->icount =3D ctx.base.num_insns; + tb->size =3D ctx->base.pc_next - ctx->base.pc_first; + tb->icount =3D ctx->base.num_insns; =20 #ifdef DEBUG_DISAS LOG_DISAS("\n"); if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(ctx.base.pc_first)) { + && qemu_log_in_addr_range(ctx->base.pc_first)) { qemu_log_lock(); - qemu_log("IN: %s\n", lookup_symbol(ctx.base.pc_first)); - log_target_disas(cs, ctx.base.pc_first, - ctx.base.pc_next - ctx.base.pc_first); + qemu_log("IN: %s\n", lookup_symbol(ctx->base.pc_first)); + log_target_disas(cs, ctx->base.pc_first, + ctx->base.pc_next - ctx->base.pc_first); qemu_log("\n"); qemu_log_unlock(); } --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 152303895305978.33742205568092; Fri, 6 Apr 2018 11:22:33 -0700 (PDT) Received: from localhost ([::1]:45394 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W0O-0005Pt-3e for importer@patchew.org; Fri, 06 Apr 2018 14:22:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48624) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy5-0003kb-AV for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy2-0000Sg-T9 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:09 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:38113) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy2-0000ST-Ox for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:06 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 78B4820EA9; Fri, 6 Apr 2018 14:20:06 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:06 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id DD98110260; Fri, 6 Apr 2018 14:20:05 -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=lqG6QmD/SXK+my ZS5Yp257SrIaou7D44J8T9BStBBJE=; b=TNWfQ2saeNFcJlVY6U/2bhSJxHruqC t9T5QCCbZu3f7xSQiTw4Tao1ZnB9USrpfacGrjObpkkJ0DZjc/QOt9wbO+FyxZE3 bAseoEzrzI6d1lbZHD4ItoFdggpz878RGrqmR4XAjMqEnjDUhdNswA0pVvYGhmGw dDsfs15bNMqGQ= 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=lqG6QmD/SXK+myZS5Yp257SrIaou7D44J8T9BStBBJE=; b=VBGiONgh eyr58J/qDSf4vSIRjfPVqDLkdvbxV3E9D+p7uzHmMyYrrsBcFh+sTIuSfULpRS8C gbnuKAGOcRE1QSzWXj5Drnab1OPt49Ugrng5BeOLoqVAkucjF/L6UqMl37XmNTlM 6Pg5VZ64O2zq3MYuGKiVJvZrt2MHLNGQtyp9boT92iHHHvG+Q10klqB4Wei/WL6y LngLeQQJFF82qPWDuwhqVrlVhulhKd6pYBISrB13Cji8RIo6Ce1rU04gjB2RapRo 2UYZEChtE5Ah10ntZWw5BTdFvFv8kvQpV+LOjDfQFqmKJOZ4gCf8dLOQqVJnjqIy wUXVoKgCZQhXdg== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:52 -0400 Message-Id: <1523038800-2494-10-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 09/17] target/mips: convert to TranslatorOps 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: Yongbok Kim , Richard Henderson , Aurelien Jarno 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" Notes: - DISAS_TOO_MANY replaces the former "break" in the translation loop. However, care must be taken not to overwrite a previous condition in is_jmp; that's why in translate_insn we first check is_jmp and return if it's !=3D DISAS_NEXT. - Added an assert in translate_insn, before exiting due to an exception, to make sure that is_jmp is set to DISAS_EXCP (the exception generation function always sets it.) - Added an assert for the default case in is_jmp's switch. Cc: Aurelien Jarno Cc: Yongbok Kim Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/mips/translate.c | 227 ++++++++++++++++++++++++--------------------= ---- 1 file changed, 113 insertions(+), 114 deletions(-) diff --git a/target/mips/translate.c b/target/mips/translate.c index 08bd140..f01139c 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -1432,6 +1432,7 @@ static TCGv_i64 msa_wr_d[64]; typedef struct DisasContext { DisasContextBase base; target_ulong saved_pc; + target_ulong next_page_start; uint32_t opcode; int insn_flags; int32_t CP0_Config1; @@ -20194,24 +20195,12 @@ static void decode_opc(CPUMIPSState *env, DisasCo= ntext *ctx) } } =20 -void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState = *cs) { + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); CPUMIPSState *env =3D cs->env_ptr; - DisasContext ctx1; - DisasContext *ctx =3D &ctx1; - target_ulong next_page_start; - int max_insns; - int insn_bytes; - int is_slot; - - ctx->base.tb =3D tb; - ctx->base.pc_first =3D tb->pc; - ctx->base.pc_next =3D tb->pc; - ctx->base.is_jmp =3D DISAS_NEXT; - ctx->base.singlestep_enabled =3D cs->singlestep_enabled; - ctx->base.num_insns =3D 0; =20 - next_page_start =3D (ctx->base.pc_first & TARGET_PAGE_MASK) + + ctx->next_page_start =3D (ctx->base.pc_first & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; ctx->saved_pc =3D -1; ctx->insn_flags =3D env->insn_flags; @@ -20245,99 +20234,102 @@ void gen_intermediate_code(CPUState *cs, Transla= tionBlock *tb) #endif ctx->default_tcg_memop_mask =3D (ctx->insn_flags & ISA_MIPS32R6) ? MO_UNALN : MO_ALIGN; - max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; - } =20 - LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx->mem_idx, ctx->hflag= s); - gen_tb_start(tb); - while (ctx->base.is_jmp =3D=3D DISAS_NEXT) { - tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMA= SK, - ctx->btarget); - ctx->base.num_insns++; + LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx, + ctx->hflags); +} =20 - if (unlikely(cpu_breakpoint_test(cs, ctx->base.pc_next, BP_ANY))) { - save_cpu_state(ctx, 1); - ctx->base.is_jmp =3D DISAS_NORETURN; - gen_helper_raise_exception_debug(cpu_env); - /* 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. */ - ctx->base.pc_next +=3D 4; - goto done_generating; - } +static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs) +{ +} =20 - if (ctx->base.num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LA= ST_IO)) { - gen_io_start(); - } +static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - is_slot =3D ctx->hflags & MIPS_HFLAG_BMASK; - if (!(ctx->hflags & MIPS_HFLAG_M16)) { - ctx->opcode =3D cpu_ldl_code(env, ctx->base.pc_next); - insn_bytes =3D 4; - decode_opc(env, ctx); - } else if (ctx->insn_flags & ASE_MICROMIPS) { - ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); - insn_bytes =3D decode_micromips_opc(env, ctx); - } else if (ctx->insn_flags & ASE_MIPS16) { - ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); - insn_bytes =3D decode_mips16_opc(env, ctx); - } else { - generate_exception_end(ctx, EXCP_RI); - break; - } + tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK, + ctx->btarget); +} =20 - if (ctx->hflags & MIPS_HFLAG_BMASK) { - if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 | - MIPS_HFLAG_FBNSLOT))) { - /* force to generate branch as there is neither delay nor - forbidden slot */ - is_slot =3D 1; - } - if ((ctx->hflags & MIPS_HFLAG_M16) && - (ctx->hflags & MIPS_HFLAG_FBNSLOT)) { - /* Force to generate branch as microMIPS R6 doesn't restri= ct - branches in the forbidden slot. */ - is_slot =3D 1; - } - } - if (is_slot) { - gen_branch(ctx, insn_bytes); - } - ctx->base.pc_next +=3D insn_bytes; +static bool mips_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *c= s, + const CPUBreakpoint *bp) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - /* Execute a branch and its delay slot as a single instruction. - This is what GDB expects and is consistent with what the - hardware does (e.g. if a delay slot instruction faults, the - reported PC is the PC of the branch). */ - if (ctx->base.singlestep_enabled && - (ctx->hflags & MIPS_HFLAG_BMASK) =3D=3D 0) { - break; - } + save_cpu_state(ctx, 1); + ctx->base.is_jmp =3D DISAS_NORETURN; + gen_helper_raise_exception_debug(cpu_env); + /* 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. */ + ctx->base.pc_next +=3D 4; + return true; +} =20 - if (ctx->base.pc_next >=3D next_page_start) { - break; - } +static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) +{ + CPUMIPSState *env =3D cs->env_ptr; + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + int insn_bytes; + int is_slot; =20 - if (tcg_op_buf_full()) { - break; - } + is_slot =3D ctx->hflags & MIPS_HFLAG_BMASK; + if (!(ctx->hflags & MIPS_HFLAG_M16)) { + ctx->opcode =3D cpu_ldl_code(env, ctx->base.pc_next); + insn_bytes =3D 4; + decode_opc(env, ctx); + } else if (ctx->insn_flags & ASE_MICROMIPS) { + ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); + insn_bytes =3D decode_micromips_opc(env, ctx); + } else if (ctx->insn_flags & ASE_MIPS16) { + ctx->opcode =3D cpu_lduw_code(env, ctx->base.pc_next); + insn_bytes =3D decode_mips16_opc(env, ctx); + } else { + generate_exception_end(ctx, EXCP_RI); + g_assert(ctx->base.is_jmp =3D=3D DISAS_EXCP); + return; + } =20 - if (ctx->base.num_insns >=3D max_insns) { - break; + if (ctx->hflags & MIPS_HFLAG_BMASK) { + if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 | + MIPS_HFLAG_FBNSLOT))) { + /* force to generate branch as there is neither delay nor + forbidden slot */ + is_slot =3D 1; + } + if ((ctx->hflags & MIPS_HFLAG_M16) && + (ctx->hflags & MIPS_HFLAG_FBNSLOT)) { + /* Force to generate branch as microMIPS R6 doesn't restrict + branches in the forbidden slot. */ + is_slot =3D 1; } + } + if (is_slot) { + gen_branch(ctx, insn_bytes); + } + ctx->base.pc_next +=3D insn_bytes; =20 - if (singlestep) - break; + if (ctx->base.is_jmp !=3D DISAS_NEXT) { + return; } - if (tb_cflags(tb) & CF_LAST_IO) { - gen_io_end(); + /* Execute a branch and its delay slot as a single instruction. + This is what GDB expects and is consistent with what the + hardware does (e.g. if a delay slot instruction faults, the + reported PC is the PC of the branch). */ + if (ctx->base.singlestep_enabled && + (ctx->hflags & MIPS_HFLAG_BMASK) =3D=3D 0) { + ctx->base.is_jmp =3D DISAS_TOO_MANY; + } + if (ctx->base.pc_next >=3D ctx->next_page_start) { + ctx->base.is_jmp =3D DISAS_TOO_MANY; } +} + +static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + if (ctx->base.singlestep_enabled && ctx->base.is_jmp !=3D DISAS_NORETU= RN) { save_cpu_state(ctx, ctx->base.is_jmp !=3D DISAS_EXCP); gen_helper_raise_exception_debug(cpu_env); @@ -20347,6 +20339,7 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_NEXT: + case DISAS_TOO_MANY: save_cpu_state(ctx, 0); gen_goto_tb(ctx, 0, ctx->base.pc_next); break; @@ -20354,28 +20347,34 @@ void gen_intermediate_code(CPUState *cs, Translat= ionBlock *tb) tcg_gen_exit_tb(0); break; case DISAS_NORETURN: - default: break; + default: + g_assert_not_reached(); } } -done_generating: - gen_tb_end(tb, ctx->base.num_insns); - - tb->size =3D ctx->base.pc_next - ctx->base.pc_first; - tb->icount =3D ctx->base.num_insns; - -#ifdef DEBUG_DISAS - LOG_DISAS("\n"); - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(ctx->base.pc_first)) { - qemu_log_lock(); - qemu_log("IN: %s\n", lookup_symbol(ctx->base.pc_first)); - log_target_disas(cs, ctx->base.pc_first, - ctx->base.pc_next - ctx->base.pc_first); - qemu_log("\n"); - qemu_log_unlock(); - } -#endif +} + +static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs) +{ + qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); + log_target_disas(cs, dcbase->pc_first, dcbase->tb->size); +} + +static const TranslatorOps mips_tr_ops =3D { + .init_disas_context =3D mips_tr_init_disas_context, + .tb_start =3D mips_tr_tb_start, + .insn_start =3D mips_tr_insn_start, + .breakpoint_check =3D mips_tr_breakpoint_check, + .translate_insn =3D mips_tr_translate_insn, + .tb_stop =3D mips_tr_tb_stop, + .disas_log =3D mips_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +{ + DisasContext ctx; + + translator_loop(&mips_tr_ops, &ctx.base, cs, tb); } =20 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fp= u_fprintf, --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039567127835.5491535415254; Fri, 6 Apr 2018 11:32:47 -0700 (PDT) Received: from localhost ([::1]:45455 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4WAH-0005uL-U1 for importer@patchew.org; Fri, 06 Apr 2018 14:32:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48941) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4VyJ-0003v6-HE for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy3-0000TX-JF for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:23 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:44391) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy3-0000Su-9f; Fri, 06 Apr 2018 14:20:07 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id F073D20F2B; Fri, 6 Apr 2018 14:20:06 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:06 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 62BC2E43C8; Fri, 6 Apr 2018 14:20:06 -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=oxRoumUXkPZH8i 1Ub0vvKxeNEszZczIICzhX1/eV7q8=; b=zLqll/e0DBqyoiQnbpdzZ1bzuR8jkl m5eVwES5yr3dU25ibEjlz/Vz3I/TuRjwJ/hRUzdZOp1b7D84UQUFo92BzvTKvEN7 MuRiTmrxc2hpHDcOH0MDEqhvzWnsAgPhSqAUj+v3JqEYysu9JPyeA5xu6uglVaP6 1LFTdxDivVdtQ= 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=oxRoumUXkPZH8i1Ub0vvKxeNEszZczIICzhX1/eV7q8=; b=KWJoKW2e kdZdgNJRX6S3QRR7MUt8tp/d/aopSI2uw8j2n4E0247sd/leSdP9HSVgDjKtteQw hLvktUhyf0ejdEN6ad3hXs8SN5d6vDXI3ODtHHZyY6x1Liljt4+AvgZZIjDas2Z+ PDORPVZk7DUibln6I0O54MFBb21jYZ3AMQrweaqgyoFcpElRv+NSQfH2Y1gaOMPr KjN0QudwYj7ROfBwtOqEqg6m0O7KCskYAxv8+N1gqMi5bl7DO9JJ403kBHlxNPpJ UI2SUCkWGO8U0mkaxso1z3KR7etytG61dTbKWRCNow28e5m3+Xvnkw0l1gupAoxI HEAqeULyYEh0Bw== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:53 -0400 Message-Id: <1523038800-2494-11-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 10/17] target/s390x: 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: qemu-s390x@nongnu.org, Cornelia Huck , Richard Henderson , Alexander Graf , David Hildenbrand 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" The only non-trivial modification is the use of DISAS_TOO_MANY in the same way is used by the generic translation loop. Acked-by: Cornelia Huck Reviewed-by: David Hildenbrand Reviewed-by: Richard Henderson Cc: David Hildenbrand Cc: Cornelia Huck Cc: Alexander Graf Cc: qemu-s390x@nongnu.org Signed-off-by: Emilio G. Cota --- target/s390x/translate.c | 1267 +++++++++++++++++++++++-------------------= ---- 1 file changed, 632 insertions(+), 635 deletions(-) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 7d39ab3..3156286 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -42,6 +42,7 @@ #include "exec/helper-gen.h" =20 #include "trace-tcg.h" +#include "exec/translator.h" #include "exec/log.h" =20 =20 @@ -73,9 +74,6 @@ typedef struct { } u; } DisasCompare; =20 -/* is_jmp field values */ -#define DISAS_EXCP DISAS_TARGET_0 - #ifdef DEBUG_INLINE_BRANCHES static uint64_t inline_branch_hit[CC_OP_MAX]; static uint64_t inline_branch_miss[CC_OP_MAX]; @@ -1091,26 +1089,24 @@ typedef struct { #define SPEC_r2_f128 16 =20 /* Return values from translate_one, indicating the state of the TB. */ -typedef enum { - /* Continue the TB. */ - NO_EXIT, - /* We have emitted one or more goto_tb. No fixup required. */ - EXIT_GOTO_TB, - /* We are not using a goto_tb (for whatever reason), but have updated - the PC (for whatever reason), so there's no need to do it again on - exiting the TB. */ - EXIT_PC_UPDATED, - /* We have updated the PC and CC values. */ - EXIT_PC_CC_UPDATED, - /* We are exiting the TB, but have neither emitted a goto_tb, nor - updated the PC for the next instruction to be executed. */ - EXIT_PC_STALE, - /* We are exiting the TB to the main loop. */ - EXIT_PC_STALE_NOCHAIN, - /* We are ending the TB with a noreturn function call, e.g. longjmp. - No following code will be executed. */ - EXIT_NORETURN, -} ExitStatus; + +/* We are not using a goto_tb (for whatever reason), but have updated + the PC (for whatever reason), so there's no need to do it again on + exiting the TB. */ +#define DISAS_PC_UPDATED DISAS_TARGET_0 + +/* We have emitted one or more goto_tb. No fixup required. */ +#define DISAS_GOTO_TB DISAS_TARGET_1 + +/* We have updated the PC and CC values. */ +#define DISAS_PC_CC_UPDATED DISAS_TARGET_2 + +/* We are exiting the TB, but have neither emitted a goto_tb, nor + updated the PC for the next instruction to be executed. */ +#define DISAS_PC_STALE DISAS_TARGET_3 + +/* We are exiting the TB to the main loop. */ +#define DISAS_PC_STALE_NOCHAIN DISAS_TARGET_4 =20 struct DisasInsn { unsigned opc:16; @@ -1125,7 +1121,7 @@ struct DisasInsn { void (*help_prep)(DisasContext *, DisasFields *, DisasOps *); void (*help_wout)(DisasContext *, DisasFields *, DisasOps *); void (*help_cout)(DisasContext *, DisasOps *); - ExitStatus (*help_op)(DisasContext *, DisasOps *); + DisasJumpType (*help_op)(DisasContext *, DisasOps *); =20 uint64_t data; }; @@ -1147,11 +1143,11 @@ static void help_l2_shift(DisasContext *s, DisasFie= lds *f, } } =20 -static ExitStatus help_goto_direct(DisasContext *s, uint64_t dest) +static DisasJumpType help_goto_direct(DisasContext *s, uint64_t dest) { if (dest =3D=3D s->next_pc) { per_branch(s, true); - return NO_EXIT; + return DISAS_NEXT; } if (use_goto_tb(s, dest)) { update_cc_op(s); @@ -1159,31 +1155,31 @@ static ExitStatus help_goto_direct(DisasContext *s,= uint64_t dest) tcg_gen_goto_tb(0); tcg_gen_movi_i64(psw_addr, dest); tcg_gen_exit_tb((uintptr_t)s->tb); - return EXIT_GOTO_TB; + return DISAS_GOTO_TB; } else { tcg_gen_movi_i64(psw_addr, dest); per_branch(s, false); - return EXIT_PC_UPDATED; + return DISAS_PC_UPDATED; } } =20 -static ExitStatus help_branch(DisasContext *s, DisasCompare *c, - bool is_imm, int imm, TCGv_i64 cdest) +static DisasJumpType help_branch(DisasContext *s, DisasCompare *c, + bool is_imm, int imm, TCGv_i64 cdest) { - ExitStatus ret; + DisasJumpType ret; uint64_t dest =3D s->pc + 2 * imm; TCGLabel *lab; =20 /* Take care of the special cases first. */ if (c->cond =3D=3D TCG_COND_NEVER) { - ret =3D NO_EXIT; + ret =3D DISAS_NEXT; goto egress; } if (is_imm) { if (dest =3D=3D s->next_pc) { /* Branch to next. */ per_branch(s, true); - ret =3D NO_EXIT; + ret =3D DISAS_NEXT; goto egress; } if (c->cond =3D=3D TCG_COND_ALWAYS) { @@ -1193,13 +1189,13 @@ static ExitStatus help_branch(DisasContext *s, Disa= sCompare *c, } else { if (!cdest) { /* E.g. bcr %r0 -> no branch. */ - ret =3D NO_EXIT; + ret =3D DISAS_NEXT; goto egress; } if (c->cond =3D=3D TCG_COND_ALWAYS) { tcg_gen_mov_i64(psw_addr, cdest); per_branch(s, false); - ret =3D EXIT_PC_UPDATED; + ret =3D DISAS_PC_UPDATED; goto egress; } } @@ -1228,7 +1224,7 @@ static ExitStatus help_branch(DisasContext *s, DisasC= ompare *c, tcg_gen_movi_i64(psw_addr, dest); tcg_gen_exit_tb((uintptr_t)s->tb + 1); =20 - ret =3D EXIT_GOTO_TB; + ret =3D DISAS_GOTO_TB; } else { /* Fallthru can use goto_tb, but taken branch cannot. */ /* Store taken branch destination before the brcond. This @@ -1256,7 +1252,7 @@ static ExitStatus help_branch(DisasContext *s, DisasC= ompare *c, tcg_gen_movi_i64(psw_addr, dest); } per_breaking_event(s); - ret =3D EXIT_PC_UPDATED; + ret =3D DISAS_PC_UPDATED; } } else { /* Fallthru cannot use goto_tb. This by itself is vanishingly rar= e. @@ -1290,7 +1286,7 @@ static ExitStatus help_branch(DisasContext *s, DisasC= ompare *c, } tcg_temp_free_i64(next); =20 - ret =3D EXIT_PC_UPDATED; + ret =3D DISAS_PC_UPDATED; } =20 egress: @@ -1302,7 +1298,7 @@ static ExitStatus help_branch(DisasContext *s, DisasC= ompare *c, /* The operations. These perform the bulk of the work for any insn, usually after the operands have been loaded and output initialized. */ =20 -static ExitStatus op_abs(DisasContext *s, DisasOps *o) +static DisasJumpType op_abs(DisasContext *s, DisasOps *o) { TCGv_i64 z, n; z =3D tcg_const_i64(0); @@ -1311,35 +1307,35 @@ static ExitStatus op_abs(DisasContext *s, DisasOps = *o) tcg_gen_movcond_i64(TCG_COND_LT, o->out, o->in2, z, n, o->in2); tcg_temp_free_i64(n); tcg_temp_free_i64(z); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_absf32(DisasContext *s, DisasOps *o) +static DisasJumpType op_absf32(DisasContext *s, DisasOps *o) { tcg_gen_andi_i64(o->out, o->in2, 0x7fffffffull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_absf64(DisasContext *s, DisasOps *o) +static DisasJumpType op_absf64(DisasContext *s, DisasOps *o) { tcg_gen_andi_i64(o->out, o->in2, 0x7fffffffffffffffull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_absf128(DisasContext *s, DisasOps *o) +static DisasJumpType op_absf128(DisasContext *s, DisasOps *o) { tcg_gen_andi_i64(o->out, o->in1, 0x7fffffffffffffffull); tcg_gen_mov_i64(o->out2, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_add(DisasContext *s, DisasOps *o) +static DisasJumpType op_add(DisasContext *s, DisasOps *o) { tcg_gen_add_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_addc(DisasContext *s, DisasOps *o) +static DisasJumpType op_addc(DisasContext *s, DisasOps *o) { DisasCompare cmp; TCGv_i64 carry; @@ -1363,10 +1359,10 @@ static ExitStatus op_addc(DisasContext *s, DisasOps= *o) =20 tcg_gen_add_i64(o->out, o->out, carry); tcg_temp_free_i64(carry); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_asi(DisasContext *s, DisasOps *o) +static DisasJumpType op_asi(DisasContext *s, DisasOps *o) { o->in1 =3D tcg_temp_new_i64(); =20 @@ -1384,35 +1380,35 @@ static ExitStatus op_asi(DisasContext *s, DisasOps = *o) if (!s390_has_feat(S390_FEAT_STFLE_45)) { tcg_gen_qemu_st_tl(o->out, o->addr1, get_mem_index(s), s->insn->da= ta); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_aeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_aeb(DisasContext *s, DisasOps *o) { gen_helper_aeb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_adb(DisasContext *s, DisasOps *o) +static DisasJumpType op_adb(DisasContext *s, DisasOps *o) { gen_helper_adb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_axb(DisasContext *s, DisasOps *o) +static DisasJumpType op_axb(DisasContext *s, DisasOps *o) { gen_helper_axb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_and(DisasContext *s, DisasOps *o) +static DisasJumpType op_and(DisasContext *s, DisasOps *o) { tcg_gen_and_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_andi(DisasContext *s, DisasOps *o) +static DisasJumpType op_andi(DisasContext *s, DisasOps *o) { int shift =3D s->insn->data & 0xff; int size =3D s->insn->data >> 8; @@ -1426,10 +1422,10 @@ static ExitStatus op_andi(DisasContext *s, DisasOps= *o) /* Produce the CC from only the bits manipulated. */ tcg_gen_andi_i64(cc_dst, o->out, mask); set_cc_nz_u64(s, cc_dst); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ni(DisasContext *s, DisasOps *o) +static DisasJumpType op_ni(DisasContext *s, DisasOps *o) { o->in1 =3D tcg_temp_new_i64(); =20 @@ -1447,28 +1443,28 @@ static ExitStatus op_ni(DisasContext *s, DisasOps *= o) if (!s390_has_feat(S390_FEAT_INTERLOCKED_ACCESS_2)) { tcg_gen_qemu_st_tl(o->out, o->addr1, get_mem_index(s), s->insn->da= ta); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_bas(DisasContext *s, DisasOps *o) +static DisasJumpType op_bas(DisasContext *s, DisasOps *o) { tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->next_pc)); if (o->in2) { tcg_gen_mov_i64(psw_addr, o->in2); per_branch(s, false); - return EXIT_PC_UPDATED; + return DISAS_PC_UPDATED; } else { - return NO_EXIT; + return DISAS_NEXT; } } =20 -static ExitStatus op_basi(DisasContext *s, DisasOps *o) +static DisasJumpType op_basi(DisasContext *s, DisasOps *o) { tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->next_pc)); return help_goto_direct(s, s->pc + 2 * get_field(s->fields, i2)); } =20 -static ExitStatus op_bc(DisasContext *s, DisasOps *o) +static DisasJumpType op_bc(DisasContext *s, DisasOps *o) { int m1 =3D get_field(s->fields, m1); bool is_imm =3D have_field(s->fields, i2); @@ -1487,14 +1483,14 @@ static ExitStatus op_bc(DisasContext *s, DisasOps *= o) /* FIXME: perform checkpoint-synchronisation */ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC); } - return NO_EXIT; + return DISAS_NEXT; } =20 disas_jcc(s, &c, m1); return help_branch(s, &c, is_imm, imm, o->in2); } =20 -static ExitStatus op_bct32(DisasContext *s, DisasOps *o) +static DisasJumpType op_bct32(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); bool is_imm =3D have_field(s->fields, i2); @@ -1518,7 +1514,7 @@ static ExitStatus op_bct32(DisasContext *s, DisasOps = *o) return help_branch(s, &c, is_imm, imm, o->in2); } =20 -static ExitStatus op_bcth(DisasContext *s, DisasOps *o) +static DisasJumpType op_bcth(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int imm =3D get_field(s->fields, i2); @@ -1542,7 +1538,7 @@ static ExitStatus op_bcth(DisasContext *s, DisasOps *= o) return help_branch(s, &c, 1, imm, o->in2); } =20 -static ExitStatus op_bct64(DisasContext *s, DisasOps *o) +static DisasJumpType op_bct64(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); bool is_imm =3D have_field(s->fields, i2); @@ -1561,7 +1557,7 @@ static ExitStatus op_bct64(DisasContext *s, DisasOps = *o) return help_branch(s, &c, is_imm, imm, o->in2); } =20 -static ExitStatus op_bx32(DisasContext *s, DisasOps *o) +static DisasJumpType op_bx32(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -1587,7 +1583,7 @@ static ExitStatus op_bx32(DisasContext *s, DisasOps *= o) return help_branch(s, &c, is_imm, imm, o->in2); } =20 -static ExitStatus op_bx64(DisasContext *s, DisasOps *o) +static DisasJumpType op_bx64(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -1613,7 +1609,7 @@ static ExitStatus op_bx64(DisasContext *s, DisasOps *= o) return help_branch(s, &c, is_imm, imm, o->in2); } =20 -static ExitStatus op_cj(DisasContext *s, DisasOps *o) +static DisasJumpType op_cj(DisasContext *s, DisasOps *o) { int imm, m3 =3D get_field(s->fields, m3); bool is_imm; @@ -1639,186 +1635,186 @@ static ExitStatus op_cj(DisasContext *s, DisasOps= *o) return help_branch(s, &c, is_imm, imm, o->out); } =20 -static ExitStatus op_ceb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ceb(DisasContext *s, DisasOps *o) { gen_helper_ceb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cdb(DisasContext *s, DisasOps *o) { gen_helper_cdb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cxb(DisasContext *s, DisasOps *o) { gen_helper_cxb(cc_op, cpu_env, o->out, o->out2, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cfeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cfeb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cfeb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f32(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cfdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cfdb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cfdb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f64(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cfxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cfxb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cfxb(o->out, cpu_env, o->in1, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f128(s, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cgeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cgeb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cgeb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f32(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cgdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cgdb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cgdb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f64(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cgxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cgxb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cgxb(o->out, cpu_env, o->in1, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f128(s, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clfeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clfeb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clfeb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f32(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clfdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clfdb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clfdb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f64(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clfxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clfxb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clfxb(o->out, cpu_env, o->in1, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f128(s, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clgeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clgeb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clgeb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f32(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clgdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clgdb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clgdb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f64(s, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clgxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_clgxb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_clgxb(o->out, cpu_env, o->in1, o->in2, m3); tcg_temp_free_i32(m3); gen_set_cc_nz_f128(s, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cegb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cegb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cegb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cdgb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cdgb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cdgb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cxgb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cxgb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cxgb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_celgb(DisasContext *s, DisasOps *o) +static DisasJumpType op_celgb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_celgb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cdlgb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cdlgb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cdlgb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cxlgb(DisasContext *s, DisasOps *o) +static DisasJumpType op_cxlgb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_cxlgb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cksm(DisasContext *s, DisasOps *o) +static DisasJumpType op_cksm(DisasContext *s, DisasOps *o) { int r2 =3D get_field(s->fields, r2); TCGv_i64 len =3D tcg_temp_new_i64(); @@ -1831,10 +1827,10 @@ static ExitStatus op_cksm(DisasContext *s, DisasOps= *o) tcg_gen_sub_i64(regs[r2 + 1], regs[r2 + 1], len); tcg_temp_free_i64(len); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clc(DisasContext *s, DisasOps *o) +static DisasJumpType op_clc(DisasContext *s, DisasOps *o) { int l =3D get_field(s->fields, l1); TCGv_i32 vl; @@ -1861,13 +1857,13 @@ static ExitStatus op_clc(DisasContext *s, DisasOps = *o) gen_helper_clc(cc_op, cpu_env, vl, o->addr1, o->in2); tcg_temp_free_i32(vl); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } gen_op_update2_cc_i64(s, CC_OP_LTUGTU_64, cc_src, cc_dst); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clcl(DisasContext *s, DisasOps *o) +static DisasJumpType op_clcl(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r2 =3D get_field(s->fields, r2); @@ -1876,7 +1872,7 @@ static ExitStatus op_clcl(DisasContext *s, DisasOps *= o) /* r1 and r2 must be even. */ if (r1 & 1 || r2 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -1885,10 +1881,10 @@ static ExitStatus op_clcl(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clcle(DisasContext *s, DisasOps *o) +static DisasJumpType op_clcle(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -1897,7 +1893,7 @@ static ExitStatus op_clcle(DisasContext *s, DisasOps = *o) /* r1 and r3 must be even. */ if (r1 & 1 || r3 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -1906,10 +1902,10 @@ static ExitStatus op_clcle(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t3); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clclu(DisasContext *s, DisasOps *o) +static DisasJumpType op_clclu(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -1918,7 +1914,7 @@ static ExitStatus op_clclu(DisasContext *s, DisasOps = *o) /* r1 and r3 must be even. */ if (r1 & 1 || r3 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -1927,10 +1923,10 @@ static ExitStatus op_clclu(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t3); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clm(DisasContext *s, DisasOps *o) +static DisasJumpType op_clm(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); TCGv_i32 t1 =3D tcg_temp_new_i32(); @@ -1939,28 +1935,28 @@ static ExitStatus op_clm(DisasContext *s, DisasOps = *o) set_cc_static(s); tcg_temp_free_i32(t1); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_clst(DisasContext *s, DisasOps *o) +static DisasJumpType op_clst(DisasContext *s, DisasOps *o) { gen_helper_clst(o->in1, cpu_env, regs[0], o->in1, o->in2); set_cc_static(s); return_low128(o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cps(DisasContext *s, DisasOps *o) +static DisasJumpType op_cps(DisasContext *s, DisasOps *o) { TCGv_i64 t =3D tcg_temp_new_i64(); tcg_gen_andi_i64(t, o->in1, 0x8000000000000000ull); tcg_gen_andi_i64(o->out, o->in2, 0x7fffffffffffffffull); tcg_gen_or_i64(o->out, o->out, t); tcg_temp_free_i64(t); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cs(DisasContext *s, DisasOps *o) +static DisasJumpType op_cs(DisasContext *s, DisasOps *o) { int d2 =3D get_field(s->fields, d2); int b2 =3D get_field(s->fields, b2); @@ -1982,10 +1978,10 @@ static ExitStatus op_cs(DisasContext *s, DisasOps *= o) tcg_temp_free_i64(cc); set_cc_static(s); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cdsg(DisasContext *s, DisasOps *o) +static DisasJumpType op_cdsg(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -2008,10 +2004,10 @@ static ExitStatus op_cdsg(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(t_r3); =20 set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_csst(DisasContext *s, DisasOps *o) +static DisasJumpType op_csst(DisasContext *s, DisasOps *o) { int r3 =3D get_field(s->fields, r3); TCGv_i32 t_r3 =3D tcg_const_i32(r3); @@ -2024,11 +2020,11 @@ static ExitStatus op_csst(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(t_r3); =20 set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_csp(DisasContext *s, DisasOps *o) +static DisasJumpType op_csp(DisasContext *s, DisasOps *o) { TCGMemOp mop =3D s->insn->data; TCGv_i64 addr, old, cc; @@ -2069,11 +2065,11 @@ static ExitStatus op_csp(DisasContext *s, DisasOps = *o) gen_helper_purge(cpu_env); gen_set_label(lab); =20 - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_cvd(DisasContext *s, DisasOps *o) +static DisasJumpType op_cvd(DisasContext *s, DisasOps *o) { TCGv_i64 t1 =3D tcg_temp_new_i64(); TCGv_i32 t2 =3D tcg_temp_new_i32(); @@ -2082,10 +2078,10 @@ static ExitStatus op_cvd(DisasContext *s, DisasOps = *o) tcg_temp_free_i32(t2); tcg_gen_qemu_st64(t1, o->in2, get_mem_index(s)); tcg_temp_free_i64(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ct(DisasContext *s, DisasOps *o) +static DisasJumpType op_ct(DisasContext *s, DisasOps *o) { int m3 =3D get_field(s->fields, m3); TCGLabel *lab =3D gen_new_label(); @@ -2101,10 +2097,10 @@ static ExitStatus op_ct(DisasContext *s, DisasOps *= o) gen_trap(s); =20 gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_cuXX(DisasContext *s, DisasOps *o) +static DisasJumpType op_cuXX(DisasContext *s, DisasOps *o) { int m3 =3D get_field(s->fields, m3); int r1 =3D get_field(s->fields, r1); @@ -2114,7 +2110,7 @@ static ExitStatus op_cuXX(DisasContext *s, DisasOps *= o) /* R1 and R2 must both be even. */ if ((r1 | r2) & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } if (!s390_has_feat(S390_FEAT_ETF3_ENH)) { m3 =3D 0; @@ -2151,11 +2147,11 @@ static ExitStatus op_cuXX(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(tr2); tcg_temp_free_i32(chk); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_diag(DisasContext *s, DisasOps *o) +static DisasJumpType op_diag(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -2167,78 +2163,78 @@ static ExitStatus op_diag(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(func_code); tcg_temp_free_i32(r3); tcg_temp_free_i32(r1); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_divs32(DisasContext *s, DisasOps *o) +static DisasJumpType op_divs32(DisasContext *s, DisasOps *o) { gen_helper_divs32(o->out2, cpu_env, o->in1, o->in2); return_low128(o->out); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_divu32(DisasContext *s, DisasOps *o) +static DisasJumpType op_divu32(DisasContext *s, DisasOps *o) { gen_helper_divu32(o->out2, cpu_env, o->in1, o->in2); return_low128(o->out); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_divs64(DisasContext *s, DisasOps *o) +static DisasJumpType op_divs64(DisasContext *s, DisasOps *o) { gen_helper_divs64(o->out2, cpu_env, o->in1, o->in2); return_low128(o->out); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_divu64(DisasContext *s, DisasOps *o) +static DisasJumpType op_divu64(DisasContext *s, DisasOps *o) { gen_helper_divu64(o->out2, cpu_env, o->out, o->out2, o->in2); return_low128(o->out); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_deb(DisasContext *s, DisasOps *o) +static DisasJumpType op_deb(DisasContext *s, DisasOps *o) { gen_helper_deb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ddb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ddb(DisasContext *s, DisasOps *o) { gen_helper_ddb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_dxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_dxb(DisasContext *s, DisasOps *o) { gen_helper_dxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ear(DisasContext *s, DisasOps *o) +static DisasJumpType op_ear(DisasContext *s, DisasOps *o) { int r2 =3D get_field(s->fields, r2); tcg_gen_ld32u_i64(o->out, cpu_env, offsetof(CPUS390XState, aregs[r2])); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ecag(DisasContext *s, DisasOps *o) +static DisasJumpType op_ecag(DisasContext *s, DisasOps *o) { /* No cache information provided. */ tcg_gen_movi_i64(o->out, -1); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_efpc(DisasContext *s, DisasOps *o) +static DisasJumpType op_efpc(DisasContext *s, DisasOps *o) { tcg_gen_ld32u_i64(o->out, cpu_env, offsetof(CPUS390XState, fpc)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_epsw(DisasContext *s, DisasOps *o) +static DisasJumpType op_epsw(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r2 =3D get_field(s->fields, r2); @@ -2253,10 +2249,10 @@ static ExitStatus op_epsw(DisasContext *s, DisasOps= *o) } =20 tcg_temp_free_i64(t); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ex(DisasContext *s, DisasOps *o) +static DisasJumpType op_ex(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); TCGv_i32 ilen; @@ -2265,7 +2261,7 @@ static ExitStatus op_ex(DisasContext *s, DisasOps *o) /* Nested EXECUTE is not allowed. */ if (unlikely(s->ex_value)) { gen_program_exception(s, PGM_EXECUTE); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 update_psw_addr(s); @@ -2285,35 +2281,35 @@ static ExitStatus op_ex(DisasContext *s, DisasOps *= o) tcg_temp_free_i64(v1); } =20 - return EXIT_PC_CC_UPDATED; + return DISAS_PC_CC_UPDATED; } =20 -static ExitStatus op_fieb(DisasContext *s, DisasOps *o) +static DisasJumpType op_fieb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_fieb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_fidb(DisasContext *s, DisasOps *o) +static DisasJumpType op_fidb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_fidb(o->out, cpu_env, o->in2, m3); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_fixb(DisasContext *s, DisasOps *o) +static DisasJumpType op_fixb(DisasContext *s, DisasOps *o) { TCGv_i32 m3 =3D tcg_const_i32(get_field(s->fields, m3)); gen_helper_fixb(o->out, cpu_env, o->in1, o->in2, m3); return_low128(o->out2); tcg_temp_free_i32(m3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_flogr(DisasContext *s, DisasOps *o) +static DisasJumpType op_flogr(DisasContext *s, DisasOps *o) { /* We'll use the original input for cc computation, since we get to compare that against 0, which ought to be better than comparing @@ -2330,10 +2326,10 @@ static ExitStatus op_flogr(DisasContext *s, DisasOp= s *o) tcg_gen_movi_i64(o->out2, 0x8000000000000000ull); tcg_gen_shr_i64(o->out2, o->out2, o->out); tcg_gen_andc_i64(o->out2, cc_dst, o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_icm(DisasContext *s, DisasOps *o) +static DisasJumpType op_icm(DisasContext *s, DisasOps *o) { int m3 =3D get_field(s->fields, m3); int pos, len, base =3D s->insn->data; @@ -2390,18 +2386,18 @@ static ExitStatus op_icm(DisasContext *s, DisasOps = *o) tcg_gen_movi_i64(tmp, ccm); gen_op_update2_cc_i64(s, CC_OP_ICM, tmp, o->out); tcg_temp_free_i64(tmp); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_insi(DisasContext *s, DisasOps *o) +static DisasJumpType op_insi(DisasContext *s, DisasOps *o) { int shift =3D s->insn->data & 0xff; int size =3D s->insn->data >> 8; tcg_gen_deposit_i64(o->out, o->in1, o->in2, shift, size); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ipm(DisasContext *s, DisasOps *o) +static DisasJumpType op_ipm(DisasContext *s, DisasOps *o) { TCGv_i64 t1; =20 @@ -2417,11 +2413,11 @@ static ExitStatus op_ipm(DisasContext *s, DisasOps = *o) tcg_gen_shli_i64(t1, t1, 28); tcg_gen_or_i64(o->out, o->out, t1); tcg_temp_free_i64(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_idte(DisasContext *s, DisasOps *o) +static DisasJumpType op_idte(DisasContext *s, DisasOps *o) { TCGv_i32 m4; =20 @@ -2433,10 +2429,10 @@ static ExitStatus op_idte(DisasContext *s, DisasOps= *o) } gen_helper_idte(cpu_env, o->in1, o->in2, m4); tcg_temp_free_i32(m4); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ipte(DisasContext *s, DisasOps *o) +static DisasJumpType op_ipte(DisasContext *s, DisasOps *o) { TCGv_i32 m4; =20 @@ -2448,18 +2444,18 @@ static ExitStatus op_ipte(DisasContext *s, DisasOps= *o) } gen_helper_ipte(cpu_env, o->in1, o->in2, m4); tcg_temp_free_i32(m4); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_iske(DisasContext *s, DisasOps *o) +static DisasJumpType op_iske(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_iske(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_msa(DisasContext *s, DisasOps *o) +static DisasJumpType op_msa(DisasContext *s, DisasOps *o) { int r1 =3D have_field(s->fields, r1) ? get_field(s->fields, r1) : 0; int r2 =3D have_field(s->fields, r2) ? get_field(s->fields, r2) : 0; @@ -2470,7 +2466,7 @@ static ExitStatus op_msa(DisasContext *s, DisasOps *o) case S390_FEAT_TYPE_KMCTR: if (r3 & 1 || !r3) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } /* FALL THROUGH */ case S390_FEAT_TYPE_PPNO: @@ -2480,7 +2476,7 @@ static ExitStatus op_msa(DisasContext *s, DisasOps *o) case S390_FEAT_TYPE_KM: if (r1 & 1 || !r1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } /* FALL THROUGH */ case S390_FEAT_TYPE_KMAC: @@ -2488,7 +2484,7 @@ static ExitStatus op_msa(DisasContext *s, DisasOps *o) case S390_FEAT_TYPE_KLMD: if (r2 & 1 || !r2) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } /* FALL THROUGH */ case S390_FEAT_TYPE_PCKMO: @@ -2508,31 +2504,31 @@ static ExitStatus op_msa(DisasContext *s, DisasOps = *o) tcg_temp_free_i32(t_r2); tcg_temp_free_i32(t_r3); tcg_temp_free_i32(type); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_keb(DisasContext *s, DisasOps *o) +static DisasJumpType op_keb(DisasContext *s, DisasOps *o) { gen_helper_keb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_kdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_kdb(DisasContext *s, DisasOps *o) { gen_helper_kdb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_kxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_kxb(DisasContext *s, DisasOps *o) { gen_helper_kxb(cc_op, cpu_env, o->out, o->out2, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_laa(DisasContext *s, DisasOps *o) +static DisasJumpType op_laa(DisasContext *s, DisasOps *o) { /* The real output is indeed the original value in memory; recompute the addition for the computation of CC. */ @@ -2540,10 +2536,10 @@ static ExitStatus op_laa(DisasContext *s, DisasOps = *o) s->insn->data | MO_ALIGN); /* However, we need to recompute the addition for setting CC. */ tcg_gen_add_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lan(DisasContext *s, DisasOps *o) +static DisasJumpType op_lan(DisasContext *s, DisasOps *o) { /* The real output is indeed the original value in memory; recompute the addition for the computation of CC. */ @@ -2551,10 +2547,10 @@ static ExitStatus op_lan(DisasContext *s, DisasOps = *o) s->insn->data | MO_ALIGN); /* However, we need to recompute the operation for setting CC. */ tcg_gen_and_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lao(DisasContext *s, DisasOps *o) +static DisasJumpType op_lao(DisasContext *s, DisasOps *o) { /* The real output is indeed the original value in memory; recompute the addition for the computation of CC. */ @@ -2562,10 +2558,10 @@ static ExitStatus op_lao(DisasContext *s, DisasOps = *o) s->insn->data | MO_ALIGN); /* However, we need to recompute the operation for setting CC. */ tcg_gen_or_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lax(DisasContext *s, DisasOps *o) +static DisasJumpType op_lax(DisasContext *s, DisasOps *o) { /* The real output is indeed the original value in memory; recompute the addition for the computation of CC. */ @@ -2573,96 +2569,96 @@ static ExitStatus op_lax(DisasContext *s, DisasOps = *o) s->insn->data | MO_ALIGN); /* However, we need to recompute the operation for setting CC. */ tcg_gen_xor_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ldeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ldeb(DisasContext *s, DisasOps *o) { gen_helper_ldeb(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ledb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ledb(DisasContext *s, DisasOps *o) { gen_helper_ledb(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ldxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ldxb(DisasContext *s, DisasOps *o) { gen_helper_ldxb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lexb(DisasContext *s, DisasOps *o) +static DisasJumpType op_lexb(DisasContext *s, DisasOps *o) { gen_helper_lexb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lxdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_lxdb(DisasContext *s, DisasOps *o) { gen_helper_lxdb(o->out, cpu_env, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lxeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_lxeb(DisasContext *s, DisasOps *o) { gen_helper_lxeb(o->out, cpu_env, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_llgt(DisasContext *s, DisasOps *o) +static DisasJumpType op_llgt(DisasContext *s, DisasOps *o) { tcg_gen_andi_i64(o->out, o->in2, 0x7fffffff); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld8s(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld8s(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld8s(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld8u(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld8u(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld8u(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld16s(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld16s(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld16s(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld16u(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld16u(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld16u(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld32s(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld32s(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld32s(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld32u(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld32u(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld32u(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ld64(DisasContext *s, DisasOps *o) +static DisasJumpType op_ld64(DisasContext *s, DisasOps *o) { tcg_gen_qemu_ld64(o->out, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lat(DisasContext *s, DisasOps *o) +static DisasJumpType op_lat(DisasContext *s, DisasOps *o) { TCGLabel *lab =3D gen_new_label(); store_reg32_i64(get_field(s->fields, r1), o->in2); @@ -2670,10 +2666,10 @@ static ExitStatus op_lat(DisasContext *s, DisasOps = *o) tcg_gen_brcondi_i64(TCG_COND_NE, o->in2, 0, lab); gen_trap(s); gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lgat(DisasContext *s, DisasOps *o) +static DisasJumpType op_lgat(DisasContext *s, DisasOps *o) { TCGLabel *lab =3D gen_new_label(); tcg_gen_qemu_ld64(o->out, o->in2, get_mem_index(s)); @@ -2681,10 +2677,10 @@ static ExitStatus op_lgat(DisasContext *s, DisasOps= *o) tcg_gen_brcondi_i64(TCG_COND_NE, o->out, 0, lab); gen_trap(s); gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lfhat(DisasContext *s, DisasOps *o) +static DisasJumpType op_lfhat(DisasContext *s, DisasOps *o) { TCGLabel *lab =3D gen_new_label(); store_reg32h_i64(get_field(s->fields, r1), o->in2); @@ -2692,10 +2688,10 @@ static ExitStatus op_lfhat(DisasContext *s, DisasOp= s *o) tcg_gen_brcondi_i64(TCG_COND_NE, o->in2, 0, lab); gen_trap(s); gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_llgfat(DisasContext *s, DisasOps *o) +static DisasJumpType op_llgfat(DisasContext *s, DisasOps *o) { TCGLabel *lab =3D gen_new_label(); tcg_gen_qemu_ld32u(o->out, o->in2, get_mem_index(s)); @@ -2703,10 +2699,10 @@ static ExitStatus op_llgfat(DisasContext *s, DisasO= ps *o) tcg_gen_brcondi_i64(TCG_COND_NE, o->out, 0, lab); gen_trap(s); gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_llgtat(DisasContext *s, DisasOps *o) +static DisasJumpType op_llgtat(DisasContext *s, DisasOps *o) { TCGLabel *lab =3D gen_new_label(); tcg_gen_andi_i64(o->out, o->in2, 0x7fffffff); @@ -2714,10 +2710,10 @@ static ExitStatus op_llgtat(DisasContext *s, DisasO= ps *o) tcg_gen_brcondi_i64(TCG_COND_NE, o->out, 0, lab); gen_trap(s); gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_loc(DisasContext *s, DisasOps *o) +static DisasJumpType op_loc(DisasContext *s, DisasOps *o) { DisasCompare c; =20 @@ -2744,11 +2740,11 @@ static ExitStatus op_loc(DisasContext *s, DisasOps = *o) tcg_temp_free_i64(z); } =20 - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_lctl(DisasContext *s, DisasOps *o) +static DisasJumpType op_lctl(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -2757,10 +2753,10 @@ static ExitStatus op_lctl(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); /* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */ - return EXIT_PC_STALE_NOCHAIN; + return DISAS_PC_STALE_NOCHAIN; } =20 -static ExitStatus op_lctlg(DisasContext *s, DisasOps *o) +static DisasJumpType op_lctlg(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -2769,26 +2765,26 @@ static ExitStatus op_lctlg(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); /* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */ - return EXIT_PC_STALE_NOCHAIN; + return DISAS_PC_STALE_NOCHAIN; } =20 -static ExitStatus op_lra(DisasContext *s, DisasOps *o) +static DisasJumpType op_lra(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_lra(o->out, cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lpp(DisasContext *s, DisasOps *o) +static DisasJumpType op_lpp(DisasContext *s, DisasOps *o) { check_privileged(s); =20 tcg_gen_st_i64(o->in2, cpu_env, offsetof(CPUS390XState, pp)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lpsw(DisasContext *s, DisasOps *o) +static DisasJumpType op_lpsw(DisasContext *s, DisasOps *o) { TCGv_i64 t1, t2; =20 @@ -2805,10 +2801,10 @@ static ExitStatus op_lpsw(DisasContext *s, DisasOps= *o) gen_helper_load_psw(cpu_env, t1, t2); tcg_temp_free_i64(t1); tcg_temp_free_i64(t2); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 -static ExitStatus op_lpswe(DisasContext *s, DisasOps *o) +static DisasJumpType op_lpswe(DisasContext *s, DisasOps *o) { TCGv_i64 t1, t2; =20 @@ -2823,21 +2819,21 @@ static ExitStatus op_lpswe(DisasContext *s, DisasOp= s *o) gen_helper_load_psw(cpu_env, t1, t2); tcg_temp_free_i64(t1); tcg_temp_free_i64(t2); - return EXIT_NORETURN; + return DISAS_NORETURN; } #endif =20 -static ExitStatus op_lam(DisasContext *s, DisasOps *o) +static DisasJumpType op_lam(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); gen_helper_lam(cpu_env, r1, o->in2, r3); tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lm32(DisasContext *s, DisasOps *o) +static DisasJumpType op_lm32(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -2849,7 +2845,7 @@ static ExitStatus op_lm32(DisasContext *s, DisasOps *= o) tcg_gen_qemu_ld32u(t1, o->in2, get_mem_index(s)); store_reg32_i64(r1, t1); tcg_temp_free(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 /* First load the values of the first and last registers to trigger @@ -2865,7 +2861,7 @@ static ExitStatus op_lm32(DisasContext *s, DisasOps *= o) if (((r1 + 1) & 15) =3D=3D r3) { tcg_temp_free(t2); tcg_temp_free(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 /* Then load the remaining registers. Page fault can't occur. */ @@ -2880,10 +2876,10 @@ static ExitStatus op_lm32(DisasContext *s, DisasOps= *o) tcg_temp_free(t2); tcg_temp_free(t1); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lmh(DisasContext *s, DisasOps *o) +static DisasJumpType op_lmh(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -2895,7 +2891,7 @@ static ExitStatus op_lmh(DisasContext *s, DisasOps *o) tcg_gen_qemu_ld32u(t1, o->in2, get_mem_index(s)); store_reg32h_i64(r1, t1); tcg_temp_free(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 /* First load the values of the first and last registers to trigger @@ -2911,7 +2907,7 @@ static ExitStatus op_lmh(DisasContext *s, DisasOps *o) if (((r1 + 1) & 15) =3D=3D r3) { tcg_temp_free(t2); tcg_temp_free(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 /* Then load the remaining registers. Page fault can't occur. */ @@ -2926,10 +2922,10 @@ static ExitStatus op_lmh(DisasContext *s, DisasOps = *o) tcg_temp_free(t2); tcg_temp_free(t1); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lm64(DisasContext *s, DisasOps *o) +static DisasJumpType op_lm64(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -2938,7 +2934,7 @@ static ExitStatus op_lm64(DisasContext *s, DisasOps *= o) /* Only one register to read. */ if (unlikely(r1 =3D=3D r3)) { tcg_gen_qemu_ld64(regs[r1], o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 /* First load the values of the first and last registers to trigger @@ -2954,7 +2950,7 @@ static ExitStatus op_lm64(DisasContext *s, DisasOps *= o) /* Only two registers to read. */ if (((r1 + 1) & 15) =3D=3D r3) { tcg_temp_free(t1); - return NO_EXIT; + return DISAS_NEXT; } =20 /* Then load the remaining registers. Page fault can't occur. */ @@ -2967,10 +2963,10 @@ static ExitStatus op_lm64(DisasContext *s, DisasOps= *o) } tcg_temp_free(t1); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lpd(DisasContext *s, DisasOps *o) +static DisasJumpType op_lpd(DisasContext *s, DisasOps *o) { TCGv_i64 a1, a2; TCGMemOp mop =3D s->insn->data; @@ -2980,7 +2976,7 @@ static ExitStatus op_lpd(DisasContext *s, DisasOps *o) update_psw_addr(s); update_cc_op(s); gen_exception(EXCP_ATOMIC); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 /* In a serial context, perform the two loads ... */ @@ -2993,10 +2989,10 @@ static ExitStatus op_lpd(DisasContext *s, DisasOps = *o) =20 /* ... and indicate that we performed them while interlocked. */ gen_op_movi_cc(s, 0); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lpq(DisasContext *s, DisasOps *o) +static DisasJumpType op_lpq(DisasContext *s, DisasOps *o) { if (tb_cflags(s->tb) & CF_PARALLEL) { gen_helper_lpq_parallel(o->out, cpu_env, o->in2); @@ -3004,41 +3000,41 @@ static ExitStatus op_lpq(DisasContext *s, DisasOps = *o) gen_helper_lpq(o->out, cpu_env, o->in2); } return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_lura(DisasContext *s, DisasOps *o) +static DisasJumpType op_lura(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_lura(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_lurag(DisasContext *s, DisasOps *o) +static DisasJumpType op_lurag(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_lurag(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_lzrb(DisasContext *s, DisasOps *o) +static DisasJumpType op_lzrb(DisasContext *s, DisasOps *o) { tcg_gen_andi_i64(o->out, o->in2, -256); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mov2(DisasContext *s, DisasOps *o) +static DisasJumpType op_mov2(DisasContext *s, DisasOps *o) { o->out =3D o->in2; o->g_out =3D o->g_in2; o->in2 =3D NULL; o->g_in2 =3D false; - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mov2e(DisasContext *s, DisasOps *o) +static DisasJumpType op_mov2e(DisasContext *s, DisasOps *o) { int b2 =3D get_field(s->fields, b2); TCGv ar1 =3D tcg_temp_new_i64(); @@ -3070,10 +3066,10 @@ static ExitStatus op_mov2e(DisasContext *s, DisasOp= s *o) tcg_gen_st32_i64(ar1, cpu_env, offsetof(CPUS390XState, aregs[1])); tcg_temp_free_i64(ar1); =20 - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_movx(DisasContext *s, DisasOps *o) +static DisasJumpType op_movx(DisasContext *s, DisasOps *o) { o->out =3D o->in1; o->out2 =3D o->in2; @@ -3082,26 +3078,26 @@ static ExitStatus op_movx(DisasContext *s, DisasOps= *o) o->in1 =3D NULL; o->in2 =3D NULL; o->g_in1 =3D o->g_in2 =3D false; - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvc(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvc(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_mvc(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvcin(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcin(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_mvcin(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvcl(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcl(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r2 =3D get_field(s->fields, r2); @@ -3110,7 +3106,7 @@ static ExitStatus op_mvcl(DisasContext *s, DisasOps *= o) /* r1 and r2 must be even. */ if (r1 & 1 || r2 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -3119,10 +3115,10 @@ static ExitStatus op_mvcl(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvcle(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcle(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -3131,7 +3127,7 @@ static ExitStatus op_mvcle(DisasContext *s, DisasOps = *o) /* r1 and r3 must be even. */ if (r1 & 1 || r3 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -3140,10 +3136,10 @@ static ExitStatus op_mvcle(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t3); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvclu(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvclu(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -3152,7 +3148,7 @@ static ExitStatus op_mvclu(DisasContext *s, DisasOps = *o) /* r1 and r3 must be even. */ if (r1 & 1 || r3 & 1) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 t1 =3D tcg_const_i32(r1); @@ -3161,151 +3157,151 @@ static ExitStatus op_mvclu(DisasContext *s, Disas= Ops *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t3); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvcos(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcos(DisasContext *s, DisasOps *o) { int r3 =3D get_field(s->fields, r3); gen_helper_mvcos(cc_op, cpu_env, o->addr1, o->in2, regs[r3]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_mvcp(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcp(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, l1); check_privileged(s); gen_helper_mvcp(cc_op, cpu_env, regs[r1], o->addr1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvcs(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvcs(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, l1); check_privileged(s); gen_helper_mvcs(cc_op, cpu_env, regs[r1], o->addr1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_mvn(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvn(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_mvn(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvo(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvo(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_mvo(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvpg(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvpg(DisasContext *s, DisasOps *o) { gen_helper_mvpg(cc_op, cpu_env, regs[0], o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvst(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvst(DisasContext *s, DisasOps *o) { gen_helper_mvst(o->in1, cpu_env, regs[0], o->in1, o->in2); set_cc_static(s); return_low128(o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mvz(DisasContext *s, DisasOps *o) +static DisasJumpType op_mvz(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_mvz(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mul(DisasContext *s, DisasOps *o) +static DisasJumpType op_mul(DisasContext *s, DisasOps *o) { tcg_gen_mul_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mul128(DisasContext *s, DisasOps *o) +static DisasJumpType op_mul128(DisasContext *s, DisasOps *o) { tcg_gen_mulu2_i64(o->out2, o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_meeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_meeb(DisasContext *s, DisasOps *o) { gen_helper_meeb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mdeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_mdeb(DisasContext *s, DisasOps *o) { gen_helper_mdeb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_mdb(DisasContext *s, DisasOps *o) { gen_helper_mdb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_mxb(DisasContext *s, DisasOps *o) { gen_helper_mxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mxdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_mxdb(DisasContext *s, DisasOps *o) { gen_helper_mxdb(o->out, cpu_env, o->out, o->out2, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_maeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_maeb(DisasContext *s, DisasOps *o) { TCGv_i64 r3 =3D load_freg32_i64(get_field(s->fields, r3)); gen_helper_maeb(o->out, cpu_env, o->in1, o->in2, r3); tcg_temp_free_i64(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_madb(DisasContext *s, DisasOps *o) +static DisasJumpType op_madb(DisasContext *s, DisasOps *o) { int r3 =3D get_field(s->fields, r3); gen_helper_madb(o->out, cpu_env, o->in1, o->in2, fregs[r3]); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mseb(DisasContext *s, DisasOps *o) +static DisasJumpType op_mseb(DisasContext *s, DisasOps *o) { TCGv_i64 r3 =3D load_freg32_i64(get_field(s->fields, r3)); gen_helper_mseb(o->out, cpu_env, o->in1, o->in2, r3); tcg_temp_free_i64(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_msdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_msdb(DisasContext *s, DisasOps *o) { int r3 =3D get_field(s->fields, r3); gen_helper_msdb(o->out, cpu_env, o->in1, o->in2, fregs[r3]); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_nabs(DisasContext *s, DisasOps *o) +static DisasJumpType op_nabs(DisasContext *s, DisasOps *o) { TCGv_i64 z, n; z =3D tcg_const_i64(0); @@ -3314,78 +3310,78 @@ static ExitStatus op_nabs(DisasContext *s, DisasOps= *o) tcg_gen_movcond_i64(TCG_COND_GE, o->out, o->in2, z, n, o->in2); tcg_temp_free_i64(n); tcg_temp_free_i64(z); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_nabsf32(DisasContext *s, DisasOps *o) +static DisasJumpType op_nabsf32(DisasContext *s, DisasOps *o) { tcg_gen_ori_i64(o->out, o->in2, 0x80000000ull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_nabsf64(DisasContext *s, DisasOps *o) +static DisasJumpType op_nabsf64(DisasContext *s, DisasOps *o) { tcg_gen_ori_i64(o->out, o->in2, 0x8000000000000000ull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_nabsf128(DisasContext *s, DisasOps *o) +static DisasJumpType op_nabsf128(DisasContext *s, DisasOps *o) { tcg_gen_ori_i64(o->out, o->in1, 0x8000000000000000ull); tcg_gen_mov_i64(o->out2, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_nc(DisasContext *s, DisasOps *o) +static DisasJumpType op_nc(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_nc(cc_op, cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_neg(DisasContext *s, DisasOps *o) +static DisasJumpType op_neg(DisasContext *s, DisasOps *o) { tcg_gen_neg_i64(o->out, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_negf32(DisasContext *s, DisasOps *o) +static DisasJumpType op_negf32(DisasContext *s, DisasOps *o) { tcg_gen_xori_i64(o->out, o->in2, 0x80000000ull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_negf64(DisasContext *s, DisasOps *o) +static DisasJumpType op_negf64(DisasContext *s, DisasOps *o) { tcg_gen_xori_i64(o->out, o->in2, 0x8000000000000000ull); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_negf128(DisasContext *s, DisasOps *o) +static DisasJumpType op_negf128(DisasContext *s, DisasOps *o) { tcg_gen_xori_i64(o->out, o->in1, 0x8000000000000000ull); tcg_gen_mov_i64(o->out2, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_oc(DisasContext *s, DisasOps *o) +static DisasJumpType op_oc(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_oc(cc_op, cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_or(DisasContext *s, DisasOps *o) +static DisasJumpType op_or(DisasContext *s, DisasOps *o) { tcg_gen_or_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ori(DisasContext *s, DisasOps *o) +static DisasJumpType op_ori(DisasContext *s, DisasOps *o) { int shift =3D s->insn->data & 0xff; int size =3D s->insn->data >> 8; @@ -3398,10 +3394,10 @@ static ExitStatus op_ori(DisasContext *s, DisasOps = *o) /* Produce the CC from only the bits manipulated. */ tcg_gen_andi_i64(cc_dst, o->out, mask); set_cc_nz_u64(s, cc_dst); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_oi(DisasContext *s, DisasOps *o) +static DisasJumpType op_oi(DisasContext *s, DisasOps *o) { o->in1 =3D tcg_temp_new_i64(); =20 @@ -3419,18 +3415,18 @@ static ExitStatus op_oi(DisasContext *s, DisasOps *= o) if (!s390_has_feat(S390_FEAT_INTERLOCKED_ACCESS_2)) { tcg_gen_qemu_st_tl(o->out, o->addr1, get_mem_index(s), s->insn->da= ta); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pack(DisasContext *s, DisasOps *o) +static DisasJumpType op_pack(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_pack(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pka(DisasContext *s, DisasOps *o) +static DisasJumpType op_pka(DisasContext *s, DisasOps *o) { int l2 =3D get_field(s->fields, l2) + 1; TCGv_i32 l; @@ -3438,15 +3434,15 @@ static ExitStatus op_pka(DisasContext *s, DisasOps = *o) /* The length must not exceed 32 bytes. */ if (l2 > 32) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } l =3D tcg_const_i32(l2); gen_helper_pka(cpu_env, o->addr1, o->in2, l); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pku(DisasContext *s, DisasOps *o) +static DisasJumpType op_pku(DisasContext *s, DisasOps *o) { int l2 =3D get_field(s->fields, l2) + 1; TCGv_i32 l; @@ -3454,30 +3450,30 @@ static ExitStatus op_pku(DisasContext *s, DisasOps = *o) /* The length must be even and should not exceed 64 bytes. */ if ((l2 & 1) || (l2 > 64)) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } l =3D tcg_const_i32(l2); gen_helper_pku(cpu_env, o->addr1, o->in2, l); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_popcnt(DisasContext *s, DisasOps *o) +static DisasJumpType op_popcnt(DisasContext *s, DisasOps *o) { gen_helper_popcnt(o->out, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_ptlb(DisasContext *s, DisasOps *o) +static DisasJumpType op_ptlb(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_ptlb(cpu_env); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_risbg(DisasContext *s, DisasOps *o) +static DisasJumpType op_risbg(DisasContext *s, DisasOps *o) { int i3 =3D get_field(s->fields, i3); int i4 =3D get_field(s->fields, i4); @@ -3535,7 +3531,7 @@ static ExitStatus op_risbg(DisasContext *s, DisasOps = *o) /* In some cases we can implement this with extract. */ if (imask =3D=3D 0 && pos =3D=3D 0 && len > 0 && len <=3D rot) { tcg_gen_extract_i64(o->out, o->in2, 64 - rot, len); - return NO_EXIT; + return DISAS_NEXT; } =20 /* In some cases we can implement this with deposit. */ @@ -3564,10 +3560,10 @@ static ExitStatus op_risbg(DisasContext *s, DisasOp= s *o) tcg_gen_andi_i64(o->out, o->out, imask); tcg_gen_or_i64(o->out, o->out, o->in2); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rosbg(DisasContext *s, DisasOps *o) +static DisasJumpType op_rosbg(DisasContext *s, DisasOps *o) { int i3 =3D get_field(s->fields, i3); int i4 =3D get_field(s->fields, i4); @@ -3617,28 +3613,28 @@ static ExitStatus op_rosbg(DisasContext *s, DisasOp= s *o) /* Set the CC. */ tcg_gen_andi_i64(cc_dst, o->out, mask); set_cc_nz_u64(s, cc_dst); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rev16(DisasContext *s, DisasOps *o) +static DisasJumpType op_rev16(DisasContext *s, DisasOps *o) { tcg_gen_bswap16_i64(o->out, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rev32(DisasContext *s, DisasOps *o) +static DisasJumpType op_rev32(DisasContext *s, DisasOps *o) { tcg_gen_bswap32_i64(o->out, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rev64(DisasContext *s, DisasOps *o) +static DisasJumpType op_rev64(DisasContext *s, DisasOps *o) { tcg_gen_bswap64_i64(o->out, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rll32(DisasContext *s, DisasOps *o) +static DisasJumpType op_rll32(DisasContext *s, DisasOps *o) { TCGv_i32 t1 =3D tcg_temp_new_i32(); TCGv_i32 t2 =3D tcg_temp_new_i32(); @@ -3650,34 +3646,34 @@ static ExitStatus op_rll32(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(t1); tcg_temp_free_i32(t2); tcg_temp_free_i32(to); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rll64(DisasContext *s, DisasOps *o) +static DisasJumpType op_rll64(DisasContext *s, DisasOps *o) { tcg_gen_rotl_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_rrbe(DisasContext *s, DisasOps *o) +static DisasJumpType op_rrbe(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_rrbe(cc_op, cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sacf(DisasContext *s, DisasOps *o) +static DisasJumpType op_sacf(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sacf(cpu_env, o->in2); /* Addressing mode has changed, so end the block. */ - return EXIT_PC_STALE; + return DISAS_PC_STALE; } #endif =20 -static ExitStatus op_sam(DisasContext *s, DisasOps *o) +static DisasJumpType op_sam(DisasContext *s, DisasOps *o) { int sam =3D s->insn->data; TCGv_i64 tsam; @@ -3700,7 +3696,7 @@ static ExitStatus op_sam(DisasContext *s, DisasOps *o) documents that Bad Things Happen two bytes before the end. */ if (s->pc & ~mask) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } s->next_pc &=3D mask; =20 @@ -3709,64 +3705,64 @@ static ExitStatus op_sam(DisasContext *s, DisasOps = *o) tcg_temp_free_i64(tsam); =20 /* Always exit the TB, since we (may have) changed execution mode. */ - return EXIT_PC_STALE; + return DISAS_PC_STALE; } =20 -static ExitStatus op_sar(DisasContext *s, DisasOps *o) +static DisasJumpType op_sar(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); tcg_gen_st32_i64(o->in2, cpu_env, offsetof(CPUS390XState, aregs[r1])); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_seb(DisasContext *s, DisasOps *o) +static DisasJumpType op_seb(DisasContext *s, DisasOps *o) { gen_helper_seb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_sdb(DisasContext *s, DisasOps *o) { gen_helper_sdb(o->out, cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_sxb(DisasContext *s, DisasOps *o) { gen_helper_sxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sqeb(DisasContext *s, DisasOps *o) +static DisasJumpType op_sqeb(DisasContext *s, DisasOps *o) { gen_helper_sqeb(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sqdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_sqdb(DisasContext *s, DisasOps *o) { gen_helper_sqdb(o->out, cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sqxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_sqxb(DisasContext *s, DisasOps *o) { gen_helper_sqxb(o->out, cpu_env, o->in1, o->in2); return_low128(o->out2); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_servc(DisasContext *s, DisasOps *o) +static DisasJumpType op_servc(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_servc(cc_op, cpu_env, o->in2, o->in1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sigp(DisasContext *s, DisasOps *o) +static DisasJumpType op_sigp(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -3775,11 +3771,11 @@ static ExitStatus op_sigp(DisasContext *s, DisasOps= *o) set_cc_static(s); tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_soc(DisasContext *s, DisasOps *o) +static DisasJumpType op_soc(DisasContext *s, DisasOps *o) { DisasCompare c; TCGv_i64 a, h; @@ -3821,10 +3817,10 @@ static ExitStatus op_soc(DisasContext *s, DisasOps = *o) tcg_temp_free_i64(a); =20 gen_set_label(lab); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sla(DisasContext *s, DisasOps *o) +static DisasJumpType op_sla(DisasContext *s, DisasOps *o) { uint64_t sign =3D 1ull << s->insn->data; enum cc_op cco =3D s->insn->data =3D=3D 31 ? CC_OP_SLA_32 : CC_OP_SLA_= 64; @@ -3835,40 +3831,40 @@ static ExitStatus op_sla(DisasContext *s, DisasOps = *o) tcg_gen_andi_i64(o->out, o->out, ~sign); tcg_gen_andi_i64(o->in1, o->in1, sign); tcg_gen_or_i64(o->out, o->out, o->in1); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sll(DisasContext *s, DisasOps *o) +static DisasJumpType op_sll(DisasContext *s, DisasOps *o) { tcg_gen_shl_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sra(DisasContext *s, DisasOps *o) +static DisasJumpType op_sra(DisasContext *s, DisasOps *o) { tcg_gen_sar_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_srl(DisasContext *s, DisasOps *o) +static DisasJumpType op_srl(DisasContext *s, DisasOps *o) { tcg_gen_shr_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sfpc(DisasContext *s, DisasOps *o) +static DisasJumpType op_sfpc(DisasContext *s, DisasOps *o) { gen_helper_sfpc(cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sfas(DisasContext *s, DisasOps *o) +static DisasJumpType op_sfas(DisasContext *s, DisasOps *o) { gen_helper_sfas(cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_srnm(DisasContext *s, DisasOps *o) +static DisasJumpType op_srnm(DisasContext *s, DisasOps *o) { int b2 =3D get_field(s->fields, b2); int d2 =3D get_field(s->fields, d2); @@ -3905,10 +3901,10 @@ static ExitStatus op_srnm(DisasContext *s, DisasOps= *o) /* Then install the new FPC to set the rounding mode in fpu_status. */ gen_helper_sfpc(cpu_env, t2); tcg_temp_free_i64(t2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_spm(DisasContext *s, DisasOps *o) +static DisasJumpType op_spm(DisasContext *s, DisasOps *o) { tcg_gen_extrl_i64_i32(cc_op, o->in1); tcg_gen_extract_i32(cc_op, cc_op, 28, 2); @@ -3916,10 +3912,10 @@ static ExitStatus op_spm(DisasContext *s, DisasOps = *o) =20 tcg_gen_shri_i64(o->in1, o->in1, 24); tcg_gen_deposit_i64(psw_mask, psw_mask, o->in1, PSW_SHIFT_MASK_PM, 4); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ectg(DisasContext *s, DisasOps *o) +static DisasJumpType op_ectg(DisasContext *s, DisasOps *o) { int b1 =3D get_field(s->fields, b1); int d1 =3D get_field(s->fields, d1); @@ -3946,49 +3942,49 @@ static ExitStatus op_ectg(DisasContext *s, DisasOps= *o) tcg_gen_mov_i64(regs[1], o->in2); =20 tcg_temp_free_i64(tmp); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_spka(DisasContext *s, DisasOps *o) +static DisasJumpType op_spka(DisasContext *s, DisasOps *o) { check_privileged(s); tcg_gen_shri_i64(o->in2, o->in2, 4); tcg_gen_deposit_i64(psw_mask, psw_mask, o->in2, PSW_SHIFT_KEY, 4); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sske(DisasContext *s, DisasOps *o) +static DisasJumpType op_sske(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sske(cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ssm(DisasContext *s, DisasOps *o) +static DisasJumpType op_ssm(DisasContext *s, DisasOps *o) { check_privileged(s); tcg_gen_deposit_i64(psw_mask, psw_mask, o->in2, 56, 8); /* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */ - return EXIT_PC_STALE_NOCHAIN; + return DISAS_PC_STALE_NOCHAIN; } =20 -static ExitStatus op_stap(DisasContext *s, DisasOps *o) +static DisasJumpType op_stap(DisasContext *s, DisasOps *o) { check_privileged(s); tcg_gen_ld32u_i64(o->out, cpu_env, offsetof(CPUS390XState, core_id)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stck(DisasContext *s, DisasOps *o) +static DisasJumpType op_stck(DisasContext *s, DisasOps *o) { gen_helper_stck(o->out, cpu_env); /* ??? We don't implement clock states. */ gen_op_movi_cc(s, 0); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stcke(DisasContext *s, DisasOps *o) +static DisasJumpType op_stcke(DisasContext *s, DisasOps *o) { TCGv_i64 c1 =3D tcg_temp_new_i64(); TCGv_i64 c2 =3D tcg_temp_new_i64(); @@ -4012,31 +4008,31 @@ static ExitStatus op_stcke(DisasContext *s, DisasOp= s *o) tcg_temp_free_i64(todpr); /* ??? We don't implement clock states. */ gen_op_movi_cc(s, 0); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sckc(DisasContext *s, DisasOps *o) +static DisasJumpType op_sckc(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sckc(cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sckpf(DisasContext *s, DisasOps *o) +static DisasJumpType op_sckpf(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sckpf(cpu_env, regs[0]); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stckc(DisasContext *s, DisasOps *o) +static DisasJumpType op_stckc(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stckc(o->out, cpu_env); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stctg(DisasContext *s, DisasOps *o) +static DisasJumpType op_stctg(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -4044,10 +4040,10 @@ static ExitStatus op_stctg(DisasContext *s, DisasOp= s *o) gen_helper_stctg(cpu_env, r1, o->in2, r3); tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stctl(DisasContext *s, DisasOps *o) +static DisasJumpType op_stctl(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -4055,186 +4051,186 @@ static ExitStatus op_stctl(DisasContext *s, Disas= Ops *o) gen_helper_stctl(cpu_env, r1, o->in2, r3); tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stidp(DisasContext *s, DisasOps *o) +static DisasJumpType op_stidp(DisasContext *s, DisasOps *o) { check_privileged(s); tcg_gen_ld_i64(o->out, cpu_env, offsetof(CPUS390XState, cpuid)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_spt(DisasContext *s, DisasOps *o) +static DisasJumpType op_spt(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_spt(cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stfl(DisasContext *s, DisasOps *o) +static DisasJumpType op_stfl(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stfl(cpu_env); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stpt(DisasContext *s, DisasOps *o) +static DisasJumpType op_stpt(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stpt(o->out, cpu_env); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stsi(DisasContext *s, DisasOps *o) +static DisasJumpType op_stsi(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stsi(cc_op, cpu_env, o->in2, regs[0], regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_spx(DisasContext *s, DisasOps *o) +static DisasJumpType op_spx(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_spx(cpu_env, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_xsch(DisasContext *s, DisasOps *o) +static DisasJumpType op_xsch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_xsch(cpu_env, regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_csch(DisasContext *s, DisasOps *o) +static DisasJumpType op_csch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_csch(cpu_env, regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_hsch(DisasContext *s, DisasOps *o) +static DisasJumpType op_hsch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_hsch(cpu_env, regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_msch(DisasContext *s, DisasOps *o) +static DisasJumpType op_msch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_msch(cpu_env, regs[1], o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rchp(DisasContext *s, DisasOps *o) +static DisasJumpType op_rchp(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_rchp(cpu_env, regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rsch(DisasContext *s, DisasOps *o) +static DisasJumpType op_rsch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_rsch(cpu_env, regs[1]); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sal(DisasContext *s, DisasOps *o) +static DisasJumpType op_sal(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sal(cpu_env, regs[1]); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_schm(DisasContext *s, DisasOps *o) +static DisasJumpType op_schm(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_schm(cpu_env, regs[1], regs[2], o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_siga(DisasContext *s, DisasOps *o) +static DisasJumpType op_siga(DisasContext *s, DisasOps *o) { check_privileged(s); /* From KVM code: Not provided, set CC =3D 3 for subchannel not operat= ional */ gen_op_movi_cc(s, 3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stcps(DisasContext *s, DisasOps *o) +static DisasJumpType op_stcps(DisasContext *s, DisasOps *o) { check_privileged(s); /* The instruction is suppressed if not provided. */ - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ssch(DisasContext *s, DisasOps *o) +static DisasJumpType op_ssch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_ssch(cpu_env, regs[1], o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stsch(DisasContext *s, DisasOps *o) +static DisasJumpType op_stsch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stsch(cpu_env, regs[1], o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stcrw(DisasContext *s, DisasOps *o) +static DisasJumpType op_stcrw(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stcrw(cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tpi(DisasContext *s, DisasOps *o) +static DisasJumpType op_tpi(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_tpi(cc_op, cpu_env, o->addr1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tsch(DisasContext *s, DisasOps *o) +static DisasJumpType op_tsch(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_tsch(cpu_env, regs[1], o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_chsc(DisasContext *s, DisasOps *o) +static DisasJumpType op_chsc(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_chsc(cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stpx(DisasContext *s, DisasOps *o) +static DisasJumpType op_stpx(DisasContext *s, DisasOps *o) { check_privileged(s); tcg_gen_ld_i64(o->out, cpu_env, offsetof(CPUS390XState, psa)); tcg_gen_andi_i64(o->out, o->out, 0x7fffe000); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stnosm(DisasContext *s, DisasOps *o) +static DisasJumpType op_stnosm(DisasContext *s, DisasOps *o) { uint64_t i2 =3D get_field(s->fields, i2); TCGv_i64 t; @@ -4257,66 +4253,66 @@ static ExitStatus op_stnosm(DisasContext *s, DisasO= ps *o) } =20 /* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */ - return EXIT_PC_STALE_NOCHAIN; + return DISAS_PC_STALE_NOCHAIN; } =20 -static ExitStatus op_stura(DisasContext *s, DisasOps *o) +static DisasJumpType op_stura(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_stura(cpu_env, o->in2, o->in1); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sturg(DisasContext *s, DisasOps *o) +static DisasJumpType op_sturg(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sturg(cpu_env, o->in2, o->in1); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 -static ExitStatus op_stfle(DisasContext *s, DisasOps *o) +static DisasJumpType op_stfle(DisasContext *s, DisasOps *o) { gen_helper_stfle(cc_op, cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_st8(DisasContext *s, DisasOps *o) +static DisasJumpType op_st8(DisasContext *s, DisasOps *o) { tcg_gen_qemu_st8(o->in1, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_st16(DisasContext *s, DisasOps *o) +static DisasJumpType op_st16(DisasContext *s, DisasOps *o) { tcg_gen_qemu_st16(o->in1, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_st32(DisasContext *s, DisasOps *o) +static DisasJumpType op_st32(DisasContext *s, DisasOps *o) { tcg_gen_qemu_st32(o->in1, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_st64(DisasContext *s, DisasOps *o) +static DisasJumpType op_st64(DisasContext *s, DisasOps *o) { tcg_gen_qemu_st64(o->in1, o->in2, get_mem_index(s)); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stam(DisasContext *s, DisasOps *o) +static DisasJumpType op_stam(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); gen_helper_stam(cpu_env, r1, o->in2, r3); tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stcm(DisasContext *s, DisasOps *o) +static DisasJumpType op_stcm(DisasContext *s, DisasOps *o) { int m3 =3D get_field(s->fields, m3); int pos, base =3D s->insn->data; @@ -4362,10 +4358,10 @@ static ExitStatus op_stcm(DisasContext *s, DisasOps= *o) break; } tcg_temp_free_i64(tmp); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stm(DisasContext *s, DisasOps *o) +static DisasJumpType op_stm(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -4386,10 +4382,10 @@ static ExitStatus op_stm(DisasContext *s, DisasOps = *o) } =20 tcg_temp_free_i64(tsize); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stmh(DisasContext *s, DisasOps *o) +static DisasJumpType op_stmh(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); @@ -4410,20 +4406,20 @@ static ExitStatus op_stmh(DisasContext *s, DisasOps= *o) tcg_temp_free_i64(t); tcg_temp_free_i64(t4); tcg_temp_free_i64(t32); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stpq(DisasContext *s, DisasOps *o) +static DisasJumpType op_stpq(DisasContext *s, DisasOps *o) { if (tb_cflags(s->tb) & CF_PARALLEL) { gen_helper_stpq_parallel(cpu_env, o->in2, o->out2, o->out); } else { gen_helper_stpq(cpu_env, o->in2, o->out2, o->out); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_srst(DisasContext *s, DisasOps *o) +static DisasJumpType op_srst(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4433,10 +4429,10 @@ static ExitStatus op_srst(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_srstu(DisasContext *s, DisasOps *o) +static DisasJumpType op_srstu(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4446,16 +4442,16 @@ static ExitStatus op_srstu(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sub(DisasContext *s, DisasOps *o) +static DisasJumpType op_sub(DisasContext *s, DisasOps *o) { tcg_gen_sub_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_subb(DisasContext *s, DisasOps *o) +static DisasJumpType op_subb(DisasContext *s, DisasOps *o) { DisasCompare cmp; TCGv_i64 borrow; @@ -4478,10 +4474,10 @@ static ExitStatus op_subb(DisasContext *s, DisasOps= *o) =20 tcg_gen_sub_i64(o->out, o->out, borrow); tcg_temp_free_i64(borrow); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_svc(DisasContext *s, DisasOps *o) +static DisasJumpType op_svc(DisasContext *s, DisasOps *o) { TCGv_i32 t; =20 @@ -4497,104 +4493,104 @@ static ExitStatus op_svc(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(t); =20 gen_exception(EXCP_SVC); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 -static ExitStatus op_tam(DisasContext *s, DisasOps *o) +static DisasJumpType op_tam(DisasContext *s, DisasOps *o) { int cc =3D 0; =20 cc |=3D (s->tb->flags & FLAG_MASK_64) ? 2 : 0; cc |=3D (s->tb->flags & FLAG_MASK_32) ? 1 : 0; gen_op_movi_cc(s, cc); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tceb(DisasContext *s, DisasOps *o) +static DisasJumpType op_tceb(DisasContext *s, DisasOps *o) { gen_helper_tceb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tcdb(DisasContext *s, DisasOps *o) +static DisasJumpType op_tcdb(DisasContext *s, DisasOps *o) { gen_helper_tcdb(cc_op, cpu_env, o->in1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tcxb(DisasContext *s, DisasOps *o) +static DisasJumpType op_tcxb(DisasContext *s, DisasOps *o) { gen_helper_tcxb(cc_op, cpu_env, o->out, o->out2, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY =20 -static ExitStatus op_testblock(DisasContext *s, DisasOps *o) +static DisasJumpType op_testblock(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_testblock(cc_op, cpu_env, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tprot(DisasContext *s, DisasOps *o) +static DisasJumpType op_tprot(DisasContext *s, DisasOps *o) { gen_helper_tprot(cc_op, cpu_env, o->addr1, o->in2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 #endif =20 -static ExitStatus op_tp(DisasContext *s, DisasOps *o) +static DisasJumpType op_tp(DisasContext *s, DisasOps *o) { TCGv_i32 l1 =3D tcg_const_i32(get_field(s->fields, l1) + 1); gen_helper_tp(cc_op, cpu_env, o->addr1, l1); tcg_temp_free_i32(l1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tr(DisasContext *s, DisasOps *o) +static DisasJumpType op_tr(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_tr(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_tre(DisasContext *s, DisasOps *o) +static DisasJumpType op_tre(DisasContext *s, DisasOps *o) { gen_helper_tre(o->out, cpu_env, o->out, o->out2, o->in2); return_low128(o->out2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_trt(DisasContext *s, DisasOps *o) +static DisasJumpType op_trt(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_trt(cc_op, cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_trtr(DisasContext *s, DisasOps *o) +static DisasJumpType op_trtr(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_trtr(cc_op, cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_trXX(DisasContext *s, DisasOps *o) +static DisasJumpType op_trXX(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4622,28 +4618,28 @@ static ExitStatus op_trXX(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(sizes); tcg_temp_free_i32(tst); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_ts(DisasContext *s, DisasOps *o) +static DisasJumpType op_ts(DisasContext *s, DisasOps *o) { TCGv_i32 t1 =3D tcg_const_i32(0xff); tcg_gen_atomic_xchg_i32(t1, o->in2, t1, get_mem_index(s), MO_UB); tcg_gen_extract_i32(cc_op, t1, 7, 1); tcg_temp_free_i32(t1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_unpk(DisasContext *s, DisasOps *o) +static DisasJumpType op_unpk(DisasContext *s, DisasOps *o) { TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); gen_helper_unpk(cpu_env, l, o->addr1, o->in2); tcg_temp_free_i32(l); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_unpka(DisasContext *s, DisasOps *o) +static DisasJumpType op_unpka(DisasContext *s, DisasOps *o) { int l1 =3D get_field(s->fields, l1) + 1; TCGv_i32 l; @@ -4651,16 +4647,16 @@ static ExitStatus op_unpka(DisasContext *s, DisasOp= s *o) /* The length must not exceed 32 bytes. */ if (l1 > 32) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } l =3D tcg_const_i32(l1); gen_helper_unpka(cc_op, cpu_env, o->addr1, l, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_unpku(DisasContext *s, DisasOps *o) +static DisasJumpType op_unpku(DisasContext *s, DisasOps *o) { int l1 =3D get_field(s->fields, l1) + 1; TCGv_i32 l; @@ -4668,17 +4664,17 @@ static ExitStatus op_unpku(DisasContext *s, DisasOp= s *o) /* The length must be even and should not exceed 64 bytes. */ if ((l1 & 1) || (l1 > 64)) { gen_program_exception(s, PGM_SPECIFICATION); - return EXIT_NORETURN; + return DISAS_NORETURN; } l =3D tcg_const_i32(l1); gen_helper_unpku(cc_op, cpu_env, o->addr1, l, o->in2); tcg_temp_free_i32(l); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 =20 -static ExitStatus op_xc(DisasContext *s, DisasOps *o) +static DisasJumpType op_xc(DisasContext *s, DisasOps *o) { int d1 =3D get_field(s->fields, d1); int d2 =3D get_field(s->fields, d2); @@ -4719,7 +4715,7 @@ static ExitStatus op_xc(DisasContext *s, DisasOps *o) tcg_gen_qemu_st8(o->in2, o->addr1, get_mem_index(s)); } gen_op_movi_cc(s, 0); - return NO_EXIT; + return DISAS_NEXT; } =20 /* But in general we'll defer to a helper. */ @@ -4728,16 +4724,16 @@ static ExitStatus op_xc(DisasContext *s, DisasOps *= o) gen_helper_xc(cc_op, cpu_env, t32, o->addr1, o->in2); tcg_temp_free_i32(t32); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_xor(DisasContext *s, DisasOps *o) +static DisasJumpType op_xor(DisasContext *s, DisasOps *o) { tcg_gen_xor_i64(o->out, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_xori(DisasContext *s, DisasOps *o) +static DisasJumpType op_xori(DisasContext *s, DisasOps *o) { int shift =3D s->insn->data & 0xff; int size =3D s->insn->data >> 8; @@ -4750,10 +4746,10 @@ static ExitStatus op_xori(DisasContext *s, DisasOps= *o) /* Produce the CC from only the bits manipulated. */ tcg_gen_andi_i64(cc_dst, o->out, mask); set_cc_nz_u64(s, cc_dst); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_xi(DisasContext *s, DisasOps *o) +static DisasJumpType op_xi(DisasContext *s, DisasOps *o) { o->in1 =3D tcg_temp_new_i64(); =20 @@ -4771,25 +4767,25 @@ static ExitStatus op_xi(DisasContext *s, DisasOps *= o) if (!s390_has_feat(S390_FEAT_INTERLOCKED_ACCESS_2)) { tcg_gen_qemu_st_tl(o->out, o->addr1, get_mem_index(s), s->insn->da= ta); } - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_zero(DisasContext *s, DisasOps *o) +static DisasJumpType op_zero(DisasContext *s, DisasOps *o) { o->out =3D tcg_const_i64(0); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_zero2(DisasContext *s, DisasOps *o) +static DisasJumpType op_zero2(DisasContext *s, DisasOps *o) { o->out =3D tcg_const_i64(0); o->out2 =3D o->out; o->g_out2 =3D true; - return NO_EXIT; + return DISAS_NEXT; } =20 #ifndef CONFIG_USER_ONLY -static ExitStatus op_clp(DisasContext *s, DisasOps *o) +static DisasJumpType op_clp(DisasContext *s, DisasOps *o) { TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); =20 @@ -4797,10 +4793,10 @@ static ExitStatus op_clp(DisasContext *s, DisasOps = *o) gen_helper_clp(cpu_env, r2); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pcilg(DisasContext *s, DisasOps *o) +static DisasJumpType op_pcilg(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4810,10 +4806,10 @@ static ExitStatus op_pcilg(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pcistg(DisasContext *s, DisasOps *o) +static DisasJumpType op_pcistg(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4823,10 +4819,10 @@ static ExitStatus op_pcistg(DisasContext *s, DisasO= ps *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_stpcifc(DisasContext *s, DisasOps *o) +static DisasJumpType op_stpcifc(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 ar =3D tcg_const_i32(get_field(s->fields, b2)); @@ -4836,17 +4832,17 @@ static ExitStatus op_stpcifc(DisasContext *s, Disas= Ops *o) tcg_temp_free_i32(ar); tcg_temp_free_i32(r1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_sic(DisasContext *s, DisasOps *o) +static DisasJumpType op_sic(DisasContext *s, DisasOps *o) { check_privileged(s); gen_helper_sic(cpu_env, o->in1, o->in2); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_rpcit(DisasContext *s, DisasOps *o) +static DisasJumpType op_rpcit(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); @@ -4856,10 +4852,10 @@ static ExitStatus op_rpcit(DisasContext *s, DisasOp= s *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r2); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_pcistb(DisasContext *s, DisasOps *o) +static DisasJumpType op_pcistb(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); @@ -4871,10 +4867,10 @@ static ExitStatus op_pcistb(DisasContext *s, DisasO= ps *o) tcg_temp_free_i32(r1); tcg_temp_free_i32(r3); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } =20 -static ExitStatus op_mpcifc(DisasContext *s, DisasOps *o) +static DisasJumpType op_mpcifc(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); TCGv_i32 ar =3D tcg_const_i32(get_field(s->fields, b2)); @@ -4884,7 +4880,7 @@ static ExitStatus op_mpcifc(DisasContext *s, DisasOps= *o) tcg_temp_free_i32(ar); tcg_temp_free_i32(r1); set_cc_static(s); - return NO_EXIT; + return DISAS_NEXT; } #endif =20 @@ -6028,10 +6024,10 @@ static const DisasInsn *extract_insn(CPUS390XState = *env, DisasContext *s, return info; } =20 -static ExitStatus translate_one(CPUS390XState *env, DisasContext *s) +static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s) { const DisasInsn *insn; - ExitStatus ret =3D NO_EXIT; + DisasJumpType ret =3D DISAS_NEXT; DisasFields f; DisasOps o; =20 @@ -6043,7 +6039,7 @@ static ExitStatus translate_one(CPUS390XState *env, D= isasContext *s) qemu_log_mask(LOG_UNIMP, "unimplemented opcode 0x%02x%02x\n", f.op, f.op2); gen_illegal_opcode(s); - return EXIT_NORETURN; + return DISAS_NORETURN; } =20 #ifndef CONFIG_USER_ONLY @@ -6090,7 +6086,7 @@ static ExitStatus translate_one(CPUS390XState *env, D= isasContext *s) } if (excp) { gen_program_exception(s, excp); - return EXIT_NORETURN; + return DISAS_NORETURN; } } =20 @@ -6144,7 +6140,7 @@ static ExitStatus translate_one(CPUS390XState *env, D= isasContext *s) #ifndef CONFIG_USER_ONLY if (s->tb->flags & FLAG_MASK_PER) { /* An exception might be triggered, save PSW if not already done. = */ - if (ret =3D=3D NO_EXIT || ret =3D=3D EXIT_PC_STALE) { + if (ret =3D=3D DISAS_NEXT || ret =3D=3D DISAS_PC_STALE) { tcg_gen_movi_i64(psw_addr, s->next_pc); } =20 @@ -6165,7 +6161,7 @@ void gen_intermediate_code(CPUState *cs, struct Trans= lationBlock *tb) target_ulong pc_start; uint64_t next_page_start; int num_insns, max_insns; - ExitStatus status; + DisasJumpType status; bool do_debug; =20 pc_start =3D tb->pc; @@ -6199,7 +6195,7 @@ void gen_intermediate_code(CPUState *cs, struct Trans= lationBlock *tb) num_insns++; =20 if (unlikely(cpu_breakpoint_test(cs, dc.pc, BP_ANY))) { - status =3D EXIT_PC_STALE; + status =3D DISAS_PC_STALE; do_debug =3D true; /* The address covered by the breakpoint must be included in [tb->pc, tb->pc + tb->size) in order to for it to be @@ -6217,39 +6213,40 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) =20 /* If we reach a page boundary, are single stepping, or exhaust instruction count, stop generation. */ - if (status =3D=3D NO_EXIT + if (status =3D=3D DISAS_NEXT && (dc.pc >=3D next_page_start || tcg_op_buf_full() || num_insns >=3D max_insns || singlestep || cs->singlestep_enabled || dc.ex_value)) { - status =3D EXIT_PC_STALE; + status =3D DISAS_TOO_MANY; } - } while (status =3D=3D NO_EXIT); + } while (status =3D=3D DISAS_NEXT); =20 if (tb_cflags(tb) & CF_LAST_IO) { gen_io_end(); } =20 switch (status) { - case EXIT_GOTO_TB: - case EXIT_NORETURN: + case DISAS_GOTO_TB: + case DISAS_NORETURN: break; - case EXIT_PC_STALE: - case EXIT_PC_STALE_NOCHAIN: + case DISAS_TOO_MANY: + case DISAS_PC_STALE: + case DISAS_PC_STALE_NOCHAIN: update_psw_addr(&dc); /* FALLTHRU */ - case EXIT_PC_UPDATED: + case DISAS_PC_UPDATED: /* Next TB starts off with CC_OP_DYNAMIC, so make sure the cc op type is in env */ update_cc_op(&dc); /* FALLTHRU */ - case EXIT_PC_CC_UPDATED: + case DISAS_PC_CC_UPDATED: /* Exit the TB, either by raising a debug exception or by return. = */ if (do_debug) { gen_exception(EXCP_DEBUG); - } else if (use_exit_tb(&dc) || status =3D=3D EXIT_PC_STALE_NOCHAIN= ) { + } else if (use_exit_tb(&dc) || status =3D=3D DISAS_PC_STALE_NOCHAI= N) { tcg_gen_exit_tb(0); } else { tcg_gen_lookup_and_goto_ptr(); --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 152303969938057.44221460537301; Fri, 6 Apr 2018 11:34:59 -0700 (PDT) Received: from localhost ([::1]:45577 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4WCM-0007b0-GF for importer@patchew.org; Fri, 06 Apr 2018 14:34:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48741) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy9-0003mY-Au for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy3-0000TC-EC for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:13 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:52321) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy3-0000Sq-8Y; Fri, 06 Apr 2018 14:20:07 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id E599C20EC3; Fri, 6 Apr 2018 14:20:06 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:06 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 9F59B1025C; Fri, 6 Apr 2018 14:20:06 -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=9SspS4IHsk0im0 JR0jyZYnvVaoNVOeWZS6v2kG1KJIg=; b=jP3AKldI7sEBmzjx0c2/Rqe7dIYPva IGLMGTD1ym2m6PEZOQFlAg1oMLN2o5M2cp84NG9pN97oZZ3hoJqn+j1tATmqygsA JAaGQbiMOQdeu+wRCYKXjCO4n1raFASj90RAzRGJOQeVZ0QlN6ImrXxY834wPN1C nOaYhWlwi2Joc= 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=9SspS4IHsk0im0JR0jyZYnvVaoNVOeWZS6v2kG1KJIg=; b=iOTJoclG 4/tkT9LiKmUdq0DNmOTvflpO6x6ZpbLxLiOEOeQPXOjKHVbaDoffPsB/bv9EWbBs 62KG1iZEqtX5nqJXwFCSkA492P3TF0uE1B/a/2l8X2I18nJVqab71tacPzZeVlaJ c0+nG2MFnxFBZKEwWuSaLmH/7rpiwQP/kXepLIDLrbtiJQ2FNbGGujY+W4D1+WpV hKLRe+4RNvDxVbIvGxacivttxeHkQhPZmzXYcV7gBixqUMU7zVd8GiYXz5pKGJT7 T7lkhZPmANpbyua29I7cUdpTJXsLBL1ZNeMureyMA3pjfLnlZZqZnxOWhbCX7AQa LRWZb+UbjW9wQg== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:54 -0400 Message-Id: <1523038800-2494-12-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 11/17] target/s390x: 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: qemu-s390x@nongnu.org, Cornelia Huck , Richard Henderson , Alexander Graf , David Hildenbrand 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" Notes: - Did not convert {num,max}_insns and is_jmp, since the corresponding code will go away in the next patch. - Avoided a checkpatch error in use_exit_tb. - As suggested by David, (1) Drop ctx.pc and use ctx.base.pc_next instead, and (2) Rename ctx.next_pc to ctx.pc_tmp and add a comment about it. Acked-by: Cornelia Huck Suggested-by: David Hildenbrand Reviewed-by: David Hildenbrand Cc: David Hildenbrand Cc: Cornelia Huck Cc: Alexander Graf Cc: qemu-s390x@nongnu.org Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/s390x/translate.c | 148 ++++++++++++++++++++++++-------------------= ---- 1 file changed, 76 insertions(+), 72 deletions(-) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 3156286..a65e9cd 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -52,14 +52,18 @@ typedef struct DisasInsn DisasInsn; typedef struct DisasFields DisasFields; =20 struct DisasContext { - struct TranslationBlock *tb; + DisasContextBase base; const DisasInsn *insn; DisasFields *fields; uint64_t ex_value; - uint64_t pc, next_pc; + /* + * During translate_one(), pc_tmp is used to determine the instruction + * to be executed after base.pc_next - e.g. next sequential instruction + * or a branch target. + */ + uint64_t pc_tmp; uint32_t ilen; enum cc_op cc_op; - bool singlestep_enabled; }; =20 /* Information carried about a condition to be evaluated. */ @@ -81,8 +85,8 @@ static uint64_t inline_branch_miss[CC_OP_MAX]; =20 static uint64_t pc_to_link_info(DisasContext *s, uint64_t pc) { - if (!(s->tb->flags & FLAG_MASK_64)) { - if (s->tb->flags & FLAG_MASK_32) { + if (!(s->base.tb->flags & FLAG_MASK_64)) { + if (s->base.tb->flags & FLAG_MASK_32) { return pc | 0x80000000; } } @@ -188,16 +192,16 @@ static void return_low128(TCGv_i64 dest) static void update_psw_addr(DisasContext *s) { /* psw.addr */ - tcg_gen_movi_i64(psw_addr, s->pc); + tcg_gen_movi_i64(psw_addr, s->base.pc_next); } =20 static void per_branch(DisasContext *s, bool to_next) { #ifndef CONFIG_USER_ONLY - tcg_gen_movi_i64(gbea, s->pc); + tcg_gen_movi_i64(gbea, s->base.pc_next); =20 - if (s->tb->flags & FLAG_MASK_PER) { - TCGv_i64 next_pc =3D to_next ? tcg_const_i64(s->next_pc) : psw_add= r; + if (s->base.tb->flags & FLAG_MASK_PER) { + TCGv_i64 next_pc =3D to_next ? tcg_const_i64(s->pc_tmp) : psw_addr; gen_helper_per_branch(cpu_env, gbea, next_pc); if (to_next) { tcg_temp_free_i64(next_pc); @@ -210,16 +214,16 @@ static void per_branch_cond(DisasContext *s, TCGCond = cond, TCGv_i64 arg1, TCGv_i64 arg2) { #ifndef CONFIG_USER_ONLY - if (s->tb->flags & FLAG_MASK_PER) { + if (s->base.tb->flags & FLAG_MASK_PER) { TCGLabel *lab =3D gen_new_label(); tcg_gen_brcond_i64(tcg_invert_cond(cond), arg1, arg2, lab); =20 - tcg_gen_movi_i64(gbea, s->pc); + tcg_gen_movi_i64(gbea, s->base.pc_next); gen_helper_per_branch(cpu_env, gbea, psw_addr); =20 gen_set_label(lab); } else { - TCGv_i64 pc =3D tcg_const_i64(s->pc); + TCGv_i64 pc =3D tcg_const_i64(s->base.pc_next); tcg_gen_movcond_i64(cond, gbea, arg1, arg2, gbea, pc); tcg_temp_free_i64(pc); } @@ -228,7 +232,7 @@ static void per_branch_cond(DisasContext *s, TCGCond co= nd, =20 static void per_breaking_event(DisasContext *s) { - tcg_gen_movi_i64(gbea, s->pc); + tcg_gen_movi_i64(gbea, s->base.pc_next); } =20 static void update_cc_op(DisasContext *s) @@ -250,11 +254,11 @@ static inline uint64_t ld_code4(CPUS390XState *env, u= int64_t pc) =20 static int get_mem_index(DisasContext *s) { - if (!(s->tb->flags & FLAG_MASK_DAT)) { + if (!(s->base.tb->flags & FLAG_MASK_DAT)) { return MMU_REAL_IDX; } =20 - switch (s->tb->flags & FLAG_MASK_ASC) { + switch (s->base.tb->flags & FLAG_MASK_ASC) { case PSW_ASC_PRIMARY >> FLAG_MASK_PSW_SHIFT: return MMU_PRIMARY_IDX; case PSW_ASC_SECONDARY >> FLAG_MASK_PSW_SHIFT: @@ -319,7 +323,7 @@ static inline void gen_trap(DisasContext *s) #ifndef CONFIG_USER_ONLY static void check_privileged(DisasContext *s) { - if (s->tb->flags & FLAG_MASK_PSTATE) { + if (s->base.tb->flags & FLAG_MASK_PSTATE) { gen_program_exception(s, PGM_PRIVILEGED); } } @@ -328,7 +332,7 @@ static void check_privileged(DisasContext *s) static TCGv_i64 get_address(DisasContext *s, int x2, int b2, int d2) { TCGv_i64 tmp =3D tcg_temp_new_i64(); - bool need_31 =3D !(s->tb->flags & FLAG_MASK_64); + bool need_31 =3D !(s->base.tb->flags & FLAG_MASK_64); =20 /* Note that d2 is limited to 20 bits, signed. If we crop negative displacements early we create larger immedate addends. */ @@ -541,9 +545,9 @@ static void gen_op_calc_cc(DisasContext *s) =20 static bool use_exit_tb(DisasContext *s) { - return (s->singlestep_enabled || - (tb_cflags(s->tb) & CF_LAST_IO) || - (s->tb->flags & FLAG_MASK_PER)); + return s->base.singlestep_enabled || + (tb_cflags(s->base.tb) & CF_LAST_IO) || + (s->base.tb->flags & FLAG_MASK_PER); } =20 static bool use_goto_tb(DisasContext *s, uint64_t dest) @@ -552,8 +556,8 @@ static bool use_goto_tb(DisasContext *s, uint64_t dest) return false; } #ifndef CONFIG_USER_ONLY - return (dest & TARGET_PAGE_MASK) =3D=3D (s->tb->pc & TARGET_PAGE_MASK)= || - (dest & TARGET_PAGE_MASK) =3D=3D (s->pc & TARGET_PAGE_MASK); + return (dest & TARGET_PAGE_MASK) =3D=3D (s->base.tb->pc & TARGET_PAGE_= MASK) || + (dest & TARGET_PAGE_MASK) =3D=3D (s->base.pc_next & TARGET_PAGE= _MASK); #else return true; #endif @@ -1145,7 +1149,7 @@ static void help_l2_shift(DisasContext *s, DisasField= s *f, =20 static DisasJumpType help_goto_direct(DisasContext *s, uint64_t dest) { - if (dest =3D=3D s->next_pc) { + if (dest =3D=3D s->pc_tmp) { per_branch(s, true); return DISAS_NEXT; } @@ -1154,7 +1158,7 @@ static DisasJumpType help_goto_direct(DisasContext *s= , uint64_t dest) per_breaking_event(s); tcg_gen_goto_tb(0); tcg_gen_movi_i64(psw_addr, dest); - tcg_gen_exit_tb((uintptr_t)s->tb); + tcg_gen_exit_tb((uintptr_t)s->base.tb); return DISAS_GOTO_TB; } else { tcg_gen_movi_i64(psw_addr, dest); @@ -1167,7 +1171,7 @@ static DisasJumpType help_branch(DisasContext *s, Dis= asCompare *c, bool is_imm, int imm, TCGv_i64 cdest) { DisasJumpType ret; - uint64_t dest =3D s->pc + 2 * imm; + uint64_t dest =3D s->base.pc_next + 2 * imm; TCGLabel *lab; =20 /* Take care of the special cases first. */ @@ -1176,7 +1180,7 @@ static DisasJumpType help_branch(DisasContext *s, Dis= asCompare *c, goto egress; } if (is_imm) { - if (dest =3D=3D s->next_pc) { + if (dest =3D=3D s->pc_tmp) { /* Branch to next. */ per_branch(s, true); ret =3D DISAS_NEXT; @@ -1200,7 +1204,7 @@ static DisasJumpType help_branch(DisasContext *s, Dis= asCompare *c, } } =20 - if (use_goto_tb(s, s->next_pc)) { + if (use_goto_tb(s, s->pc_tmp)) { if (is_imm && use_goto_tb(s, dest)) { /* Both exits can use goto_tb. */ update_cc_op(s); @@ -1214,15 +1218,15 @@ static DisasJumpType help_branch(DisasContext *s, D= isasCompare *c, =20 /* Branch not taken. */ tcg_gen_goto_tb(0); - tcg_gen_movi_i64(psw_addr, s->next_pc); - tcg_gen_exit_tb((uintptr_t)s->tb + 0); + tcg_gen_movi_i64(psw_addr, s->pc_tmp); + tcg_gen_exit_tb((uintptr_t)s->base.tb + 0); =20 /* Branch taken. */ gen_set_label(lab); per_breaking_event(s); tcg_gen_goto_tb(1); tcg_gen_movi_i64(psw_addr, dest); - tcg_gen_exit_tb((uintptr_t)s->tb + 1); + tcg_gen_exit_tb((uintptr_t)s->base.tb + 1); =20 ret =3D DISAS_GOTO_TB; } else { @@ -1244,8 +1248,8 @@ static DisasJumpType help_branch(DisasContext *s, Dis= asCompare *c, /* Branch not taken. */ update_cc_op(s); tcg_gen_goto_tb(0); - tcg_gen_movi_i64(psw_addr, s->next_pc); - tcg_gen_exit_tb((uintptr_t)s->tb + 0); + tcg_gen_movi_i64(psw_addr, s->pc_tmp); + tcg_gen_exit_tb((uintptr_t)s->base.tb + 0); =20 gen_set_label(lab); if (is_imm) { @@ -1259,7 +1263,7 @@ static DisasJumpType help_branch(DisasContext *s, Dis= asCompare *c, Most commonly we're single-stepping or some other condition that disables all use of goto_tb. Just update the PC and exit. */ =20 - TCGv_i64 next =3D tcg_const_i64(s->next_pc); + TCGv_i64 next =3D tcg_const_i64(s->pc_tmp); if (is_imm) { cdest =3D tcg_const_i64(dest); } @@ -1448,7 +1452,7 @@ static DisasJumpType op_ni(DisasContext *s, DisasOps = *o) =20 static DisasJumpType op_bas(DisasContext *s, DisasOps *o) { - tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->next_pc)); + tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->pc_tmp)); if (o->in2) { tcg_gen_mov_i64(psw_addr, o->in2); per_branch(s, false); @@ -1460,8 +1464,8 @@ static DisasJumpType op_bas(DisasContext *s, DisasOps= *o) =20 static DisasJumpType op_basi(DisasContext *s, DisasOps *o) { - tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->next_pc)); - return help_goto_direct(s, s->pc + 2 * get_field(s->fields, i2)); + tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->pc_tmp)); + return help_goto_direct(s, s->base.pc_next + 2 * get_field(s->fields, = i2)); } =20 static DisasJumpType op_bc(DisasContext *s, DisasOps *o) @@ -1994,7 +1998,7 @@ static DisasJumpType op_cdsg(DisasContext *s, DisasOp= s *o) addr =3D get_address(s, 0, b2, d2); t_r1 =3D tcg_const_i32(r1); t_r3 =3D tcg_const_i32(r3); - if (tb_cflags(s->tb) & CF_PARALLEL) { + if (tb_cflags(s->base.tb) & CF_PARALLEL) { gen_helper_cdsg_parallel(cpu_env, addr, t_r1, t_r3); } else { gen_helper_cdsg(cpu_env, addr, t_r1, t_r3); @@ -2012,7 +2016,7 @@ static DisasJumpType op_csst(DisasContext *s, DisasOp= s *o) int r3 =3D get_field(s->fields, r3); TCGv_i32 t_r3 =3D tcg_const_i32(r3); =20 - if (tb_cflags(s->tb) & CF_PARALLEL) { + if (tb_cflags(s->base.tb) & CF_PARALLEL) { gen_helper_csst_parallel(cc_op, cpu_env, t_r3, o->in1, o->in2); } else { gen_helper_csst(cc_op, cpu_env, t_r3, o->in1, o->in2); @@ -2972,7 +2976,7 @@ static DisasJumpType op_lpd(DisasContext *s, DisasOps= *o) TCGMemOp mop =3D s->insn->data; =20 /* In a parallel context, stop the world and single step. */ - if (tb_cflags(s->tb) & CF_PARALLEL) { + if (tb_cflags(s->base.tb) & CF_PARALLEL) { update_psw_addr(s); update_cc_op(s); gen_exception(EXCP_ATOMIC); @@ -2994,7 +2998,7 @@ static DisasJumpType op_lpd(DisasContext *s, DisasOps= *o) =20 static DisasJumpType op_lpq(DisasContext *s, DisasOps *o) { - if (tb_cflags(s->tb) & CF_PARALLEL) { + if (tb_cflags(s->base.tb) & CF_PARALLEL) { gen_helper_lpq_parallel(o->out, cpu_env, o->in2); } else { gen_helper_lpq(o->out, cpu_env, o->in2); @@ -3044,7 +3048,7 @@ static DisasJumpType op_mov2e(DisasContext *s, DisasO= ps *o) o->in2 =3D NULL; o->g_in2 =3D false; =20 - switch (s->tb->flags & FLAG_MASK_ASC) { + switch (s->base.tb->flags & FLAG_MASK_ASC) { case PSW_ASC_PRIMARY >> FLAG_MASK_PSW_SHIFT: tcg_gen_movi_i64(ar1, 0); break; @@ -3694,11 +3698,11 @@ static DisasJumpType op_sam(DisasContext *s, DisasO= ps *o) /* Bizarre but true, we check the address of the current insn for the specification exception, not the next to be executed. Thus the PoO documents that Bad Things Happen two bytes before the end. */ - if (s->pc & ~mask) { + if (s->base.pc_next & ~mask) { gen_program_exception(s, PGM_SPECIFICATION); return DISAS_NORETURN; } - s->next_pc &=3D mask; + s->pc_tmp &=3D mask; =20 tsam =3D tcg_const_i64(sam); tcg_gen_deposit_i64(psw_mask, psw_mask, tsam, 31, 2); @@ -4411,7 +4415,7 @@ static DisasJumpType op_stmh(DisasContext *s, DisasOp= s *o) =20 static DisasJumpType op_stpq(DisasContext *s, DisasOps *o) { - if (tb_cflags(s->tb) & CF_PARALLEL) { + if (tb_cflags(s->base.tb) & CF_PARALLEL) { gen_helper_stpq_parallel(cpu_env, o->in2, o->out2, o->out); } else { gen_helper_stpq(cpu_env, o->in2, o->out2, o->out); @@ -4500,8 +4504,8 @@ static DisasJumpType op_tam(DisasContext *s, DisasOps= *o) { int cc =3D 0; =20 - cc |=3D (s->tb->flags & FLAG_MASK_64) ? 2 : 0; - cc |=3D (s->tb->flags & FLAG_MASK_32) ? 1 : 0; + cc |=3D (s->base.tb->flags & FLAG_MASK_64) ? 2 : 0; + cc |=3D (s->base.tb->flags & FLAG_MASK_32) ? 1 : 0; gen_op_movi_cc(s, cc); return DISAS_NEXT; } @@ -5625,7 +5629,7 @@ static void in2_a2(DisasContext *s, DisasFields *f, D= isasOps *o) =20 static void in2_ri2(DisasContext *s, DisasFields *f, DisasOps *o) { - o->in2 =3D tcg_const_i64(s->pc + (int64_t)get_field(f, i2) * 2); + o->in2 =3D tcg_const_i64(s->base.pc_next + (int64_t)get_field(f, i2) *= 2); } #define SPEC_in2_ri2 0 =20 @@ -5926,7 +5930,7 @@ static void extract_field(DisasFields *o, const Disas= Field *f, uint64_t insn) static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s, DisasFields *f) { - uint64_t insn, pc =3D s->pc; + uint64_t insn, pc =3D s->base.pc_next; int op, op2, ilen; const DisasInsn *info; =20 @@ -5958,7 +5962,7 @@ static const DisasInsn *extract_insn(CPUS390XState *e= nv, DisasContext *s, g_assert_not_reached(); } } - s->next_pc =3D s->pc + ilen; + s->pc_tmp =3D s->base.pc_next + ilen; s->ilen =3D ilen; =20 /* We can't actually determine the insn format until we've looked up @@ -6043,8 +6047,8 @@ static DisasJumpType translate_one(CPUS390XState *env= , DisasContext *s) } =20 #ifndef CONFIG_USER_ONLY - if (s->tb->flags & FLAG_MASK_PER) { - TCGv_i64 addr =3D tcg_const_i64(s->pc); + if (s->base.tb->flags & FLAG_MASK_PER) { + TCGv_i64 addr =3D tcg_const_i64(s->base.pc_next); gen_helper_per_ifetch(cpu_env, addr); tcg_temp_free_i64(addr); } @@ -6138,10 +6142,10 @@ static DisasJumpType translate_one(CPUS390XState *e= nv, DisasContext *s) } =20 #ifndef CONFIG_USER_ONLY - if (s->tb->flags & FLAG_MASK_PER) { + if (s->base.tb->flags & FLAG_MASK_PER) { /* An exception might be triggered, save PSW if not already done. = */ if (ret =3D=3D DISAS_NEXT || ret =3D=3D DISAS_PC_STALE) { - tcg_gen_movi_i64(psw_addr, s->next_pc); + tcg_gen_movi_i64(psw_addr, s->pc_tmp); } =20 /* Call the helper to check for a possible PER exception. */ @@ -6150,7 +6154,7 @@ static DisasJumpType translate_one(CPUS390XState *env= , DisasContext *s) #endif =20 /* Advance to the next instruction. */ - s->pc =3D s->next_pc; + s->base.pc_next =3D s->pc_tmp; return ret; } =20 @@ -6158,26 +6162,25 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) { CPUS390XState *env =3D cs->env_ptr; DisasContext dc; - target_ulong pc_start; uint64_t next_page_start; int num_insns, max_insns; DisasJumpType status; bool do_debug; =20 - pc_start =3D tb->pc; - + dc.base.pc_first =3D tb->pc; /* 31-bit mode */ if (!(tb->flags & FLAG_MASK_64)) { - pc_start &=3D 0x7fffffff; + dc.base.pc_first &=3D 0x7fffffff; } + dc.base.pc_next =3D dc.base.pc_first; + dc.base.tb =3D tb; + dc.base.singlestep_enabled =3D cs->singlestep_enabled; =20 - dc.tb =3D tb; - dc.pc =3D pc_start; dc.cc_op =3D CC_OP_DYNAMIC; - dc.ex_value =3D tb->cs_base; - do_debug =3D dc.singlestep_enabled =3D cs->singlestep_enabled; + dc.ex_value =3D dc.base.tb->cs_base; + do_debug =3D cs->singlestep_enabled; =20 - next_page_start =3D (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; + next_page_start =3D (dc.base.pc_first & TARGET_PAGE_MASK) + TARGET_PAG= E_SIZE; =20 num_insns =3D 0; max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; @@ -6191,17 +6194,17 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) gen_tb_start(tb); =20 do { - tcg_gen_insn_start(dc.pc, dc.cc_op); + tcg_gen_insn_start(dc.base.pc_next, dc.cc_op); num_insns++; =20 - if (unlikely(cpu_breakpoint_test(cs, dc.pc, BP_ANY))) { + if (unlikely(cpu_breakpoint_test(cs, dc.base.pc_next, BP_ANY))) { status =3D DISAS_PC_STALE; do_debug =3D true; /* 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 2; + dc.base.pc_next +=3D 2; break; } =20 @@ -6214,11 +6217,11 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) /* If we reach a page boundary, are single stepping, or exhaust instruction count, stop generation. */ if (status =3D=3D DISAS_NEXT - && (dc.pc >=3D next_page_start + && (dc.base.pc_next >=3D next_page_start || tcg_op_buf_full() || num_insns >=3D max_insns || singlestep - || cs->singlestep_enabled + || dc.base.singlestep_enabled || dc.ex_value)) { status =3D DISAS_TOO_MANY; } @@ -6258,19 +6261,20 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) =20 gen_tb_end(tb, num_insns); =20 - tb->size =3D dc.pc - pc_start; + tb->size =3D dc.base.pc_next - dc.base.pc_first; tb->icount =3D num_insns; =20 #if defined(S390X_DEBUG_DISAS) if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { + && qemu_log_in_addr_range(dc.base.pc_first)) { qemu_log_lock(); if (unlikely(dc.ex_value)) { /* ??? Unfortunately log_target_disas can't use host memory. = */ qemu_log("IN: EXECUTE %016" PRIx64 "\n", dc.ex_value); } else { - qemu_log("IN: %s\n", lookup_symbol(pc_start)); - log_target_disas(cs, pc_start, dc.pc - pc_start); + qemu_log("IN: %s\n", lookup_symbol(dc.base.pc_first)); + log_target_disas(cs, dc.base.pc_first, + dc.base.pc_next - dc.base.pc_first); qemu_log("\n"); } qemu_log_unlock(); --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039475815967.3852370421183; Fri, 6 Apr 2018 11:31:15 -0700 (PDT) Received: from localhost ([::1]:45452 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W8m-0004lc-U3 for importer@patchew.org; Fri, 06 Apr 2018 14:31:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48667) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy7-0003lI-3U for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy3-0000TS-Ik for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:11 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:33777) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy3-0000Sz-EY; Fri, 06 Apr 2018 14:20:07 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 20F9720CBC; Fri, 6 Apr 2018 14:20:07 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) 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 D09F1E4437; Fri, 6 Apr 2018 14:20:06 -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=M0BXtl5Cj/22x+ GwDrUoWwrA31uoJQ/G2vEXUErZ9EQ=; b=tYHQ/S2rqmHr9PKHGZPDaIphtBdqFH xidDlSaCW0ZRcdFJaZ3sZsQzdIStGmpZagMXj386tuBlMBYep/mAsU50ipH5y+Gi x4D+h4NMv2w9ut8AY9tCgbW1B34GfhjVGmwiRGQU0PVQjZHQN4rzYCluT2Z9Ttpo nP57l/d6korrE= 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=M0BXtl5Cj/22x+GwDrUoWwrA31uoJQ/G2vEXUErZ9EQ=; b=LszHMhn4 VuNFvmvt6SD3dldfjwxDOpqQFVu8Ybitnrq/Qa5BQzBPR4UhL6tC7AWdFykdDwby aaXxcLFfpOmdBRBCsJsIgy7unb9mXNxmw4Jo2mPzQLh1fK7A5yYb8u7BscyL5E66 ozgZKuFQiTaYXD78QUJssiUZ9pe/Pv3avukdZUz1oznq+48P656U3fyY07xZZmL6 8YnMmgaOvkMFE5pECFUCrQUsntPScoBEKx1rIoyh0W2aagwMtrHg0XZq+PAuowYz 8yN5F2pT5yKra6lAI6CM/qkZ/o06xz4jxxI/KEXUrfaOszQwR8MAugid5VO+9A8Q D/IfMD+HAWbGiw== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:55 -0400 Message-Id: <1523038800-2494-13-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 12/17] target/s390x: convert to TranslatorOps 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: qemu-s390x@nongnu.org, Cornelia Huck , Richard Henderson , Alexander Graf , David Hildenbrand 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" Note: I looked into dropping dc->do_debug. However, I don't see an easy way to do it given that TOO_MANY is also valid when we just translate more than max_insns. Thus, the check for do_debug in "case DISAS_PC_CC_UPDATED" would still need additional state to know whether or not we came from breakpoint_check. Acked-by: Cornelia Huck Reviewed-by: David Hildenbrand Tested-by: David Hildenbrand Cc: David Hildenbrand Cc: Cornelia Huck Cc: Alexander Graf Cc: qemu-s390x@nongnu.org Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/s390x/translate.c | 162 +++++++++++++++++++++++--------------------= ---- 1 file changed, 80 insertions(+), 82 deletions(-) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index a65e9cd..2cbd870 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -64,6 +64,7 @@ struct DisasContext { uint64_t pc_tmp; uint32_t ilen; enum cc_op cc_op; + bool do_debug; }; =20 /* Information carried about a condition to be evaluated. */ @@ -6158,98 +6159,87 @@ static DisasJumpType translate_one(CPUS390XState *e= nv, DisasContext *s) return ret; } =20 -void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +static void s390x_tr_init_disas_context(DisasContextBase *dcbase, CPUState= *cs) { - CPUS390XState *env =3D cs->env_ptr; - DisasContext dc; - uint64_t next_page_start; - int num_insns, max_insns; - DisasJumpType status; - bool do_debug; + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - dc.base.pc_first =3D tb->pc; /* 31-bit mode */ - if (!(tb->flags & FLAG_MASK_64)) { - dc.base.pc_first &=3D 0x7fffffff; + if (!(dc->base.tb->flags & FLAG_MASK_64)) { + dc->base.pc_first &=3D 0x7fffffff; + dc->base.pc_next =3D dc->base.pc_first; } - dc.base.pc_next =3D dc.base.pc_first; - dc.base.tb =3D tb; - dc.base.singlestep_enabled =3D cs->singlestep_enabled; =20 - dc.cc_op =3D CC_OP_DYNAMIC; - dc.ex_value =3D dc.base.tb->cs_base; - do_debug =3D cs->singlestep_enabled; + dc->cc_op =3D CC_OP_DYNAMIC; + dc->ex_value =3D dc->base.tb->cs_base; + dc->do_debug =3D dc->base.singlestep_enabled; +} =20 - next_page_start =3D (dc.base.pc_first & TARGET_PAGE_MASK) + TARGET_PAG= E_SIZE; +static void s390x_tr_tb_start(DisasContextBase *db, CPUState *cs) +{ +} =20 - num_insns =3D 0; - max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; - } +static void s390x_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - gen_tb_start(tb); + tcg_gen_insn_start(dc->base.pc_next, dc->cc_op); +} =20 - do { - tcg_gen_insn_start(dc.base.pc_next, dc.cc_op); - num_insns++; +static bool s390x_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *= cs, + const CPUBreakpoint *bp) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - if (unlikely(cpu_breakpoint_test(cs, dc.base.pc_next, BP_ANY))) { - status =3D DISAS_PC_STALE; - do_debug =3D true; - /* 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.base.pc_next +=3D 2; - break; - } + dc->base.is_jmp =3D DISAS_PC_STALE; + dc->do_debug =3D true; + /* 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 does the right thing. */ + dc->base.pc_next +=3D 2; + return true; +} =20 - if (num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAST_IO)) { - gen_io_start(); - } +static void s390x_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) +{ + CPUS390XState *env =3D cs->env_ptr; + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - status =3D translate_one(env, &dc); - - /* If we reach a page boundary, are single stepping, - or exhaust instruction count, stop generation. */ - if (status =3D=3D DISAS_NEXT - && (dc.base.pc_next >=3D next_page_start - || tcg_op_buf_full() - || num_insns >=3D max_insns - || singlestep - || dc.base.singlestep_enabled - || dc.ex_value)) { - status =3D DISAS_TOO_MANY; - } - } while (status =3D=3D DISAS_NEXT); + dc->base.is_jmp =3D translate_one(env, dc); + if (dc->base.is_jmp =3D=3D DISAS_NEXT) { + uint64_t next_page; =20 - if (tb_cflags(tb) & CF_LAST_IO) { - gen_io_end(); + next_page =3D (dc->base.pc_first & TARGET_PAGE_MASK) + TARGET_PAGE= _SIZE; + if (dc->base.pc_next >=3D next_page || dc->ex_value) { + dc->base.is_jmp =3D DISAS_TOO_MANY; + } } +} + +static void s390x_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - switch (status) { + switch (dc->base.is_jmp) { case DISAS_GOTO_TB: case DISAS_NORETURN: break; case DISAS_TOO_MANY: case DISAS_PC_STALE: case DISAS_PC_STALE_NOCHAIN: - update_psw_addr(&dc); + update_psw_addr(dc); /* FALLTHRU */ case DISAS_PC_UPDATED: /* Next TB starts off with CC_OP_DYNAMIC, so make sure the cc op type is in env */ - update_cc_op(&dc); + update_cc_op(dc); /* FALLTHRU */ case DISAS_PC_CC_UPDATED: /* Exit the TB, either by raising a debug exception or by return. = */ - if (do_debug) { + if (dc->do_debug) { gen_exception(EXCP_DEBUG); - } else if (use_exit_tb(&dc) || status =3D=3D DISAS_PC_STALE_NOCHAI= N) { + } else if (use_exit_tb(dc) || + dc->base.is_jmp =3D=3D DISAS_PC_STALE_NOCHAIN) { tcg_gen_exit_tb(0); } else { tcg_gen_lookup_and_goto_ptr(); @@ -6258,28 +6248,36 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) default: g_assert_not_reached(); } +} =20 - gen_tb_end(tb, num_insns); - - tb->size =3D dc.base.pc_next - dc.base.pc_first; - tb->icount =3D num_insns; +static void s390x_tr_disas_log(const DisasContextBase *dcbase, CPUState *c= s) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 -#if defined(S390X_DEBUG_DISAS) - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(dc.base.pc_first)) { - qemu_log_lock(); - if (unlikely(dc.ex_value)) { - /* ??? Unfortunately log_target_disas can't use host memory. = */ - qemu_log("IN: EXECUTE %016" PRIx64 "\n", dc.ex_value); - } else { - qemu_log("IN: %s\n", lookup_symbol(dc.base.pc_first)); - log_target_disas(cs, dc.base.pc_first, - dc.base.pc_next - dc.base.pc_first); - qemu_log("\n"); - } - qemu_log_unlock(); + if (unlikely(dc->ex_value)) { + /* ??? Unfortunately log_target_disas can't use host memory. */ + qemu_log("IN: EXECUTE %016" PRIx64, dc->ex_value); + } else { + qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first)); + log_target_disas(cs, dc->base.pc_first, dc->base.tb->size); } -#endif +} + +static const TranslatorOps s390x_tr_ops =3D { + .init_disas_context =3D s390x_tr_init_disas_context, + .tb_start =3D s390x_tr_tb_start, + .insn_start =3D s390x_tr_insn_start, + .breakpoint_check =3D s390x_tr_breakpoint_check, + .translate_insn =3D s390x_tr_translate_insn, + .tb_stop =3D s390x_tr_tb_stop, + .disas_log =3D s390x_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +{ + DisasContext dc; + + translator_loop(&s390x_tr_ops, &dc.base, cs, tb); } =20 void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb, --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039461140314.17970878655274; Fri, 6 Apr 2018 11:31:01 -0700 (PDT) Received: from localhost ([::1]:45451 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W8a-0004Zp-1e for importer@patchew.org; Fri, 06 Apr 2018 14:31:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48691) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy7-0003lQ-Ql for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy3-0000Tf-Pb for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:11 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:55939) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy3-0000TI-L5 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:07 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 5DB5A20F6A; 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 0EC4E1025C; 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=XTbbUfdxMsawfQ pRz1Ud9tceVWyXOi3z4BQI8UU3Kd0=; b=WufyMt01T1G06VplK2Wm48iNBmlcR9 XhWoPEuotb+vZcYPXCy98A/TY7QAD835puaoQHuxNIwcI6hOyaDRv+YjCrEHUH9s lPnZ1G+P4y/5JIYS9Z55CKmJd6eD0ekANB7ZQBStNZ2XHNYzU1KcCUxmKGH5k+KA /AcwVWdgdbATQ= 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=mZj2wwAz NnO1iB0vSqdfi2N01xo54u3zi0yQdFZ+dm1Cb1EZQH3eQOWABecQf9bug68Dcgcx 9/3ohjLnNCIm7cWwdTaSL4zKR2//jzEvCZiNP13yOI9hKBOUNnpQPybShXvK6TVZ KzhbUeimjBAWU/DwruoNSe9ma/IboftxXK+U4jdd2qymx9XWQsYiaefIQirq4GrQ Yxu3fC/nWMB9R5sgWiUHTCztqHVv5EIZKk2KYVubAd6LAh10sSCZH8UPDPRwSXh+ 1OAEOEN6CaKKGQBGZHnVE8zf3XWYVO/GT5UYGSyhhWvopncT0Geg3v7+tPoDKf0I yd1d6Ldf826JCw== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:56 -0400 Message-Id: <1523038800-2494-14-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 13/17] 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 Reviewed-by: Richard Henderson --- 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 From nobody Tue May 7 23:22:28 2024 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 1523039297371455.4085735392789; Fri, 6 Apr 2018 11:28:17 -0700 (PDT) Received: from localhost ([::1]:45425 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W5t-0001vw-5w for importer@patchew.org; Fri, 06 Apr 2018 14:28:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48671) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy7-0003lJ-86 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-0000Tx-1G for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:11 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:33097) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy3-0000Tb-Rs for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:07 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 8DD1C20F77; Fri, 6 Apr 2018 14:20:07 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) 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 47D99E4437; 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=eTdBqk8B7fhwDB jkkjwG980xSdPLh5eiGGGz8JWctNU=; b=AE27hzDynCxsJmoilf8nnY1alC4CM8 Mn6+AU4OfgjTdvw8NmRXs4fGuFqQ5xEavpRLO8QHtk5U71isCwuGvtZ0v5iIqxMd uyvB24xoE03rtIgFUbph3idi62uchRd5LCeXRGcaAoGF3PvbRwQ3nrHDJNpFeiB+ a7Jxxb9LgNSdQ= 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=eTdBqk8B7fhwDBjkkjwG980xSdPLh5eiGGGz8JWctNU=; b=j9G9I5Dg ZZofDIIa/icg67yy3jG//fAoMba+GPMPNgcTKWcfOqNs02DLKQKNsNVJEmOXdoep iS9IipMA9EIXerQ6h1u6RRSQq3NZd9qrmcKRw3tN42Zh03ELxGmdVgldzkx5ExBK agZiFy7dwK6xPPFAUAG6advmqCYJfTrzqStLgJAj91xS2obtpmd785uaRNwyQDoq DcnJK/9Ku24yiZM2QuJZsB6PGRo3EJYbsrpD4DiMXkKPDwqZTOsB6V+8Qn2bZlcr yLRBmIphWioCTDq9H+1dgFkPDp9tb8tgDGgK7oPVVp6zEidAMlNkkk3/ggdpN0Vb +uRbEszLDKGG/w== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:57 -0400 Message-Id: <1523038800-2494-15-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 14/17] target/openrisc: convert to TranslatorOps 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" Notes: - Changed the num_insns test in insn_start to check for dc->base.num_insns > 1, since when tb_start is first called in a TB, base.num_insns is already set to 1. - Removed DISAS_NEXT from the switch in tb_stop; use DISAS_TOO_MANY instead. - Added an assert_not_reached on tb_stop for DISAS_NEXT and the default case. - Merged the two separate log_target_disas calls into the disas_log op. Cc: Stafford Horne Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/openrisc/translate.c | 163 +++++++++++++++++++++-------------------= ---- 1 file changed, 79 insertions(+), 84 deletions(-) diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c index b37414f..7cf29cd 100644 --- a/target/openrisc/translate.c +++ b/target/openrisc/translate.c @@ -1520,46 +1520,22 @@ static void disas_openrisc_insn(DisasContext *dc, O= penRISCCPU *cpu) } } =20 -void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +static void openrisc_tr_init_disas_context(DisasContextBase *dcb, CPUState= *cs) { + DisasContext *dc =3D container_of(dcb, DisasContext, base); CPUOpenRISCState *env =3D cs->env_ptr; - OpenRISCCPU *cpu =3D openrisc_env_get_cpu(env); - struct DisasContext ctx, *dc =3D &ctx; - uint32_t pc_start; - uint32_t next_page_start; - int num_insns; - int max_insns; - - pc_start =3D tb->pc; - - 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; + int bound; =20 - dc->mem_idx =3D cpu_mmu_index(&cpu->env, false); + dc->mem_idx =3D cpu_mmu_index(env, false); dc->tb_flags =3D dc->base.tb->flags; dc->delayed_branch =3D (dc->tb_flags & TB_FLAGS_DFLAG) !=3D 0; + bound =3D -(dc->base.pc_first | TARGET_PAGE_MASK) / 4; + dc->base.max_insns =3D MIN(dc->base.max_insns, bound); +} =20 - next_page_start =3D (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; - num_insns =3D 0; - max_insns =3D tb_cflags(tb) & CF_COUNT_MASK; - - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; - } - - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { - qemu_log_lock(); - qemu_log("----------------\n"); - qemu_log("IN: %s\n", lookup_symbol(pc_start)); - } - - gen_tb_start(tb); +static void openrisc_tr_tb_start(DisasContextBase *db, CPUState *cs) +{ + DisasContext *dc =3D container_of(db, DisasContext, base); =20 /* Allow the TCG optimizer to see that R0 =3D=3D 0, when it's true, which is the common case. */ @@ -1568,50 +1544,55 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) } else { cpu_R[0] =3D cpu_R0; } +} =20 - do { - tcg_gen_insn_start(dc->base.pc_next, (dc->delayed_branch ? 1 : 0) - | (num_insns ? 2 : 0)); - num_insns++; +static void openrisc_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 - 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->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->base.pc_next +=3D 4; - break; - } + tcg_gen_insn_start(dc->base.pc_next, (dc->delayed_branch ? 1 : 0) + | (dc->base.num_insns > 1 ? 2 : 0)); +} =20 - if (num_insns =3D=3D max_insns && (tb_cflags(tb) & CF_LAST_IO)) { - gen_io_start(); - } - disas_openrisc_insn(dc, cpu); - dc->base.pc_next +=3D 4; - - /* delay slot */ - if (dc->delayed_branch) { - dc->delayed_branch--; - if (!dc->delayed_branch) { - tcg_gen_mov_tl(cpu_pc, jmp_pc); - tcg_gen_discard_tl(jmp_pc); - dc->base.is_jmp =3D DISAS_UPDATE; - break; - } +static bool openrisc_tr_breakpoint_check(DisasContextBase *dcbase, CPUStat= e *cs, + const CPUBreakpoint *bp) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); + + tcg_gen_movi_tl(cpu_pc, dc->base.pc_next); + gen_exception(dc, EXCP_DEBUG); + 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->base.pc_next +=3D 4; + return true; +} + +static void openrisc_tr_translate_insn(DisasContextBase *dcbase, CPUState = *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); + OpenRISCCPU *cpu =3D OPENRISC_CPU(cs); + + disas_openrisc_insn(dc, cpu); + dc->base.pc_next +=3D 4; + + /* delay slot */ + if (dc->delayed_branch) { + dc->delayed_branch--; + if (!dc->delayed_branch) { + tcg_gen_mov_tl(cpu_pc, jmp_pc); + tcg_gen_discard_tl(jmp_pc); + dc->base.is_jmp =3D DISAS_UPDATE; + return; } - } while (!dc->base.is_jmp - && !tcg_op_buf_full() - && !dc->base.singlestep_enabled - && !singlestep - && (dc->base.pc_next < next_page_start) - && num_insns < max_insns); - - if (tb_cflags(tb) & CF_LAST_IO) { - gen_io_end(); } +} + +static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) +{ + DisasContext *dc =3D container_of(dcbase, DisasContext, base); =20 if ((dc->tb_flags & TB_FLAGS_DFLAG ? 1 : 0) !=3D (dc->delayed_branch != =3D 0)) { tcg_gen_movi_i32(cpu_dflag, dc->delayed_branch !=3D 0); @@ -1626,10 +1607,9 @@ void gen_intermediate_code(CPUState *cs, struct Tran= slationBlock *tb) gen_exception(dc, EXCP_DEBUG); } else { switch (dc->base.is_jmp) { - case DISAS_NEXT: + case DISAS_TOO_MANY: gen_goto_tb(dc, 0, dc->base.pc_next); break; - default: case DISAS_NORETURN: case DISAS_JUMP: case DISAS_TB_JUMP: @@ -1639,20 +1619,35 @@ void gen_intermediate_code(CPUState *cs, struct Tra= nslationBlock *tb) to find the next TB */ tcg_gen_exit_tb(0); break; + default: + g_assert_not_reached(); } } +} =20 - gen_tb_end(tb, num_insns); +static void openrisc_tr_disas_log(const DisasContextBase *dcbase, CPUState= *cs) +{ + DisasContext *s =3D container_of(dcbase, DisasContext, base); =20 - tb->size =3D dc->base.pc_next - pc_start; - tb->icount =3D num_insns; + qemu_log("IN: %s\n", lookup_symbol(s->base.pc_first)); + log_target_disas(cs, s->base.pc_first, s->base.tb->size); +} =20 - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { - log_target_disas(cs, pc_start, tb->size); - qemu_log("\n"); - qemu_log_unlock(); - } +static const TranslatorOps openrisc_tr_ops =3D { + .init_disas_context =3D openrisc_tr_init_disas_context, + .tb_start =3D openrisc_tr_tb_start, + .insn_start =3D openrisc_tr_insn_start, + .breakpoint_check =3D openrisc_tr_breakpoint_check, + .translate_insn =3D openrisc_tr_translate_insn, + .tb_stop =3D openrisc_tr_tb_stop, + .disas_log =3D openrisc_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) +{ + DisasContext ctx; + + translator_loop(&openrisc_tr_ops, &ctx.base, cs, tb); } =20 void openrisc_cpu_dump_state(CPUState *cs, FILE *f, --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 From nobody Tue May 7 23:22:28 2024 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 1523039305353330.784671694916; Fri, 6 Apr 2018 11:28:25 -0700 (PDT) Received: from localhost ([::1]:45427 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W61-00023b-0c for importer@patchew.org; Fri, 06 Apr 2018 14:28:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4VyA-0003ni-8V for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy4-0000UY-I0 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:14 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:60679) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy4-0000U3-Ar 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 054E620E54; Fri, 6 Apr 2018 14:20:08 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:08 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id B25E7E43C8; 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=/VUeE0LV+7LQZ5 gEJ8oFMd8aG7KOjzHJNuwqLwXEtEo=; b=NEhFejit/wEQnKxhRsweGkkL12JZPP grcUoNNzBoqUn1GucJdc4rDV5Kq2JaHzB/GqLg7Pz/uZ5hBAR/7xUKVOL48GwT+e /7A6+3WwklLV9ZHglUuSeG9UhAb6hyngjoE/dMfFuXjLIwdrKnuE9LHBnA4hhDnA Qb88H85ltXSVU= 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=/VUeE0LV+7LQZ5gEJ8oFMd8aG7KOjzHJNuwqLwXEtEo=; b=ib+MPoJT K2xuchwVtO9ImzVyG/NIObY6oWLRwUCiodLgSUCb0rGmeblwmi+v/9Xa+lhTW8X3 T160p4QdmToiC+DGJPR1oCYuRphdzoqxp8frvYCQQWZIW9va9TzK2cFHeNBMRJtS DlCylVAx4pe8cVTl7ozkWS8nod6OW9cXYrX7dWNcVj3P558j5CHculxrHbHUyEL5 bk/yH+vgpLUjFt32oOHeDL4TNj+2JmM1ykrByAZvBEJ0/BpjAdlYwEPThoLg29YY 6uAnwtF/kBiS4uZWwvj06deW6c4/mqjHx5gq+0z+Y8c35pI0dKXkGLvnFMsgkJBU SW7KMam+FCg+CA== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:19:59 -0400 Message-Id: <1523038800-2494-17-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 16/17] target/riscv: 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: 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" Notes: - Did not convert {num,max}_insns, since the corresponding code will go away in the next patch. - ctx->pc becomes ctx->base.pc_next, and ctx->next_pc becomes ctx->pc_tmp. While at it, convert the remaining tb->cflags readers to tb_cflags(). Cc: Michael Clark Cc: Palmer Dabbelt Cc: Sagar Karandikar Cc: Bastian Koppelmann Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson --- target/riscv/translate.c | 129 +++++++++++++++++++++++--------------------= ---- 1 file changed, 64 insertions(+), 65 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index a5c25ab..c619a14 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -40,14 +40,12 @@ static TCGv load_val; #include "exec/gen-icount.h" =20 typedef struct DisasContext { - struct TranslationBlock *tb; - target_ulong pc; - target_ulong next_pc; + DisasContextBase base; + /* pc_tmp points to the pc of the instruction following base.pc_next */ + target_ulong pc_tmp; uint32_t opcode; uint32_t flags; uint32_t mem_idx; - int singlestep_enabled; - 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 @@ -78,21 +76,21 @@ static const int tcg_memop_lookup[8] =3D { =20 static void generate_exception(DisasContext *ctx, int excp) { - tcg_gen_movi_tl(cpu_pc, ctx->pc); + tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); TCGv_i32 helper_tmp =3D tcg_const_i32(excp); gen_helper_raise_exception(cpu_env, helper_tmp); tcg_temp_free_i32(helper_tmp); - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; } =20 static void generate_exception_mbadaddr(DisasContext *ctx, int excp) { - tcg_gen_movi_tl(cpu_pc, ctx->pc); + tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); tcg_gen_st_tl(cpu_pc, cpu_env, offsetof(CPURISCVState, badaddr)); TCGv_i32 helper_tmp =3D tcg_const_i32(excp); gen_helper_raise_exception(cpu_env, helper_tmp); tcg_temp_free_i32(helper_tmp); - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; } =20 static void gen_exception_debug(void) @@ -114,12 +112,12 @@ static void gen_exception_inst_addr_mis(DisasContext = *ctx) =20 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest) { - if (unlikely(ctx->singlestep_enabled)) { + if (unlikely(ctx->base.singlestep_enabled)) { return false; } =20 #ifndef CONFIG_USER_ONLY - return (ctx->tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAGE_MAS= K); + return (ctx->base.tb->pc & TARGET_PAGE_MASK) =3D=3D (dest & TARGET_PAG= E_MASK); #else return true; #endif @@ -131,10 +129,10 @@ static void gen_goto_tb(DisasContext *ctx, int n, tar= get_ulong dest) /* chaining is only allowed when the jump is to the same page */ tcg_gen_goto_tb(n); tcg_gen_movi_tl(cpu_pc, dest); - tcg_gen_exit_tb((uintptr_t)ctx->tb + n); + tcg_gen_exit_tb((uintptr_t)ctx->base.tb + n); } else { tcg_gen_movi_tl(cpu_pc, dest); - if (ctx->singlestep_enabled) { + if (ctx->base.singlestep_enabled) { gen_exception_debug(); } else { tcg_gen_exit_tb(0); @@ -514,7 +512,7 @@ static void gen_jal(CPURISCVState *env, DisasContext *c= tx, int rd, target_ulong next_pc; =20 /* check misaligned: */ - next_pc =3D ctx->pc + imm; + next_pc =3D ctx->base.pc_next + imm; if (!riscv_has_ext(env, RVC)) { if ((next_pc & 0x3) !=3D 0) { gen_exception_inst_addr_mis(ctx); @@ -522,11 +520,11 @@ static void gen_jal(CPURISCVState *env, DisasContext = *ctx, int rd, } } if (rd !=3D 0) { - tcg_gen_movi_tl(cpu_gpr[rd], ctx->next_pc); + tcg_gen_movi_tl(cpu_gpr[rd], ctx->pc_tmp); } =20 - gen_goto_tb(ctx, 0, ctx->pc + imm); /* must use this for safety */ - ctx->is_jmp =3D DISAS_NORETURN; + gen_goto_tb(ctx, 0, ctx->base.pc_next + imm); /* must use this for saf= ety */ + ctx->base.is_jmp =3D DISAS_NORETURN; } =20 static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, @@ -549,7 +547,7 @@ static void gen_jalr(CPURISCVState *env, DisasContext *= ctx, uint32_t opc, } =20 if (rd !=3D 0) { - tcg_gen_movi_tl(cpu_gpr[rd], ctx->next_pc); + tcg_gen_movi_tl(cpu_gpr[rd], ctx->pc_tmp); } tcg_gen_exit_tb(0); =20 @@ -557,7 +555,7 @@ static void gen_jalr(CPURISCVState *env, DisasContext *= ctx, uint32_t opc, gen_set_label(misaligned); gen_exception_inst_addr_mis(ctx); } - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; break; =20 default: @@ -603,15 +601,15 @@ static void gen_branch(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, tcg_temp_free(source1); tcg_temp_free(source2); =20 - gen_goto_tb(ctx, 1, ctx->next_pc); + gen_goto_tb(ctx, 1, ctx->pc_tmp); gen_set_label(l); /* branch taken */ - if (!riscv_has_ext(env, RVC) && ((ctx->pc + bimm) & 0x3)) { + if (!riscv_has_ext(env, RVC) && ((ctx->base.pc_next + bimm) & 0x3)) { /* misaligned */ gen_exception_inst_addr_mis(ctx); } else { - gen_goto_tb(ctx, 0, ctx->pc + bimm); + gen_goto_tb(ctx, 0, ctx->base.pc_next + bimm); } - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; } =20 static void gen_load(DisasContext *ctx, uint32_t opc, int rd, int rs1, @@ -837,7 +835,7 @@ static void gen_atomic(DisasContext *ctx, uint32_t opc, if (rl) { tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); } - if (tb_cflags(ctx->tb) & CF_PARALLEL) { + if (tb_cflags(ctx->base.tb) & CF_PARALLEL) { l1 =3D gen_new_label(); gen_set_label(l1); } else { @@ -854,7 +852,7 @@ static void gen_atomic(DisasContext *ctx, uint32_t opc, tcg_gen_qemu_ld_tl(dat, src1, ctx->mem_idx, mop); tcg_gen_movcond_tl(cond, src2, dat, src2, dat, src2); =20 - if (tb_cflags(ctx->tb) & CF_PARALLEL) { + if (tb_cflags(ctx->base.tb) & CF_PARALLEL) { /* Parallel context. Make this operation atomic by verifying that the memory didn't change while we computed the result.= */ tcg_gen_atomic_cmpxchg_tl(src2, src1, dat, src2, ctx->mem_idx,= mop); @@ -1318,7 +1316,7 @@ static void gen_system(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, rs1_pass =3D tcg_temp_new(); imm_rs1 =3D tcg_temp_new(); gen_get_gpr(source1, rs1); - tcg_gen_movi_tl(cpu_pc, ctx->pc); + tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); tcg_gen_movi_tl(rs1_pass, rs1); tcg_gen_movi_tl(csr_store, csr); /* copy into temp reg to feed to help= er */ =20 @@ -1339,12 +1337,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->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; break; case 0x1: /* EBREAK */ generate_exception(ctx, RISCV_EXCP_BREAKPOINT); tcg_gen_exit_tb(0); /* no chaining */ - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; break; #ifndef CONFIG_USER_ONLY case 0x002: /* URET */ @@ -1354,7 +1352,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->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; } else { gen_exception_illegal(ctx); } @@ -1365,13 +1363,13 @@ static void gen_system(CPURISCVState *env, DisasCon= text *ctx, uint32_t opc, case 0x302: /* MRET */ gen_helper_mret(cpu_pc, cpu_env, cpu_pc); tcg_gen_exit_tb(0); /* no chaining */ - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; break; case 0x7b2: /* DRET */ gen_exception_illegal(ctx); break; case 0x105: /* WFI */ - tcg_gen_movi_tl(cpu_pc, ctx->next_pc); + tcg_gen_movi_tl(cpu_pc, ctx->pc_tmp); gen_helper_wfi(cpu_env); break; case 0x104: /* SFENCE.VM */ @@ -1410,9 +1408,9 @@ static void gen_system(CPURISCVState *env, DisasConte= xt *ctx, uint32_t opc, } gen_set_gpr(rd, dest); /* 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_movi_tl(cpu_pc, ctx->pc_tmp); tcg_gen_exit_tb(0); /* no chaining */ - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; break; } tcg_temp_free(source1); @@ -1730,7 +1728,7 @@ static void decode_RV32_64G(CPURISCVState *env, Disas= Context *ctx) break; /* NOP */ } tcg_gen_movi_tl(cpu_gpr[rd], (sextract64(ctx->opcode, 12, 20) << 1= 2) + - ctx->pc); + ctx->base.pc_next); break; case OPC_RISC_JAL: imm =3D GET_JAL_IMM(ctx->opcode); @@ -1803,9 +1801,9 @@ static void decode_RV32_64G(CPURISCVState *env, Disas= Context *ctx) if (ctx->opcode & 0x1000) { /* FENCE_I is a no-op in QEMU, * however we need to end the translation block */ - tcg_gen_movi_tl(cpu_pc, ctx->next_pc); + tcg_gen_movi_tl(cpu_pc, ctx->pc_tmp); tcg_gen_exit_tb(0); - ctx->is_jmp =3D DISAS_NORETURN; + ctx->base.is_jmp =3D DISAS_NORETURN; } else { /* FENCE is a full memory barrier. */ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC); @@ -1829,11 +1827,11 @@ static void decode_opc(CPURISCVState *env, DisasCon= text *ctx) if (!riscv_has_ext(env, RVC)) { gen_exception_illegal(ctx); } else { - ctx->next_pc =3D ctx->pc + 2; + ctx->pc_tmp =3D ctx->base.pc_next + 2; decode_RV32_64C(env, ctx); } } else { - ctx->next_pc =3D ctx->pc + 4; + ctx->pc_tmp =3D ctx->base.pc_next + 4; decode_RV32_64G(env, ctx); } } @@ -1842,26 +1840,26 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) { CPURISCVState *env =3D cs->env_ptr; DisasContext ctx; - target_ulong pc_start; target_ulong next_page_start; int num_insns; int max_insns; - pc_start =3D tb->pc; - next_page_start =3D (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; - ctx.pc =3D pc_start; =20 + ctx.base.pc_first =3D tb->pc; + ctx.base.pc_next =3D ctx.base.pc_first; /* once we have GDB, the rest of the translate.c implementation should= be ready for singlestep */ - ctx.singlestep_enabled =3D cs->singlestep_enabled; + ctx.base.singlestep_enabled =3D cs->singlestep_enabled; + ctx.base.tb =3D tb; + ctx.base.is_jmp =3D DISAS_NEXT; =20 - ctx.tb =3D tb; - ctx.is_jmp =3D DISAS_NEXT; + next_page_start =3D (ctx.base.pc_first & TARGET_PAGE_MASK) + TARGET_PA= GE_SIZE; + ctx.pc_tmp =3D ctx.base.pc_first; ctx.flags =3D tb->flags; ctx.mem_idx =3D tb->flags & TB_FLAGS_MMU_MASK; ctx.frm =3D -1; /* unknown rounding mode */ =20 num_insns =3D 0; - max_insns =3D tb->cflags & CF_COUNT_MASK; + max_insns =3D tb_cflags(ctx.base.tb) & CF_COUNT_MASK; if (max_insns =3D=3D 0) { max_insns =3D CF_COUNT_MASK; } @@ -1870,45 +1868,45 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) } gen_tb_start(tb); =20 - while (ctx.is_jmp =3D=3D DISAS_NEXT) { - tcg_gen_insn_start(ctx.pc); + while (ctx.base.is_jmp =3D=3D DISAS_NEXT) { + tcg_gen_insn_start(ctx.base.pc_next); num_insns++; =20 - if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) { - tcg_gen_movi_tl(cpu_pc, ctx.pc); - ctx.is_jmp =3D DISAS_NORETURN; + if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) { + tcg_gen_movi_tl(cpu_pc, ctx.base.pc_next); + ctx.base.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 properly cleared -- thus we increment the PC here so that the logic setting tb->size below does the right thing. */ - ctx.pc +=3D 4; + ctx.base.pc_next +=3D 4; goto done_generating; } =20 - if (num_insns =3D=3D max_insns && (tb->cflags & CF_LAST_IO)) { + if (num_insns =3D=3D max_insns && (tb_cflags(ctx.base.tb) & CF_LAS= T_IO)) { gen_io_start(); } =20 - ctx.opcode =3D cpu_ldl_code(env, ctx.pc); + ctx.opcode =3D cpu_ldl_code(env, ctx.base.pc_next); decode_opc(env, &ctx); - ctx.pc =3D ctx.next_pc; + ctx.base.pc_next =3D ctx.pc_tmp; =20 - if (ctx.is_jmp =3D=3D DISAS_NEXT && + if (ctx.base.is_jmp =3D=3D DISAS_NEXT && (cs->singlestep_enabled || - ctx.pc >=3D next_page_start || + ctx.base.pc_next >=3D next_page_start || tcg_op_buf_full() || num_insns >=3D max_insns || singlestep)) { - ctx.is_jmp =3D DISAS_TOO_MANY; + ctx.base.is_jmp =3D DISAS_TOO_MANY; } } - if (tb->cflags & CF_LAST_IO) { + if (tb_cflags(ctx.base.tb) & CF_LAST_IO) { gen_io_end(); } - switch (ctx.is_jmp) { + switch (ctx.base.is_jmp) { case DISAS_TOO_MANY: - tcg_gen_movi_tl(cpu_pc, ctx.pc); + tcg_gen_movi_tl(cpu_pc, ctx.base.pc_next); if (cs->singlestep_enabled) { gen_exception_debug(); } else { @@ -1922,14 +1920,15 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) } done_generating: gen_tb_end(tb, num_insns); - tb->size =3D ctx.pc - pc_start; + tb->size =3D ctx.base.pc_next - ctx.base.pc_first; tb->icount =3D num_insns; =20 #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(pc_start)) { - qemu_log("IN: %s\n", lookup_symbol(pc_start)); - log_target_disas(cs, pc_start, ctx.pc - pc_start); + && qemu_log_in_addr_range(ctx.base.pc_first)) { + qemu_log("IN: %s\n", lookup_symbol(ctx.base.pc_first)); + log_target_disas(cs, ctx.base.pc_first, + ctx.base.pc_next - ctx.base.pc_first); qemu_log("\n"); } #endif --=20 2.7.4 From nobody Tue May 7 23:22:28 2024 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 1523039131993298.0038025451081; Fri, 6 Apr 2018 11:25:31 -0700 (PDT) Received: from localhost ([::1]:45407 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4W3H-0007wb-4p for importer@patchew.org; Fri, 06 Apr 2018 14:25:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48710) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f4Vy8-0003m2-K2 for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f4Vy4-0000Ul-OU for qemu-devel@nongnu.org; Fri, 06 Apr 2018 14:20:12 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:53053) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1f4Vy4-0000UQ-H1 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 3DC6B20E94; Fri, 6 Apr 2018 14:20:08 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Apr 2018 14:20:08 -0400 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id ECE3A1025A; 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=Ss2+Opm9OGFem2 Su3LsI7dCSGoEf06ykaBJHJm+nxuQ=; b=c+6e5D99+7PfjIl7ulFOgshTCu+rc7 Pe85duSF8dHxuSeCWX7lunCs05lg1sgwR3IfTfkKmfR1oYlli/SFKyab2kiESs26 gSydK/jmUfPD+iTMliR8n1gedZc1exLe6eakPZ7KIIj1x7w6I+uSNttpRO3ZfhYf zvVH6fIefyB78= 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=Ss2+Opm9OGFem2Su3LsI7dCSGoEf06ykaBJHJm+nxuQ=; b=gubX/3rX iPIVeAxRsvv0n8CXKds1bjrzyAEEKOHjLhCcwe+HwlXxk9eHf/nVY00XJn5dl3U1 +YqehnphZRqdvArp2i7AkCWbV7nG1vlEZ/p6BuakyiMlK2iIyfINXD49S/1QNb9I EfCbtaOMECw24yyCDR8RL+x42JZutkGF8t4sUvg/HGZP1h7wGGXDHeQxRN26c2hq CDVzAIK9qvjwaG3n/EJF3eiLrha4sKXa1WaP/e8PR1Lgv02RTCyGAf6nHU7L2zdC bEqCZxSDnqkWc8QrpgUOf60Azf0+5P5m+iTGNTNlTCk56o2DgzXy+EvXKOavk9uE GsrGzRzShhlRug== X-ME-Sender: From: "Emilio G. Cota" To: qemu-devel@nongnu.org Date: Fri, 6 Apr 2018 14:20:00 -0400 Message-Id: <1523038800-2494-18-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 17/17] target/riscv: convert to TranslatorOps 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: Richard Henderson --- target/riscv/translate.c | 158 ++++++++++++++++++++++++-------------------= ---- 1 file changed, 80 insertions(+), 78 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index c619a14..a2024a2 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -1836,78 +1836,71 @@ static void decode_opc(CPURISCVState *env, DisasCon= text *ctx) } } =20 -void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState= *cs) { - CPURISCVState *env =3D cs->env_ptr; - DisasContext ctx; - target_ulong next_page_start; - int num_insns; - int max_insns; - - ctx.base.pc_first =3D tb->pc; - ctx.base.pc_next =3D ctx.base.pc_first; - /* once we have GDB, the rest of the translate.c implementation should= be - ready for singlestep */ - ctx.base.singlestep_enabled =3D cs->singlestep_enabled; - ctx.base.tb =3D tb; - ctx.base.is_jmp =3D DISAS_NEXT; - - next_page_start =3D (ctx.base.pc_first & TARGET_PAGE_MASK) + TARGET_PA= GE_SIZE; - ctx.pc_tmp =3D ctx.base.pc_first; - ctx.flags =3D tb->flags; - ctx.mem_idx =3D tb->flags & TB_FLAGS_MMU_MASK; - ctx.frm =3D -1; /* unknown rounding mode */ - - num_insns =3D 0; - max_insns =3D tb_cflags(ctx.base.tb) & CF_COUNT_MASK; - if (max_insns =3D=3D 0) { - max_insns =3D CF_COUNT_MASK; - } - if (max_insns > TCG_MAX_INSNS) { - max_insns =3D TCG_MAX_INSNS; - } - gen_tb_start(tb); + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); =20 - while (ctx.base.is_jmp =3D=3D DISAS_NEXT) { - tcg_gen_insn_start(ctx.base.pc_next); - num_insns++; + ctx->pc_tmp =3D ctx->base.pc_first; + ctx->flags =3D ctx->base.tb->flags; + ctx->mem_idx =3D ctx->base.tb->flags & TB_FLAGS_MMU_MASK; + ctx->frm =3D -1; /* unknown rounding mode */ +} =20 - if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) { - tcg_gen_movi_tl(cpu_pc, ctx.base.pc_next); - ctx.base.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 - properly cleared -- thus we increment the PC here so that - the logic setting tb->size below does the right thing. */ - ctx.base.pc_next +=3D 4; - goto done_generating; - } +static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu) +{ +} =20 - if (num_insns =3D=3D max_insns && (tb_cflags(ctx.base.tb) & CF_LAS= T_IO)) { - gen_io_start(); - } +static void riscv_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + + tcg_gen_insn_start(ctx->base.pc_next); +} + +static bool riscv_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *= cpu, + const CPUBreakpoint *bp) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + + tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); + ctx->base.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 + properly cleared -- thus we increment the PC here so that + the logic setting tb->size below does the right thing. */ + ctx->base.pc_next +=3D 4; + return true; +} + + +static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cp= u) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + CPURISCVState *env =3D cpu->env_ptr; + + ctx->opcode =3D cpu_ldl_code(env, ctx->base.pc_next); + decode_opc(env, ctx); + ctx->base.pc_next =3D ctx->pc_tmp; + + if (ctx->base.is_jmp =3D=3D DISAS_NEXT) { + target_ulong next_page; =20 - ctx.opcode =3D cpu_ldl_code(env, ctx.base.pc_next); - decode_opc(env, &ctx); - ctx.base.pc_next =3D ctx.pc_tmp; - - if (ctx.base.is_jmp =3D=3D DISAS_NEXT && - (cs->singlestep_enabled || - ctx.base.pc_next >=3D next_page_start || - tcg_op_buf_full() || - num_insns >=3D max_insns || - singlestep)) { - ctx.base.is_jmp =3D DISAS_TOO_MANY; + next_page =3D (ctx->base.pc_first & TARGET_PAGE_MASK) + TARGET_PAG= E_SIZE; + if (ctx->base.pc_next >=3D next_page) { + ctx->base.is_jmp =3D DISAS_TOO_MANY; } } - if (tb_cflags(ctx.base.tb) & CF_LAST_IO) { - gen_io_end(); - } - switch (ctx.base.is_jmp) { +} + +static void riscv_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) +{ + DisasContext *ctx =3D container_of(dcbase, DisasContext, base); + + switch (ctx->base.is_jmp) { case DISAS_TOO_MANY: - tcg_gen_movi_tl(cpu_pc, ctx.base.pc_next); - if (cs->singlestep_enabled) { + tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); + if (ctx->base.singlestep_enabled) { gen_exception_debug(); } else { tcg_gen_exit_tb(0); @@ -1918,20 +1911,29 @@ void gen_intermediate_code(CPUState *cs, Translatio= nBlock *tb) default: g_assert_not_reached(); } -done_generating: - gen_tb_end(tb, num_insns); - tb->size =3D ctx.base.pc_next - ctx.base.pc_first; - tb->icount =3D num_insns; - -#ifdef DEBUG_DISAS - if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) - && qemu_log_in_addr_range(ctx.base.pc_first)) { - qemu_log("IN: %s\n", lookup_symbol(ctx.base.pc_first)); - log_target_disas(cs, ctx.base.pc_first, - ctx.base.pc_next - ctx.base.pc_first); - qemu_log("\n"); - } -#endif +} + +static void riscv_tr_disas_log(const DisasContextBase *dcbase, CPUState *c= pu) +{ + qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); + log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size); +} + +static const TranslatorOps riscv_tr_ops =3D { + .init_disas_context =3D riscv_tr_init_disas_context, + .tb_start =3D riscv_tr_tb_start, + .insn_start =3D riscv_tr_insn_start, + .breakpoint_check =3D riscv_tr_breakpoint_check, + .translate_insn =3D riscv_tr_translate_insn, + .tb_stop =3D riscv_tr_tb_stop, + .disas_log =3D riscv_tr_disas_log, +}; + +void gen_intermediate_code(CPUState *cs, TranslationBlock *tb) +{ + DisasContext ctx; + + translator_loop(&riscv_tr_ops, &ctx.base, cs, tb); } =20 void riscv_translate_init(void) --=20 2.7.4