From nobody Sat Nov 8 06:18:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549973668407803.2032202000202; Tue, 12 Feb 2019 04:14:28 -0800 (PST) Received: from localhost ([127.0.0.1]:38261 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtWxC-0002EZ-1F for importer@patchew.org; Tue, 12 Feb 2019 07:14:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60564) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtWwL-0001kY-8H for qemu-devel@nongnu.org; Tue, 12 Feb 2019 07:13:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtWw5-0002ZU-Jb for qemu-devel@nongnu.org; Tue, 12 Feb 2019 07:13:18 -0500 Received: from mail.sysgo.com ([176.9.12.79]:44360) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtWw4-0002Ny-BX; Tue, 12 Feb 2019 07:13:12 -0500 From: Roman Kapl To: Date: Tue, 12 Feb 2019 13:12:55 +0100 Message-Id: <20190212121255.2279-1-rka@sysgo.com> X-Mailer: git-send-email 2.20.1.390.gb5101f9297 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 176.9.12.79 Subject: [Qemu-devel] [PATCH] ppc: fix crash during branch stepping 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: David Gibson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, Roman Kapl Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The PPC BRANCH exception could bubble up, but this is an QEMU internal exce= ption and QEMU then crased. Instead it should trigger TRACE exception, according = to PPC 2.07 book. It could happen only when using branch stepping, which is not commonly used. Change gen_prep_dbgex do do trigger TRACE. The excp, argument is now remove= d, since the type of exception can be inferred from the singlestep_enabled fla= gs. removed the guards around gen_exception, since they are unnecessary. Fixes: 0e3bf48909 ("ppc: add DBCR based debugging"). Signed-off-by: Roman Kapl --- target/ppc/translate.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index e169c43643..c22d1a69c7 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -287,26 +287,22 @@ static void gen_exception_nip(DisasContext *ctx, uint= 32_t excp, ctx->exception =3D (excp); } =20 -/* Translates the EXCP_TRACE/BRANCH exceptions used on most PowerPCs to - * EXCP_DEBUG, if we are running on cores using the debug enable bit (e.g. - * BookE). +/* + * Tells the caller what is the appropriate exception to generate and prep= ares + * SPR registers for this exception. + * + * The exception can be either POWERPC_EXCP_TRACE (on most PowerPCs) or + * POWERPC_EXCP_DEBUG (on BookE). */ -static uint32_t gen_prep_dbgex(DisasContext *ctx, uint32_t excp) +static uint32_t gen_prep_dbgex(DisasContext *ctx) { - if ((ctx->singlestep_enabled & CPU_SINGLE_STEP) - && (excp =3D=3D POWERPC_EXCP_BRANCH)) { - /* Trace excpt. has priority */ - excp =3D POWERPC_EXCP_TRACE; - } if (ctx->flags & POWERPC_FLAG_DE) { target_ulong dbsr =3D 0; - switch (excp) { - case POWERPC_EXCP_TRACE: + if (ctx->singlestep_enabled & CPU_SINGLE_STEP) { dbsr =3D DBCR0_ICMP; - break; - case POWERPC_EXCP_BRANCH: + } else { + /* Must have been branch */ dbsr =3D DBCR0_BRT; - break; } TCGv t0 =3D tcg_temp_new(); gen_load_spr(t0, SPR_BOOKE_DBSR); @@ -315,7 +311,7 @@ static uint32_t gen_prep_dbgex(DisasContext *ctx, uint3= 2_t excp) tcg_temp_free(t0); return POWERPC_EXCP_DEBUG; } else { - return excp; + return POWERPC_EXCP_TRACE; } } =20 @@ -3652,10 +3648,8 @@ static void gen_lookup_and_goto_ptr(DisasContext *ct= x) if (sse & GDBSTUB_SINGLE_STEP) { gen_debug_exception(ctx); } else if (sse & (CPU_SINGLE_STEP | CPU_BRANCH_STEP)) { - uint32_t excp =3D gen_prep_dbgex(ctx, POWERPC_EXCP_BRANCH); - if (excp !=3D POWERPC_EXCP_NONE) { - gen_exception(ctx, excp); - } + uint32_t excp =3D gen_prep_dbgex(ctx); + gen_exception(ctx, excp); } tcg_gen_exit_tb(NULL, 0); } else { @@ -7785,9 +7779,8 @@ static void ppc_tr_translate_insn(DisasContextBase *d= cbase, CPUState *cs) ctx->exception !=3D POWERPC_SYSCALL && ctx->exception !=3D POWERPC_EXCP_TRAP && ctx->exception !=3D POWERPC_EXCP_BRANCH)) { - uint32_t excp =3D gen_prep_dbgex(ctx, POWERPC_EXCP_TRACE); - if (excp !=3D POWERPC_EXCP_NONE) - gen_exception_nip(ctx, excp, ctx->base.pc_next); + uint32_t excp =3D gen_prep_dbgex(ctx); + gen_exception_nip(ctx, excp, ctx->base.pc_next); } =20 if (tcg_check_temp_count()) { --=20 2.20.1.390.gb5101f9297