From nobody Sun Nov 9 16:00:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.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 (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1551157820272594.2322122802682; Mon, 25 Feb 2019 21:10:20 -0800 (PST) Received: from localhost ([127.0.0.1]:48985 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gyV0R-0000Le-5V for importer@patchew.org; Tue, 26 Feb 2019 00:10:15 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58065) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gyUlF-0005N8-GV for qemu-devel@nongnu.org; Mon, 25 Feb 2019 23:54:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gyUl9-0002rl-Js for qemu-devel@nongnu.org; Mon, 25 Feb 2019 23:54:32 -0500 Received: from ozlabs.org ([203.11.71.1]:34363) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gyUl8-0002RC-V2; Mon, 25 Feb 2019 23:54:27 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 447mfM2wj9z9sNs; Tue, 26 Feb 2019 15:53:14 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1551156795; bh=GoLZPvQDPKMmAeb7q1xrafbfQqrylttjZ46NnBjuNy4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lREdDDgV1IAc577biC/AbUQS5i58zc74Ngi52bayBwlyy7gG3KHIsFvMjBxBIEcMw MKAlMMCzSTRdoJjYt0QlQBqeNUZonb/cld/sauIm1GTB09ZaGdOxklPo6YALzZOFZe iJQT8MrY9cdzlTUZGULi5t0awQRVmpU/mcRHXS2c= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 26 Feb 2019 15:52:42 +1100 Message-Id: <20190226045304.25618-29-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190226045304.25618-1-david@gibson.dropbear.id.au> References: <20190226045304.25618-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 28/50] target/ppc: Basic POWER9 bare-metal radix MMU support 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: lvivier@redhat.com, gkurz@kaod.org, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Benjamin Herrenschmidt No guest support yet Signed-off-by: Benjamin Herrenschmidt Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190215170029.15641-13-clg@kaod.org> Signed-off-by: David Gibson --- target/ppc/mmu-radix64.c | 81 ++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c index a07d757063..ca1fb2673f 100644 --- a/target/ppc/mmu-radix64.c +++ b/target/ppc/mmu-radix64.c @@ -31,10 +31,26 @@ static bool ppc_radix64_get_fully_qualified_addr(CPUPPCState *env, vaddr e= addr, uint64_t *lpid, uint64_t = *pid) { - /* We don't have HV support yet and shouldn't get here with it set any= way */ - assert(!msr_hv); - - if (!msr_hv) { /* !MSR[HV] -> Guest */ + if (msr_hv) { /* MSR[HV] -> Hypervisor/bare metal */ + switch (eaddr & R_EADDR_QUADRANT) { + case R_EADDR_QUADRANT0: + *lpid =3D 0; + *pid =3D env->spr[SPR_BOOKS_PID]; + break; + case R_EADDR_QUADRANT1: + *lpid =3D env->spr[SPR_LPIDR]; + *pid =3D env->spr[SPR_BOOKS_PID]; + break; + case R_EADDR_QUADRANT2: + *lpid =3D env->spr[SPR_LPIDR]; + *pid =3D 0; + break; + case R_EADDR_QUADRANT3: + *lpid =3D 0; + *pid =3D 0; + break; + } + } else { /* !MSR[HV] -> Guest */ switch (eaddr & R_EADDR_QUADRANT) { case R_EADDR_QUADRANT0: /* Guest application */ *lpid =3D env->spr[SPR_LPIDR]; @@ -186,21 +202,32 @@ static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu= , vaddr eaddr, raddr, psize, fault_cause, pte_addr); } =20 +static bool validate_pate(PowerPCCPU *cpu, uint64_t lpid, ppc_v3_pate_t *p= ate) +{ + CPUPPCState *env =3D &cpu->env; + + if (!(pate->dw0 & PATE0_HR)) { + return false; + } + if (lpid =3D=3D 0 && !msr_hv) { + return false; + } + /* More checks ... */ + return true; +} + int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx) { CPUState *cs =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; - PPCVirtualHypervisorClass *vhc =3D - PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); + PPCVirtualHypervisorClass *vhc; hwaddr raddr, pte_addr; uint64_t lpid =3D 0, pid =3D 0, offset, size, prtbe0, pte; int page_size, prot, fault_cause =3D 0; ppc_v3_pate_t pate; =20 assert((rwx =3D=3D 0) || (rwx =3D=3D 1) || (rwx =3D=3D 2)); - assert(!msr_hv); /* For now there is no Radix PowerNV Support */ - assert(cpu->vhyp); assert(ppc64_use_proc_tbl(cpu)); =20 /* Real Mode Access */ @@ -221,7 +248,23 @@ int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vadd= r eaddr, int rwx, } =20 /* Get Process Table */ - vhc->get_pate(cpu->vhyp, &pate); + if (cpu->vhyp) { + vhc =3D PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); + vhc->get_pate(cpu->vhyp, &pate); + } else { + if (!ppc64_v3_get_pate(cpu, lpid, &pate)) { + ppc_radix64_raise_si(cpu, rwx, eaddr, DSISR_NOPTE); + return 1; + } + if (!validate_pate(cpu, lpid, &pate)) { + ppc_radix64_raise_si(cpu, rwx, eaddr, DSISR_R_BADCONFIG); + } + /* We don't support guest mode yet */ + if (lpid !=3D 0) { + error_report("PowerNV guest support Unimplemented"); + exit(1); + } + } =20 /* Index Process Table by PID to Find Corresponding Process Table Entr= y */ offset =3D pid * sizeof(struct prtb_entry); @@ -256,8 +299,7 @@ hwaddr ppc_radix64_get_phys_page_debug(PowerPCCPU *cpu,= target_ulong eaddr) { CPUState *cs =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; - PPCVirtualHypervisorClass *vhc =3D - PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); + PPCVirtualHypervisorClass *vhc; hwaddr raddr, pte_addr; uint64_t lpid =3D 0, pid =3D 0, offset, size, prtbe0, pte; int page_size, fault_cause =3D 0; @@ -275,7 +317,22 @@ hwaddr ppc_radix64_get_phys_page_debug(PowerPCCPU *cpu= , target_ulong eaddr) } =20 /* Get Process Table */ - vhc->get_pate(cpu->vhyp, &pate); + if (cpu->vhyp) { + vhc =3D PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); + vhc->get_pate(cpu->vhyp, &pate); + } else { + if (!ppc64_v3_get_pate(cpu, lpid, &pate)) { + return -1; + } + if (!validate_pate(cpu, lpid, &pate)) { + return -1; + } + /* We don't support guest mode yet */ + if (lpid !=3D 0) { + error_report("PowerNV guest support Unimplemented"); + exit(1); + } + } =20 /* Index Process Table by PID to Find Corresponding Process Table Entr= y */ offset =3D pid * sizeof(struct prtb_entry); --=20 2.20.1