From nobody Wed Oct 29 11:52:30 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 1525340683270387.84555548366836; Thu, 3 May 2018 02:44:43 -0700 (PDT) Received: from localhost ([::1]:54975 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEAn4-00055m-Jg for importer@patchew.org; Thu, 03 May 2018 05:44:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55405) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEAPM-0001G4-4b for qemu-devel@nongnu.org; Thu, 03 May 2018 05:20:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEAPK-0005EV-Oe for qemu-devel@nongnu.org; Thu, 03 May 2018 05:20:12 -0400 Received: from mail-lf0-x241.google.com ([2a00:1450:4010:c07::241]:37528) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEAPK-0005E4-Cd for qemu-devel@nongnu.org; Thu, 03 May 2018 05:20:10 -0400 Received: by mail-lf0-x241.google.com with SMTP id b23-v6so24916305lfg.4 for ; Thu, 03 May 2018 02:20:10 -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 k14-v6sm2766098ljh.28.2018.05.03.02.20.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 03 May 2018 02:20:07 -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=BoHFURZH+vyKjtp8I7G9mjb89mrpUKTgF9iprmtXWSI=; b=VTLoZW93dv4rHJ/YzcmmjeBB/W0BmUolCmyThPzkJdjsVDy5mPfPmxiMosRTbqTrhI nVfJHqbk08DDDvGCUYDuobqvDpqHsgizD46tc/mSa3QASqzsf/X/lVCvQIEgqRmzzAXN Q3sq7A7z0eKz5kqxqxNyOvNHsgyTUGwCxIGE2gtjeN1II6Fc6+DT8QT5c0JQFiRtM1qL dKFuRRjNZ2dspniW4FPCg2MkFT1M/a1HBrsouPyOfmJvDUuFfVcQ9v7Qy18qJZezThX7 Obvc7xoE5M3OPUgpUnLntCwoe812aJMQpIh7j2Ic3IbGxu2s4Bq6mYHZYY6gI/qoFuKm s2uQ== 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=BoHFURZH+vyKjtp8I7G9mjb89mrpUKTgF9iprmtXWSI=; b=IbOLzHthXX2dcsX2C9eXegSEDGc8s6DDAyWS1Mv3ypTzB05oqh0LyV808NHXn0VrHG PLK9yCos52dVZCQ+4q3vmJ+LhJbLeFqzNCcIo+Ln3bs6rapGun5wYmTH5zh5F9x3sMsS K517Hd7m/mDEkAoX8VSip3qAULd1QgCL4AFcTSfrCXM6YbLylL084LVisHnu/72Vou+j cSM1qxwo5t1n86koG3gG2SUqNxliyTv8/xeU2anPrVEEZpYhIiozqAKmhdRPoytXSr9A v/KZtIi0DvoE85501s7dZNhF5w9ze0lwuSk24MV0+tKEw58gihrHM9p+dIi35HAr/G+D SWSg== X-Gm-Message-State: ALQs6tCZC2x3xzxnkz3lAVylv5ygJNopi7PMWv28e7mfZDjNmeBTNyCt 3Liouphmc4+e+SAmD5yJ0IrfOw== X-Google-Smtp-Source: AB8JxZqIRhhB0sA7Ku00zKVU9TV4vGNmk7UigPg5RAqvqXDOM0KpmHo/aGObf3PkmNB4gsjrtLOY8A== X-Received: by 2002:a19:9d4b:: with SMTP id g72-v6mr12420611lfe.7.1525339208831; Thu, 03 May 2018 02:20:08 -0700 (PDT) From: "Edgar E. Iglesias" To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 11:19:21 +0200 Message-Id: <20180503091922.28733-29-edgar.iglesias@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180503091922.28733-1-edgar.iglesias@gmail.com> References: <20180503091922.28733-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 v1 28/29] 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 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 65faa9b97f..cfaf04839d 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