From nobody Mon Feb 9 20:12:56 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1578496155; cv=none; d=zohomail.com; s=zohoarc; b=MnA2UIcgZbGZ3LSfg2uiBAExHNsInoZK/68bCH7H0UiU8oDXappkylQiv4dhJDAm6eko9/zS41XM0AFxufofADumRzfL3hOUmHj7X2MSqeWHXhXEGpt1ep/KCSFxB/sQBfBDkg6vM0u8mrz8yr3mgZG7/PrL3+GifJuDhtX/yrI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1578496155; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GkQMpXBItYchKMRXNbiM3948XtOa8lICwzCMGGprBPg=; b=LoAVWdCMQG6rC1qfrc1E2dfsJsk5AII2W3GQS0D70/tEk7PVeuuyMsFH+plvt02x0nIQmw+MYEgpPuqQ2i/OAZc0zq5Syz2MfynVa7m/M+YCYrIvkuvIGjpaal8uFTrBpXjcTe8LUKinu8hxkudu5MeP6IJwaVNWZDlWt+APoEY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1578496155218689.2793743010928; Wed, 8 Jan 2020 07:09:15 -0800 (PST) Received: from localhost ([::1]:45448 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ipCxN-0005X9-GL for importer@patchew.org; Wed, 08 Jan 2020 10:09:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43732) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ipCrM-0004iq-4e for qemu-devel@nongnu.org; Wed, 08 Jan 2020 10:03:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ipCrK-0000sc-Oi for qemu-devel@nongnu.org; Wed, 08 Jan 2020 10:03:00 -0500 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:38533) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ipCrK-0000rk-Hb for qemu-devel@nongnu.org; Wed, 08 Jan 2020 10:02:58 -0500 Received: by mail-wm1-x341.google.com with SMTP id u2so2849326wmc.3 for ; Wed, 08 Jan 2020 07:02:58 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id d8sm4591072wre.13.2020.01.08.07.02.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jan 2020 07:02:53 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 22CF71FF8F; Wed, 8 Jan 2020 15:02:53 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GkQMpXBItYchKMRXNbiM3948XtOa8lICwzCMGGprBPg=; b=XzqPqRjSHWRRWBkpxQXgLOt8FDe72XV7p3VtRVLdeaSp8TJp7wFKl65Lz1OWe6/wSC pGuvNkLYn9JCzNoTOWbet1RiJlQq21B3E0M/rIaJARHaLCTXEbbjGw39WSD/ISmWbDBQ pZDZCa3HkYbTKdX/kHyJ574lkuwr1n6avG9OV4a30Y8JAOK53J94fxU7Yq1l68LT/aww cvtWByZJchnPDxJwm4codLelrVsT8S4BXplZCYyPUzopK5MqiRRKto0NZQPHiH0biu9E TbMbvcIymjX8/1Rs0u6vzgvnFOVLxIErbvIDYqF7fJ4zuoAfKuDMqPFiCDdkuQMcvYlj r9qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GkQMpXBItYchKMRXNbiM3948XtOa8lICwzCMGGprBPg=; b=q3hoYKLTWN12N7ISA+ScBFasZzaMdD5jxeuFazuWVRna/imMwNxdHRiY8tjw9k8H9o MHVL0Ah2zF+kQ3HThp04/AoczLlH1YXp2SVdFcuA7/MLM7pc5cINIXL+kFoXQ9EBiQ43 kmunqjhe7jI9iqhlTVs4Dg++oF6WNb6msMlsiIYP0eQ53+PiDQx/zpf+H39Mja8eRZj+ CdI+jhoUZFSanyQ239T3xMLd9Q5n2jVfRoP9HFwXRfWUOn4fEbX8wBx4EeEFaupIwAWl 9mV8Mtz0BPThF5y9EGtFtc/KGfPZBCJpj04m1jH6JX3yyjvWQ/gudi16Cz57UH9j7vgV 3L/w== X-Gm-Message-State: APjAAAWaBIXJ5pTugOLNRH2G9dod6K+ASguQUxBOcr33CE+ubSZ/KeJK s+tD42dgDa3D8oiQUpdwLWa2bg== X-Google-Smtp-Source: APXvYqwh61/qCoiE8OIlzvZ981NvXmwqYM0qxurEt8liMHVMsvaGFU+p+O3drkbhGRe0aalsVV7p6w== X-Received: by 2002:a1c:cc06:: with SMTP id h6mr4167784wmb.118.1578495777551; Wed, 08 Jan 2020 07:02:57 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [PATCH v3 2/6] target/arm: only update pc after semihosting completes Date: Wed, 8 Jan 2020 15:02:48 +0000 Message-Id: <20200108150252.6216-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200108150252.6216-1-alex.bennee@linaro.org> References: <20200108150252.6216-1-alex.bennee@linaro.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: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , keithp@keithp.com, Riku Voipio , Richard Henderson , Laurent Vivier , qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Before we introduce blocking semihosting calls we need to ensure we can restart the system on semi hosting exception. To be able to do this the EXCP_SEMIHOST operation should be idempotent until it finally completes. Practically this means ensureing we only update the pc after the semihosting call has completed. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson Reviewed-by: Keith Packard Tested-by: Keith Packard --- linux-user/aarch64/cpu_loop.c | 1 + linux-user/arm/cpu_loop.c | 1 + target/arm/helper.c | 2 ++ target/arm/m_helper.c | 1 + target/arm/translate-a64.c | 2 +- target/arm/translate.c | 6 +++--- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c index 31c845a70d4..bbe9fefca81 100644 --- a/linux-user/aarch64/cpu_loop.c +++ b/linux-user/aarch64/cpu_loop.c @@ -130,6 +130,7 @@ void cpu_loop(CPUARMState *env) break; case EXCP_SEMIHOST: env->xregs[0] =3D do_arm_semihosting(env); + env->pc +=3D 4; break; case EXCP_YIELD: /* nothing to do here for user-mode, just resume guest code */ diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c index 7be40717518..1fae90c6dfc 100644 --- a/linux-user/arm/cpu_loop.c +++ b/linux-user/arm/cpu_loop.c @@ -377,6 +377,7 @@ void cpu_loop(CPUARMState *env) break; case EXCP_SEMIHOST: env->regs[0] =3D do_arm_semihosting(env); + env->regs[15] +=3D env->thumb ? 2 : 4; break; case EXCP_INTERRUPT: /* just indicate that signals should be handled asap */ diff --git a/target/arm/helper.c b/target/arm/helper.c index da22c198006..19a57a17da5 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -8614,11 +8614,13 @@ static void handle_semihosting(CPUState *cs) "...handling as semihosting call 0x%" PRIx64 "\n", env->xregs[0]); env->xregs[0] =3D do_arm_semihosting(env); + env->pc +=3D 4; } else { qemu_log_mask(CPU_LOG_INT, "...handling as semihosting call 0x%x\n", env->regs[0]); env->regs[0] =3D do_arm_semihosting(env); + env->regs[15] +=3D env->thumb ? 2 : 4; } } #endif diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c index 76de317e6af..33d414a684b 100644 --- a/target/arm/m_helper.c +++ b/target/arm/m_helper.c @@ -2185,6 +2185,7 @@ void arm_v7m_cpu_do_interrupt(CPUState *cs) "...handling as semihosting call 0x%x\n", env->regs[0]); env->regs[0] =3D do_arm_semihosting(env); + env->regs[15] +=3D env->thumb ? 2 : 4; return; case EXCP_BKPT: armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false); diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index d4bebbe6295..972c28c3c95 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -1937,7 +1937,7 @@ static void disas_exc(DisasContext *s, uint32_t insn) break; } #endif - gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST); + gen_exception_internal_insn(s, s->pc_curr, EXCP_SEMIHOST); } else { unsupported_encoding(s, insn); } diff --git a/target/arm/translate.c b/target/arm/translate.c index 2b6c1f91bf9..5185e08641b 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -1124,7 +1124,7 @@ static inline void gen_hlt(DisasContext *s, int imm) s->current_el !=3D 0 && #endif (imm =3D=3D (s->thumb ? 0x3c : 0xf000))) { - gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST); + gen_exception_internal_insn(s, s->pc_curr, EXCP_SEMIHOST); return; } =20 @@ -8457,7 +8457,7 @@ static bool trans_BKPT(DisasContext *s, arg_BKPT *a) !IS_USER(s) && #endif (a->imm =3D=3D 0xab)) { - gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST); + gen_exception_internal_insn(s, s->pc_curr, EXCP_SEMIHOST); } else { gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false)); } @@ -10266,7 +10266,7 @@ static bool trans_SVC(DisasContext *s, arg_SVC *a) !IS_USER(s) && #endif (a->imm =3D=3D semihost_imm)) { - gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST); + gen_exception_internal_insn(s, s->pc_curr, EXCP_SEMIHOST); } else { gen_set_pc_im(s, s->base.pc_next); s->svc_imm =3D a->imm; --=20 2.20.1