qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: David Gibson <david@gibson.dropbear.id.au>,
	benh@kernel.crashing.org, mdroth@linux.vnet.ibm.com
Cc: lvivier@redhat.com, thuth@redhat.com, qemu-ppc@nongnu.org,
	agraf@suse.de, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/2] ppc: Move HPTE size parsing code to target-ppc helper (and add 64kiB pages)
Date: Fri, 8 Jan 2016 14:31:13 +1100	[thread overview]
Message-ID: <568F2D81.9090606@ozlabs.ru> (raw)
In-Reply-To: <1450665670-18323-2-git-send-email-david@gibson.dropbear.id.au>

On 12/21/2015 01:41 PM, David Gibson wrote:
> The h_enter() hypercall implementation in spapr_hcall.c contains some code
> to determine the page size of the newly inserted hash PTE.  This is
> surprisingly complex in the general case, because POWER CPUs can have
> different implementation dependent ways of encoding page sizes.  The
> current version assumes POWER7 or POWER8 and doesn't support all the

s/and doesn't/doesn't/ ?


> possibilities of even those (but this is advertised correctly in the device
> tree and so works with guests).
>
> To support the possibility of future CPUs with different options, however,
> this really belongs in the core ppc mmu code, rather than the spapr
> ("pseries" machine type) specific code.
>
> So, move this code to a helper in target-ppc.
>
> At the same time, uncomment some code to allow 64kiB pages.  At the time
> that was added, I believe other parts of the ppc mmu code didn't handle
> 64kiB pages, but that's since been fixed.
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>   hw/ppc/spapr_hcall.c    | 26 ++++++++------------------
>   target-ppc/mmu-hash64.c | 31 +++++++++++++++++++++++++++++++
>   target-ppc/mmu-hash64.h |  3 +++
>   3 files changed, 42 insertions(+), 18 deletions(-)
>
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index cebceea..c346e97 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -93,28 +93,18 @@ static target_ulong h_enter(PowerPCCPU *cpu, sPAPRMachineState *spapr,
>       target_ulong pte_index = args[1];
>       target_ulong pteh = args[2];
>       target_ulong ptel = args[3];
> -    target_ulong page_shift = 12;
> +    int page_shift;
> +    uint64_t avpnm;
>       target_ulong raddr;
>       target_ulong index;
>       uint64_t token;
>
> -    /* only handle 4k and 16M pages for now */
> -    if (pteh & HPTE64_V_LARGE) {
> -#if 0 /* We don't support 64k pages yet */
> -        if ((ptel & 0xf000) == 0x1000) {
> -            /* 64k page */
> -        } else
> -#endif
> -        if ((ptel & 0xff000) == 0) {
> -            /* 16M page */
> -            page_shift = 24;
> -            /* lowest AVA bit must be 0 for 16M pages */
> -            if (pteh & 0x80) {
> -                return H_PARAMETER;
> -            }
> -        } else {
> -            return H_PARAMETER;
> -        }
> +    if (ppc_hash64_hpte_shift(pteh, ptel, &page_shift, &avpnm) < 0) {
> +        return H_PARAMETER;
> +    }
> +
> +    if (HPTE64_V_AVPN_VAL(pteh) & avpnm) {


HPTE64_V_AVPN_VAL(pteh) & ((1ULL << page_shift) >> 23)
should do the same thing, no?



> +        return H_PARAMETER;
>       }
>
>       raddr = (ptel & HPTE64_R_RPN) & ~((1ULL << page_shift) - 1);
> diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c
> index 34e20fa..d3b895d 100644
> --- a/target-ppc/mmu-hash64.c
> +++ b/target-ppc/mmu-hash64.c
> @@ -399,6 +399,37 @@ static uint64_t ppc_hash64_page_shift(ppc_slb_t *slb)
>       return epnshift;
>   }
>
> +/* Returns the page shift of the given hpte.  This is the "base"
> + * shift, used for hashing.  Although we don't implement it yet, the
> + * architecture allows the actuall mapped page to be larger, but


s/actuall/actual/


> + * determining that size requires information from the slb. */
> +int ppc_hash64_hpte_shift(uint64_t pte0, uint64_t pte1,
> +                          int *shift, uint64_t *avpnm)
> +{
> +    *shift = 12; /* 4kiB default */
> +
> +    /* only handle 4k and 16M pages for now */
> +    if (pte0 & HPTE64_V_LARGE) {
> +        if ((pte1 & 0xf000) == 0x1000) {


Nit: it would improve readability of this code if HPTE64_R_KEY()&co was 
used. What does define these "key" bits meaning?


> +            *shift = 16; /* 64 kiB */
> +        } else if ((pte1 & 0xff000) == 0) {
> +            *shift = 24; /* 16MiB */
> +        } else {
> +            return -EINVAL;
> +        }
> +    }
> +
> +    if (avpnm) {
> +        if (*shift <= 23) {
> +            *avpnm = 0;
> +        } else {
> +            *avpnm = (1ULL << (*shift - 23)) - 1;
> +        }
> +    }


What does "avpnm" stand for? Abbreviated virtual page <something> mask?

If you dropped "if(avpnm)", you could move "*avpnm = 0;" to the beginning 
and "*avpnm = (1ULL << (*shift - 23)) - 1;" next to "*shift = 24;".



> +
> +    return 0;
> +}
> +
>   static hwaddr ppc_hash64_htab_lookup(CPUPPCState *env,
>                                        ppc_slb_t *slb, target_ulong eaddr,
>                                        ppc_hash_pte64_t *pte)
> diff --git a/target-ppc/mmu-hash64.h b/target-ppc/mmu-hash64.h
> index 291750f..71d2532 100644
> --- a/target-ppc/mmu-hash64.h
> +++ b/target-ppc/mmu-hash64.h
> @@ -117,6 +117,9 @@ typedef struct {
>       uint64_t pte0, pte1;
>   } ppc_hash_pte64_t;
>
> +int ppc_hash64_hpte_shift(uint64_t pte0, uint64_t pte1,
> +                          int *shift, uint64_t *avpnm);
> +
>   #endif /* CONFIG_USER_ONLY */
>
>   #endif /* !defined (__MMU_HASH64_H__) */
>


-- 
Alexey

  reply	other threads:[~2016-01-08  3:31 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-21  2:41 [Qemu-devel] [PATCH 0/2] 64kiB page support for TCG guests with POWER8 CPU David Gibson
2015-12-21  2:41 ` [Qemu-devel] [PATCH 1/2] ppc: Move HPTE size parsing code to target-ppc helper (and add 64kiB pages) David Gibson
2016-01-08  3:31   ` Alexey Kardashevskiy [this message]
2015-12-21  2:41 ` [Qemu-devel] [PATCH 2/2] ppc: Allow 64kiB pages for POWER8 in TCG David Gibson
2015-12-21  2:49   ` Benjamin Herrenschmidt
2016-01-08  3:56   ` Alexey Kardashevskiy
2016-01-12  0:26     ` David Gibson
2016-01-12  4:30       ` Alexey Kardashevskiy
2016-01-12  4:33         ` David Gibson
2016-01-12  5:39           ` Alexey Kardashevskiy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=568F2D81.9090606@ozlabs.ru \
    --to=aik@ozlabs.ru \
    --cc=agraf@suse.de \
    --cc=benh@kernel.crashing.org \
    --cc=david@gibson.dropbear.id.au \
    --cc=lvivier@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).