From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50008) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aOFvO-0007gt-9x for qemu-devel@nongnu.org; Tue, 26 Jan 2016 21:33:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aOFvK-00015p-RS for qemu-devel@nongnu.org; Tue, 26 Jan 2016 21:33:38 -0500 Date: Wed, 27 Jan 2016 11:40:28 +1100 From: David Gibson Message-ID: <20160127004028.GH16692@voom.fritz.box> References: <1453698952-32092-1-git-send-email-david@gibson.dropbear.id.au> <1453698952-32092-6-git-send-email-david@gibson.dropbear.id.au> <56A6830A.2090806@suse.de> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="MP5ln1Rcf9Bvi+ZW" Content-Disposition: inline In-Reply-To: <56A6830A.2090806@suse.de> Subject: Re: [Qemu-devel] [PATCH 05/10] target-ppc: Use actual page size encodings from HPTE List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: lvivier@redhat.com, thuth@redhat.com, aik@ozlabs.ru, qemu-devel@nongnu.org, qemu-ppc@nongnu.org --MP5ln1Rcf9Bvi+ZW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Jan 25, 2016 at 09:18:18PM +0100, Alexander Graf wrote: >=20 >=20 > On 01/25/2016 06:15 AM, David Gibson wrote: > >At present the 64-bit hash MMU code uses information from the SLB to > >determine the page size of a translation. We do need that information to > >correctly look up the hash table. However the MMU also allows a > >possibly larger page size to be encoded into the HPTE itself, which is u= sed > >to populate the TLB. At present qemu doesn't check that, and so doesn't > >support the MPSS "Multiple Page Size per Segment" feature. > > > >This makes a start on allowing this, by adding an hpte_page_shift() > >function which looks up the page size of an HPTE. We use this to valida= te > >page sizes encodings on faults, and populate the qemu TLB with larger > >page sizes when appropriate. > > > >Signed-off-by: David Gibson > >--- > > target-ppc/mmu-hash64.c | 74 +++++++++++++++++++++++++++++++++++++++++= +++++--- > > 1 file changed, 70 insertions(+), 4 deletions(-) > > > >diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c > >index 28ad361..bcad826 100644 > >--- a/target-ppc/mmu-hash64.c > >+++ b/target-ppc/mmu-hash64.c > >@@ -21,6 +21,7 @@ > > #include "exec/helper-proto.h" > > #include "qemu/error-report.h" > > #include "sysemu/kvm.h" > >+#include "qemu/error-report.h" > > #include "kvm_ppc.h" > > #include "mmu-hash64.h" > >@@ -474,6 +475,43 @@ static hwaddr ppc_hash64_htab_lookup(PowerPCCPU *cp= u, > > return pte_offset; > > } > >+static unsigned hpte_page_shift(const struct ppc_one_seg_page_size *sps, > >+ uint64_t pte0, uint64_t pte1) > >+{ > >+ int i; > >+ > >+ if (!(pte0 & HPTE64_V_LARGE)) { > >+ if (sps->page_shift !=3D 12) { > >+ /* 4kiB page in a non 4kiB segment */ > >+ return 0; > >+ } > >+ /* Normal 4kiB page */ > >+ return 12; > >+ } > >+ > >+ for (i =3D 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) { > >+ const struct ppc_one_page_size *ps =3D &sps->enc[i]; > >+ uint64_t mask; > >+ > >+ if (!ps->page_shift) { > >+ break; > >+ } > >+ > >+ if (ps->page_shift =3D=3D 12) { > >+ /* L bit is set so this can't be a 4kiB page */ > >+ continue; > >+ } > >+ > >+ mask =3D ((1ULL << ps->page_shift) - 1) & HPTE64_R_RPN; > >+ > >+ if ((pte1 & mask) =3D=3D ps->pte_enc) { > >+ return ps->page_shift; > >+ } > >+ } > >+ > >+ return 0; /* Bad page size encoding */ > >+} > >+ > > static hwaddr ppc_hash64_pte_raddr(unsigned page_shift, ppc_hash_pte64= _t pte, > > target_ulong eaddr) > > { > >@@ -489,6 +527,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, tar= get_ulong eaddr, > > CPUState *cs =3D CPU(cpu); > > CPUPPCState *env =3D &cpu->env; > > ppc_slb_t *slb; > >+ unsigned apshift; > > hwaddr pte_offset; > > ppc_hash_pte64_t pte; > > int pp_prot, amr_prot, prot; > >@@ -552,6 +591,28 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, ta= rget_ulong eaddr, > > qemu_log_mask(CPU_LOG_MMU, > > "found PTE at offset %08" HWADDR_PRIx "\n", pte_offset= ); > >+ /* Validate page size encoding */ > >+ apshift =3D hpte_page_shift(slb->sps, pte.pte0, pte.pte1); > >+ if (!apshift) { > >+ error_report("Bad page size encoding in HPTE 0x%"PRIx64" - 0x%"= PRIx64 > >+ " @ 0x%"HWADDR_PRIx, pte.pte0, pte.pte1, pte_offse= t); > >+ /* Treat it like a hash miss for the guest */ > >+ if (rwx =3D=3D 2) { > >+ cs->exception_index =3D POWERPC_EXCP_ISI; > >+ env->error_code =3D 0x40000000; > >+ } else { > >+ cs->exception_index =3D POWERPC_EXCP_DSI; > >+ env->error_code =3D 0; > >+ env->spr[SPR_DAR] =3D eaddr; > >+ if (rwx =3D=3D 1) { > >+ env->spr[SPR_DSISR] =3D 0x42000000; > >+ } else { > >+ env->spr[SPR_DSISR] =3D 0x40000000; >=20 > I know that we don't do this for any other DSISR setting yet, but do you > think we could mark the start here and use names for the bits instead? The > kernel has a few nice defines. So, that would be a bit odd, since it's just a copy of the exception code from below. But in fact, BenH pointed out that throwing a machine check is probably more correct behaviour than a DSI or ISI, so this will go away anyway. --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --MP5ln1Rcf9Bvi+ZW Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJWqBH8AAoJEGw4ysog2bOS21gQALlcBtHfwGE2ZSJ2EP+fDwec Q5fUIW026Ww64TaBfBSadNCj+aa5mRqArE1Ayo/3hZxXWc+roqOLzDK1CZIKfAvb HWy+jvIF2g8u/aR0IKEg+LZWZYJzg1mLxJvO7J5VRbKpV8Ly2aWagNwJhbUXJccE eOA/s3oebS9sq4vOWpxQ6PxIXNfVKzVsTZzrdEPh6RAlTScM3N5nq1+ijV0CdR0q mHpVhscpruufml0PnAzRhtIFbcKoiyQnzHWk1FRLRcAyrkBE0mJen3GmBuI6fdR/ BEUuYWlft19p6GXOeN2QCC6unSPUoCUKvD6j7eUXg4nZkoI6HWdlv3NcUJy+WNOt RTACTQ++czeQFzigt/ma1l1yYETWQPQrhDjY3LkVW6YN8o356lmRHn9qJ8joDbUV 8qtwp1cBwS7swktSO98MoVSgIe+fQ2NMo93ittHUSa/cX7+yF87sMxMfmkBplr1F QZM29Q//T2NRNtMF5HZeOmYCgEnrrSdTLXYATWhZVMmc6+nZLZTnjbAyw0fGxcDp PdIGuIk4Us6PT7el1mQiI+AmF8diNpzIVfuT+DA+jLQJzruiT3KX6p4w6SV1y6Ek 2bjdeswAmxtYu1MFpEn7cqb2R6/pKcNlL5feuOllHivzgoHxwVuK++OhOnNGmLUF HJkYDCtz4lSUkWozgxZa =RMoF -----END PGP SIGNATURE----- --MP5ln1Rcf9Bvi+ZW--