From patchwork Thu Mar 17 05:05: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: 552238 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:6713:0:0:0:0 with SMTP id u19csp885310mag; Wed, 16 Mar 2022 22:34:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwc1qm1OQRAI7fYxxwvG5L2d6VhyPq4ADma9ePXrbEMU5RiRlUW4fFTyWyXGYCt6hv1U8NR X-Received: by 2002:a37:674c:0:b0:47b:8dc5:df77 with SMTP id b73-20020a37674c000000b0047b8dc5df77mr1910883qkc.95.1647495271522; Wed, 16 Mar 2022 22:34:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647495271; cv=none; d=google.com; s=arc-20160816; b=Odu4xPojdK6sDDvKj3zBl6LZNBEzqSXVvZMFib5Y8/zek8xZySDM2YlVpZfDt7SGZV U9VwVPk2ojTSBIAmN8Hszsd8FBrrnaGYxwreicGxeD6b0uSB4nZoeBWzpl2JNhR4d3So sB5Y86OkPqkPbIIVq8KBoZ2/RA93TibJTznpSky9htUz0Hfv0KK0Bto0wtg3bJhqLM0p jDgDWa2P0Z6F60Zb+tov8Iljz+3DKhvBEk+GMGMaK0ZX8Ic9ParrgEq/GX0XrmHWYgS4 huz+B+K0fHDvrLNQawGYwJA9FPazyLcV6Qr9Fe5KJ87tRQRoxb3mYEH7DDsfxor/evDH dYPQ== 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=LTuw5YwD7AAqbGDKsXNMlzx47tIusaHPWNHDAjQuUEg=; b=HOisY09hWUit/NiqsZJfJQFwyguY16aYHsQLBPRI5anVNFavp0Zs8b1oAg357Hg9nx iCGoT7lcHzqioijSAQJojsf8TLLseICzOam9lIUTzfS2xgEUK6FserXtZCLigQBkfdxC b9BOnORVqSxtA90AcqspgQ8MvGX33kiXvQJv7tzx8Hjd2x9NcKKZXc2qgbWBnzjK5vLD 1eTEqg1CWDADGfeT6a12rWTvt3w92+jCRVJZqf4aJJzyduPHUfQnejzRc+mmzMVQC3aQ JEjZA5zJIjgR8jmjy7Mj/a7xQT3R/mfcFvoGlqahuYyDJsMPDgTBGf0gebE4z4fLdOCl Ioow== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=NPqF158v; 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=fail (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 n19-20020ac85a13000000b002e1d2924695si1060970qta.752.2022.03.16.22.34.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Mar 2022 22:34:31 -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=fail header.i=@linaro.org header.s=google header.b=NPqF158v; 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=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:54514 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nUimN-0004uk-3n for patch@linaro.org; Thu, 17 Mar 2022 01:34:31 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51230) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nUiL7-0001X0-Al for qemu-devel@nongnu.org; Thu, 17 Mar 2022 01:06:22 -0400 Received: from [2607:f8b0:4864:20::52f] (port=37416 helo=mail-pg1-x52f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nUiL5-0002KK-8M for qemu-devel@nongnu.org; Thu, 17 Mar 2022 01:06:21 -0400 Received: by mail-pg1-x52f.google.com with SMTP id bc27so1807560pgb.4 for ; Wed, 16 Mar 2022 22:06:18 -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=LTuw5YwD7AAqbGDKsXNMlzx47tIusaHPWNHDAjQuUEg=; b=NPqF158vK+0L/hv2+LevvVR3YYj+7OEu3k5hteB8CzgY6ICEz6SU2daAoCy0QmhAb3 rdw4rXrhAbQVQMDYgX20Srm12BwPpdOIdBvd5z+n14YrOZPKe+P53VF2VixxjRSGsOaM L7S1jPn+PWEg7k5v8eLpyTsjGfK6TbJ5CTV3SihNUveTgH+u0Y+tb7w/2ydQeNpnH8h+ 2fombKzE3EUBUSNj4T9oJpzF6IBLRs5h5LAspuvxzZs7HjusveHmjsZRxUJ7XaTJMCm+ Pixijz45fpl3X/Q7HRc/+9+oOHBuBxs+5oSY981M/if/1llKiJ86AH+ykqGysHaqJ99I BEzw== 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=LTuw5YwD7AAqbGDKsXNMlzx47tIusaHPWNHDAjQuUEg=; b=kX9XbB9qrsY3iDlzHy8m6/6MawP3npLxkpMTyxzmmCMY11STNxDiXx3xURcp5RxTOv qkS1DGTMtL1t/hWToDO/1eQKDOSqZLG57OfTzJgU7s8acFltF5h5hmgWtY2dLgaEp2ls /CYxhQbo1VVcOLOcPjPp6P4LUMaMQjX4svMh/lR7tcYoAsR0dppHI4tFvgM4Is5qrUcw DFcaIgyMJhoHitO60IJ8pj4WL/prHfeDdOz8EgJqM1my9Nvm2hkYssvpHaPLyGQjVE95 S78PsXKBAMIuZ2VsAuTkyuOdG1UwKQs6sFUPwOepcRUF8qI/Ps/GXeQi9I3L/djDxvNl AxaQ== X-Gm-Message-State: AOAM530NrgNbhDbCl9GTtoc2k9J/hWmiAfxbOr2rLLEMxZns0SfpvKzu Gl5NfOa2PwD2o/dXQe1KPKQmfoBnXQGbBA== X-Received: by 2002:a63:944:0:b0:374:5324:eea1 with SMTP id 65-20020a630944000000b003745324eea1mr2308753pgj.366.1647493577345; Wed, 16 Mar 2022 22:06:17 -0700 (PDT) Received: from localhost.localdomain (174-21-142-130.tukw.qwest.net. [174.21.142.130]) by smtp.gmail.com with ESMTPSA id h22-20020a056a001a5600b004f7c17b291asm5101357pfv.87.2022.03.16.22.06.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Mar 2022 22:06:16 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH for-7.1 v6 39/51] target/nios2: Implement Misaligned destination exception Date: Wed, 16 Mar 2022 22:05:26 -0700 Message-Id: <20220317050538.924111-40-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220317050538.924111-1-richard.henderson@linaro.org> References: <20220317050538.924111-1-richard.henderson@linaro.org> MIME-Version: 1.0 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::52f (failed) Received-SPF: pass client-ip=2607:f8b0:4864:20::52f; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52f.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 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, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no 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: marex@denx.de, amir.gonnen@neuroblade.ai 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. Signed-off-by: Richard Henderson Reviewed-by: Peter Maydell --- 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 ea364b7d1f..67220128aa 100644 --- a/linux-user/nios2/cpu_loop.c +++ b/linux-user/nios2/cpu_loop.c @@ -43,6 +43,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: switch (env->error_code) { case 0: diff --git a/target/nios2/op_helper.c b/target/nios2/op_helper.c index c93b66c9aa..849867becd 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 f7bab0908b..1e784c8a37 100644 --- a/target/nios2/translate.c +++ b/target/nios2/translate.c @@ -170,11 +170,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; }