From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVy4j-0005zr-8y for qemu-devel@nongnu.org; Thu, 21 Jun 2018 07:48:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVy4g-0008TC-6K for qemu-devel@nongnu.org; Thu, 21 Jun 2018 07:48:29 -0400 Received: from 5.mo179.mail-out.ovh.net ([46.105.43.140]:36401) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fVy4f-0008SR-W0 for qemu-devel@nongnu.org; Thu, 21 Jun 2018 07:48:26 -0400 Received: from player793.ha.ovh.net (unknown [10.109.105.16]) by mo179.mail-out.ovh.net (Postfix) with ESMTP id 0BFD7D3AF2 for ; Thu, 21 Jun 2018 13:48:23 +0200 (CEST) Date: Thu, 21 Jun 2018 13:48:12 +0200 From: Greg Kurz Message-ID: <20180621134812.51a02a72@bahia.lan> In-Reply-To: <20180618063606.2513-8-david@gibson.dropbear.id.au> References: <20180618063606.2513-1-david@gibson.dropbear.id.au> <20180618063606.2513-8-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 7/9] target/ppc: Add ppc_hash64_filter_pagesizes() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: abologna@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, aik@ozlabs.ru On Mon, 18 Jun 2018 16:36:04 +1000 David Gibson wrote: > The paravirtualized PAPR platform sometimes needs to restrict the guest to > using only some of the page sizes actually supported by the host's MMU. > At the moment this is handled in KVM specific code, but for consistency we > want to apply the same limitations to all accelerators. > > This makes a start on this by providing a helper function in the cpu code > to allow platform code to remove some of the cpu's page size definitions > via a caller supplied callback. > > Signed-off-by: David Gibson > --- Reviewed-by: Greg Kurz > target/ppc/mmu-hash64.c | 59 +++++++++++++++++++++++++++++++++++++++++ > target/ppc/mmu-hash64.h | 3 +++ > 2 files changed, 62 insertions(+) > > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c > index aa200cba4c..276d9015e7 100644 > --- a/target/ppc/mmu-hash64.c > +++ b/target/ppc/mmu-hash64.c > @@ -1166,3 +1166,62 @@ const PPCHash64Options ppc_hash64_opts_POWER7 = { > }, > } > }; > + > +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, > + bool (*cb)(void *, uint32_t, uint32_t), > + void *opaque) > +{ > + PPCHash64Options *opts = cpu->hash64_opts; > + int i; > + int n = 0; > + bool ci_largepage = false; > + > + assert(opts); > + > + n = 0; > + for (i = 0; i < ARRAY_SIZE(opts->sps); i++) { > + PPCHash64SegmentPageSizes *sps = &opts->sps[i]; > + int j; > + int m = 0; > + > + assert(n <= i); > + > + if (!sps->page_shift) { > + break; > + } > + > + for (j = 0; j < ARRAY_SIZE(sps->enc); j++) { > + PPCHash64PageSize *ps = &sps->enc[j]; > + > + assert(m <= j); > + if (!ps->page_shift) { > + break; > + } > + > + if (cb(opaque, sps->page_shift, ps->page_shift)) { > + if (ps->page_shift >= 16) { > + ci_largepage = true; > + } > + sps->enc[m++] = *ps; > + } > + } > + > + /* Clear rest of the row */ > + for (j = m; j < ARRAY_SIZE(sps->enc); j++) { > + memset(&sps->enc[j], 0, sizeof(sps->enc[j])); > + } > + > + if (m) { > + n++; > + } > + } > + > + /* Clear the rest of the table */ > + for (i = n; i < ARRAY_SIZE(opts->sps); i++) { > + memset(&opts->sps[i], 0, sizeof(opts->sps[i])); > + } > + > + if (!ci_largepage) { > + opts->flags &= ~PPC_HASH64_CI_LARGEPAGE; > + } > +} > diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h > index 53dcec5b93..f11efc9cbc 100644 > --- a/target/ppc/mmu-hash64.h > +++ b/target/ppc/mmu-hash64.h > @@ -20,6 +20,9 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu, > void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val); > void ppc_hash64_init(PowerPCCPU *cpu); > void ppc_hash64_finalize(PowerPCCPU *cpu); > +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, > + bool (*cb)(void *, uint32_t, uint32_t), > + void *opaque); > #endif > > /*