From patchwork Fri Apr 22 16:52:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 564886 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:6886:0:0:0:0 with SMTP id m6csp695388map; Fri, 22 Apr 2022 10:44:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyeE4gOxsrAdy0eKIXM80JFnkKbh093s6RSj4R2Yq5Oo8Y6RWoH7H2lP0vwKzS7c/Q+nvL+ X-Received: by 2002:a81:2492:0:b0:2eb:250d:9cd8 with SMTP id k140-20020a812492000000b002eb250d9cd8mr5828985ywk.238.1650649476508; Fri, 22 Apr 2022 10:44:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650649476; cv=none; d=google.com; s=arc-20160816; b=MExpJ9Nxg9kQnszBUqSqMjQ3ttbgcowffjkxBIVkWagogAYpef3Sh2obEo26LLcRJl gposlvyYS299hOcNf9W/m9b4i6zFVUse7ges7FfldS3L6n6sgl3WO3+jiZSvUsNQErs0 JIUpHCaUQLxxZv4x66xnHxkYOxvFVe7ezz2+zLp3CObiAyc3x/+qA69mtNlc5SIwznWq 10Xx6LRLiUQPt6iCY0tANdl5Tid6QKa4vEWjEddvJ7hkSE/NKyQoZAXgmNLdXaO6GZhB wEXvZkE2zvoX0caW6225xvK6jQj7FGqMQLiBSEBQ8uqEnQcOez1w0WfONBDz/Who6N6r +oUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=EjEvoq47mgxbhwOkPjY+lzICTw8tSYJC5nzrZvKsO9E=; b=0C8L5erop6YixdibqA64cxIKeMqlskMkFUeLqnmKnJa/RLYTM/RpnO1KvVknKEA9GK uiH+Gw8xZzWRN6i6qCq/zD308sBpRec6O9QTqWbtS0NOk5jyDKKP/RmeEZv2NqEoCV4l AxbNSYKw+D/ipWeHavH3QD/GBgtROp41unPVmSafF1k/vblssvTNy7LehY33MPdxMwLy /i2hD4tKRoA1xDfy1ZmtLj8epVHKqvPp0iK1k0Uly7yanyyqtwXZ66VVgii5Zkfdcoqm 9EYNL2EHYwj79rCQm/686RpM0mYGJqXE7DI6EfhNcaa/nbYrtj+n2X2j0g1gevNo286H 2fwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=FalRuS1Y; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id t130-20020a815f88000000b002e6a61bc54csi6226011ywb.321.2022.04.22.10.44.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Apr 2022 10:44:36 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=FalRuS1Y; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:45356 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhxKe-0006ua-1D for patch@linaro.org; Fri, 22 Apr 2022 13:44:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50170) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhway-0000Hf-NU for qemu-devel@nongnu.org; Fri, 22 Apr 2022 12:57:25 -0400 Received: from mail-il1-x12a.google.com ([2607:f8b0:4864:20::12a]:43825) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nhwax-00082x-28 for qemu-devel@nongnu.org; Fri, 22 Apr 2022 12:57:24 -0400 Received: by mail-il1-x12a.google.com with SMTP id d3so5401038ilr.10 for ; Fri, 22 Apr 2022 09:57:22 -0700 (PDT) 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=EjEvoq47mgxbhwOkPjY+lzICTw8tSYJC5nzrZvKsO9E=; b=FalRuS1Y6G1SjwvS1cPRF/QIC4KyHeeeVlsyg21EGL6tr+XQLuM49LDTRwu/5fklvK HoBGlSTKQM3wipHZ6L/VwSbFgcvm9m6VgLVqAQza/BPgtnHfZccgR+JlQMUJiLbKzGe7 qaQ5s4qmkrt1njsCD3c/IFI4sVenLKxI3bPR1xhLcNkVB/23h0MUALaJjx0jQR/tZEqq q49usOgp18s7LP10h4eOuYtHR/eZ+SIpLBWXv4IgZhAEqiKa/OCKKE4IwOfbLyR+8LzD fw0AbMPBEB+O/s8Al/1/zlWBCgMoTMmvRshNEbnlljXnrQIUWBBt9GQuV3KKMI0tpli7 MOMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EjEvoq47mgxbhwOkPjY+lzICTw8tSYJC5nzrZvKsO9E=; b=W2OgeHn3DBqJQELEl8/VRbM+QJA+PQFOwb3A+KbSHbVrnkVPvMCshSuZrUYvfsyr9i 0YKovdgV/rQJdsERcxrdXUM0ztYcINujXVCGw8uetNrhtIQailsjQ7JMKsB8mThkyCls rewoKHFsVsLqQdW7ECAOV321PVzkvc0SM9uzWkpJ2A162DVqiZ3OMHlqYKywWRTZ0nNZ VTm8BM9cr7Vdwy+yTm+LhydUxojxajxHazqjXOwSOAyGxbLvoFwrENRLkVCRLTU+4HU2 /ldfUszWCSMOw3du1Tvs615G9CbzV1wz0qtVVg42CCF7QOt1RhKarVrFUJm0zG9L691n 1u0Q== X-Gm-Message-State: AOAM532SroLeudslcyfDunLUsE4VhQTMCqWCF586AUC433dbPibEjqrU NsJjUhzfayRT3j2x+NIxeZlvJiwb1r1qFk/y X-Received: by 2002:a05:6e02:1202:b0:2cb:b25e:3a8b with SMTP id a2-20020a056e02120200b002cbb25e3a8bmr2283838ilq.88.1650646641944; Fri, 22 Apr 2022 09:57:21 -0700 (PDT) Received: from stoup.. ([2607:fb90:27d0:b0f2:934d:3e2:9f8c:dd1]) by smtp.gmail.com with ESMTPSA id n23-20020a6b8b17000000b00649a2634725sm816380iod.17.2022.04.22.09.57.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 09:57:21 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v8 56/68] target/nios2: Implement Misaligned destination exception Date: Fri, 22 Apr 2022 09:52:26 -0700 Message-Id: <20220422165238.1971496-57-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220422165238.1971496-1-richard.henderson@linaro.org> References: <20220422165238.1971496-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::12a; envelope-from=richard.henderson@linaro.org; helo=mail-il1-x12a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Indirect branches, plus eret and bret optionally raise an exception when branching to a misaligned address. The exception is required when an mmu is enabled, but enable it always because the fallback behaviour is not documented (though presumably it discards low bits). For the purposes of the linux-user cpu loop, if EXCP_UNALIGN (misaligned data) were to arrive, it would be treated the same as EXCP_UNALIGND (misaligned destination). See the !defined(CONFIG_NIOS2_ALIGNMENT_TRAP) block in kernel/traps.c. Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson Message-Id: <20220421151735.31996-53-richard.henderson@linaro.org> --- linux-user/nios2/cpu_loop.c | 6 ++++++ target/nios2/op_helper.c | 9 ++++++++- target/nios2/translate.c | 15 ++++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/linux-user/nios2/cpu_loop.c b/linux-user/nios2/cpu_loop.c index 11ecb71843..30a27f252b 100644 --- a/linux-user/nios2/cpu_loop.c +++ b/linux-user/nios2/cpu_loop.c @@ -42,6 +42,12 @@ void cpu_loop(CPUNios2State *env) force_sig_fault(TARGET_SIGFPE, TARGET_FPE_INTDIV, env->pc); break; + case EXCP_UNALIGN: + case EXCP_UNALIGND: + force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN, + env->ctrl[CR_BADADDR]); + break; + case EXCP_TRAP: /* * TODO: This advance should be done in the translator, as diff --git a/target/nios2/op_helper.c b/target/nios2/op_helper.c index a19b504b0e..38a71a1f2d 100644 --- a/target/nios2/op_helper.c +++ b/target/nios2/op_helper.c @@ -64,6 +64,13 @@ uint32_t helper_divu(CPUNios2State *env, uint32_t num, uint32_t den) void helper_eret(CPUNios2State *env, uint32_t new_status, uint32_t new_pc) { Nios2CPU *cpu = env_archcpu(env); + CPUState *cs = env_cpu(env); + + if (unlikely(new_pc & 3)) { + env->ctrl[CR_BADADDR] = new_pc; + cs->exception_index = EXCP_UNALIGND; + cpu_loop_exit_restore(cs, GETPC()); + } /* * Both estatus and bstatus have no constraints on write; @@ -74,6 +81,6 @@ void helper_eret(CPUNios2State *env, uint32_t new_status, uint32_t new_pc) env->ctrl[CR_STATUS] = new_status; env->pc = new_pc; - cpu_loop_exit(env_cpu(env)); + cpu_loop_exit(cs); } #endif /* !CONFIG_USER_ONLY */ diff --git a/target/nios2/translate.c b/target/nios2/translate.c index a3e87beba4..794b763d8a 100644 --- a/target/nios2/translate.c +++ b/target/nios2/translate.c @@ -197,11 +197,24 @@ static void gen_goto_tb(DisasContext *dc, int n, uint32_t dest) static void gen_jumpr(DisasContext *dc, int regno, bool is_call) { - tcg_gen_mov_tl(cpu_pc, load_gpr(dc, regno)); + TCGLabel *l = gen_new_label(); + TCGv test = tcg_temp_new(); + TCGv dest = load_gpr(dc, regno); + + tcg_gen_andi_tl(test, dest, 3); + tcg_gen_brcondi_tl(TCG_COND_NE, test, 0, l); + tcg_temp_free(test); + + tcg_gen_mov_tl(cpu_pc, dest); if (is_call) { tcg_gen_movi_tl(dest_gpr(dc, R_RA), dc->base.pc_next); } tcg_gen_lookup_and_goto_ptr(); + + gen_set_label(l); + tcg_gen_st_tl(dest, cpu_env, offsetof(CPUNios2State, ctrl[CR_BADADDR])); + t_gen_helper_raise_exception(dc, EXCP_UNALIGND); + dc->base.is_jmp = DISAS_NORETURN; }