From nobody Thu Oct 30 15:35:21 2025 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; dkim=fail; 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525802338967539.583665762482; Tue, 8 May 2018 10:58:58 -0700 (PDT) Received: from localhost ([::1]:52712 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fG6t8-0001pR-42 for importer@patchew.org; Tue, 08 May 2018 13:58:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44251) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fG6Tg-0000Do-Ml for qemu-devel@nongnu.org; Tue, 08 May 2018 13:32:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fG6Tf-0005Za-Dq for qemu-devel@nongnu.org; Tue, 08 May 2018 13:32:40 -0400 Received: from mail-lf0-x241.google.com ([2a00:1450:4010:c07::241]:45859) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fG6Tf-0005ZE-1W for qemu-devel@nongnu.org; Tue, 08 May 2018 13:32:39 -0400 Received: by mail-lf0-x241.google.com with SMTP id q2-v6so1857539lfc.12 for ; Tue, 08 May 2018 10:32:38 -0700 (PDT) Received: from gmail.com (81-231-232-130-no39.tbcn.telia.com. [81.231.232.130]) by smtp.gmail.com with ESMTPSA id t24-v6sm4837480ljg.65.2018.05.08.10.32.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 08 May 2018 10:32:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=haZ8zrLPieTzt/CtJg4OCdhZKVA9aRCUpazbfhsD940=; b=dNqvBZ/e+xYLtdyqwhKkP2XqHIQ9D+V0+TIkF4GR1xyoeQhTO7+F1hMrXHOFxDoPxU Wa/ky9Qwrggl222cs3qibyoO3gi7a2XA89yXNfjn0fh0CJJ4KaUfm644xL6bIV/oZidb Ebtyn7eGDgi6XQnfsmQY8RRIIO/UJ6akAufw8y5eMpJdF7q4PQVZMno2qh4xb7G0jQnV sk5fzlpadf0WZ0NlTZyCtOVFAPX26qaMxSNSQEsdpa90yhZtEkAQEF8Vm9sjzJgQHG4c 4fDUJBx0GnODFpOyzAjACRxyOI7R7VvZJVP0H3LgJnHLDFkUZB2VOSTLyF4REgH9/sfP Jqvw== 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; bh=haZ8zrLPieTzt/CtJg4OCdhZKVA9aRCUpazbfhsD940=; b=hns0t/SwU5Mi4X8SGWDo0VnK6yl7DvtHtEsRAcsvZnr7RQkcwqYeBG7VkliunUZohd 5yVdiOY7IvGEwlRKK5T6sBRqPMrR6jPF8WkydpMbewBtGfzfS2sP7RTd7FVsRK/HrWyg fhENfESqfQMtf7FLZTSFpoCgOVUQkfYcfABYpXz+TnZiQnHwuPxsJ/zSTTHGz58TVgS0 alUo0nOgwG/5RSh5ws/eKVpx0IWpFV0ZaehORejwcLS8LDN5WRVODDTGXg0UbHIEQRgR 4UEs8tr2qwoPQX8cBaeQHSJx79ddHegKTR9AVTpM8Q3fGLJ5JeIR4TgCpSEd0Za+w7qt ILiw== X-Gm-Message-State: ALKqPwehKOMrZXtjbgYwvUjvkThaM9WURWuFs9dRlis3MIoB/4gG1wlP zJEzpa3Mgnmxsa5eGpu/gZA6ng== X-Google-Smtp-Source: AB8JxZr86bQLic6I96Z5LpoWEe3VvbxFMjv4WUlKpGA9B3p8D6p7vov6FKhM5ugCtFhma8dPD91EGQ== X-Received: by 2002:a19:13ce:: with SMTP id 75-v6mr6961101lft.106.1525800757458; Tue, 08 May 2018 10:32:37 -0700 (PDT) From: "Edgar E. Iglesias" To: qemu-devel@nongnu.org Date: Tue, 8 May 2018 19:31:44 +0200 Message-Id: <20180508173152.29327-29-edgar.iglesias@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180508173152.29327-1-edgar.iglesias@gmail.com> References: <20180508173152.29327-1-edgar.iglesias@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::241 Subject: [Qemu-devel] [PATCH v2 28/36] target-microblaze: Add support for extended access to TLBLO 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: edgar.iglesias@xilinx.com, peter.maydell@linaro.org, sai.pavan.boddu@xilinx.com, frasse.iglesias@gmail.com, alistair@alistair23.me, richard.henderson@linaro.org, frederic.konrad@adacore.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Edgar E. Iglesias" Add support for extended access to TLBLO's upper 32 bits. Signed-off-by: Edgar E. Iglesias --- target/microblaze/helper.h | 4 ++-- target/microblaze/mmu.c | 18 ++++++++++++++---- target/microblaze/mmu.h | 4 ++-- target/microblaze/op_helper.c | 8 ++++---- target/microblaze/translate.c | 24 ++++++++++++++++-------- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/target/microblaze/helper.h b/target/microblaze/helper.h index ce70353936..2f8bdea22b 100644 --- a/target/microblaze/helper.h +++ b/target/microblaze/helper.h @@ -25,8 +25,8 @@ DEF_HELPER_3(fcmp_ge, i32, env, i32, i32) =20 DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_NO_RWG_SE, i32, i32, i32) #if !defined(CONFIG_USER_ONLY) -DEF_HELPER_2(mmu_read, i32, env, i32) -DEF_HELPER_3(mmu_write, void, env, i32, i32) +DEF_HELPER_3(mmu_read, i32, env, i32, i32) +DEF_HELPER_4(mmu_write, void, env, i32, i32, i32) #endif =20 DEF_HELPER_5(memalign, void, env, tl, i32, i32, i32) diff --git a/target/microblaze/mmu.c b/target/microblaze/mmu.c index 166c79908c..9ecffb2c9c 100644 --- a/target/microblaze/mmu.c +++ b/target/microblaze/mmu.c @@ -180,7 +180,7 @@ done: } =20 /* Writes/reads to the MMU's special regs end up here. */ -uint32_t mmu_read(CPUMBState *env, uint32_t rn) +uint32_t mmu_read(CPUMBState *env, bool ext, uint32_t rn) { unsigned int i; uint32_t r =3D 0; @@ -189,6 +189,10 @@ uint32_t mmu_read(CPUMBState *env, uint32_t rn) qemu_log_mask(LOG_GUEST_ERROR, "MMU access on MMU-less system\n"); return 0; } + if (ext && rn !=3D MMU_R_TLBLO) { + qemu_log_mask(LOG_GUEST_ERROR, "Extended access only to TLBLO.\n"); + return 0; + } =20 switch (rn) { /* Reads to HI/LO trig reads from the mmu rams. */ @@ -200,7 +204,7 @@ uint32_t mmu_read(CPUMBState *env, uint32_t rn) } =20 i =3D env->mmu.regs[MMU_R_TLBX] & 0xff; - r =3D env->mmu.rams[rn & 1][i]; + r =3D extract64(env->mmu.rams[rn & 1][i], ext * 32, 32); if (rn =3D=3D MMU_R_TLBHI) env->mmu.regs[MMU_R_PID] =3D env->mmu.tids[i]; break; @@ -226,9 +230,10 @@ uint32_t mmu_read(CPUMBState *env, uint32_t rn) return r; } =20 -void mmu_write(CPUMBState *env, uint32_t rn, uint32_t v) +void mmu_write(CPUMBState *env, bool ext, uint32_t rn, uint32_t v) { MicroBlazeCPU *cpu =3D mb_env_get_cpu(env); + uint64_t tmp64; unsigned int i; D(qemu_log("%s rn=3D%d=3D%x old=3D%x\n", __func__, rn, v, env->mmu.reg= s[rn])); =20 @@ -236,6 +241,10 @@ void mmu_write(CPUMBState *env, uint32_t rn, uint32_t = v) qemu_log_mask(LOG_GUEST_ERROR, "MMU access on MMU-less system\n"); return; } + if (ext && rn !=3D MMU_R_TLBLO) { + qemu_log_mask(LOG_GUEST_ERROR, "Extended access only to TLBLO.\n"); + return; + } =20 switch (rn) { /* Writes to HI/LO trig writes to the mmu rams. */ @@ -250,7 +259,8 @@ void mmu_write(CPUMBState *env, uint32_t rn, uint32_t v) env->mmu.tids[i] =3D env->mmu.regs[MMU_R_PID] & 0xff; mmu_flush_idx(env, i); } - env->mmu.rams[rn & 1][i] =3D v; + tmp64 =3D env->mmu.rams[rn & 1][i]; + env->mmu.rams[rn & 1][i] =3D deposit64(tmp64, ext * 32, 32, v); =20 D(qemu_log("%s ram[%d][%d]=3D%x\n", __func__, rn & 1, i, v)); break; diff --git a/target/microblaze/mmu.h b/target/microblaze/mmu.h index 9fbdf38f36..a4272b6356 100644 --- a/target/microblaze/mmu.h +++ b/target/microblaze/mmu.h @@ -90,6 +90,6 @@ struct microblaze_mmu_lookup unsigned int mmu_translate(struct microblaze_mmu *mmu, struct microblaze_mmu_lookup *lu, target_ulong vaddr, int rw, int mmu_idx); -uint32_t mmu_read(CPUMBState *env, uint32_t rn); -void mmu_write(CPUMBState *env, uint32_t rn, uint32_t v); +uint32_t mmu_read(CPUMBState *env, bool ea, uint32_t rn); +void mmu_write(CPUMBState *env, bool ea, uint32_t rn, uint32_t v); void mmu_init(struct microblaze_mmu *mmu); diff --git a/target/microblaze/op_helper.c b/target/microblaze/op_helper.c index 4dc3aff84b..ddc1f71d62 100644 --- a/target/microblaze/op_helper.c +++ b/target/microblaze/op_helper.c @@ -476,14 +476,14 @@ void helper_stackprot(CPUMBState *env, target_ulong a= ddr) =20 #if !defined(CONFIG_USER_ONLY) /* Writes/reads to the MMU's special regs end up here. */ -uint32_t helper_mmu_read(CPUMBState *env, uint32_t rn) +uint32_t helper_mmu_read(CPUMBState *env, uint32_t ext, uint32_t rn) { - return mmu_read(env, rn); + return mmu_read(env, ext, rn); } =20 -void helper_mmu_write(CPUMBState *env, uint32_t rn, uint32_t v) +void helper_mmu_write(CPUMBState *env, uint32_t ext, uint32_t rn, uint32_t= v) { - mmu_write(env, rn, v); + mmu_write(env, ext, rn, v); } =20 void mb_cpu_unassigned_access(CPUState *cs, hwaddr addr, diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c index 9a8f1918ad..bed86dc805 100644 --- a/target/microblaze/translate.c +++ b/target/microblaze/translate.c @@ -459,7 +459,7 @@ static void dec_msr(DisasContext *dc) CPUState *cs =3D CPU(dc->cpu); TCGv_i32 t0, t1; unsigned int sr, rn; - bool to, clrset, extended; + bool to, clrset, extended =3D false; =20 sr =3D extract32(dc->imm, 0, 14); to =3D extract32(dc->imm, 14, 1); @@ -467,9 +467,14 @@ static void dec_msr(DisasContext *dc) dc->type_b =3D 1; if (to) { dc->cpustate_changed =3D 1; - extended =3D extract32(dc->imm, 24, 1); - } else { - extended =3D extract32(dc->imm, 19, 1); + } + + /* Extended MSRs are only available if addr_size > 32. */ + if (dc->cpu->cfg.addr_size > 32) { + /* The E-bit is encoded differently for To/From MSR. */ + static const unsigned int e_bit[] =3D { 19, 24 }; + + extended =3D extract32(dc->imm, e_bit[to], 1); } =20 /* msrclr and msrset. */ @@ -518,10 +523,13 @@ static void dec_msr(DisasContext *dc) if ((sr & ~0xff) =3D=3D 0x1000) { sr &=3D 7; LOG_DIS("m%ss sr%d r%d imm=3D%x\n", to ? "t" : "f", sr, dc->ra, dc= ->imm); - if (to) - gen_helper_mmu_write(cpu_env, tcg_const_i32(sr), cpu_R[dc->ra]= ); - else - gen_helper_mmu_read(cpu_R[dc->rd], cpu_env, tcg_const_i32(sr)); + if (to) { + gen_helper_mmu_write(cpu_env, tcg_const_i32(extended), + tcg_const_i32(sr), cpu_R[dc->ra]); + } else { + gen_helper_mmu_read(cpu_R[dc->rd], cpu_env, + tcg_const_i32(extended), tcg_const_i32(sr)= ); + } return; } #endif --=20 2.14.1