All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@kaod.org>
To: Greg Kurz <groug@kaod.org>
Cc: Suraj Jitindar Singh <sjitindarsingh@gmail.com>,
	qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
	Nicholas Piggin <npiggin@gmail.com>,
	David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [PATCH 5/7] target/ppc: Rework ppc_radix64_walk_tree() for partition-scoped translation
Date: Tue, 31 Mar 2020 11:10:20 +0200	[thread overview]
Message-ID: <ad71ef52-835f-f250-afc1-579e4f070c44@kaod.org> (raw)
In-Reply-To: <20200330170610.38a5ce61@bahia.lan>

On 3/30/20 7:00 PM, Greg Kurz wrote:
> On Mon, 30 Mar 2020 11:49:44 +0200
> Cédric Le Goater <clg@kaod.org> wrote:
> 
>> The ppc_radix64_walk_tree() routine walks through the nested radix
>> tables to look for a PTE.
>>
>> Split it two and introduce a new routine ppc_radix64_next_level()
> 
> Split it in two...
> 
>> which we will use for partition-scoped Radix translation when
>> translating the process tree addresses.
>>
>> Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>>  target/ppc/mmu-radix64.c | 50 ++++++++++++++++++++++++++--------------
>>  1 file changed, 33 insertions(+), 17 deletions(-)
>>
>> diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c
>> index b4e6abcd2d35..136498111f60 100644
>> --- a/target/ppc/mmu-radix64.c
>> +++ b/target/ppc/mmu-radix64.c
>> @@ -162,44 +162,60 @@ static void ppc_radix64_set_rc(PowerPCCPU *cpu, int rwx, uint64_t pte,
>>      }
>>  }
>>  
>> -static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, vaddr eaddr,
>> -                                      uint64_t base_addr, uint64_t nls,
>> -                                      hwaddr *raddr, int *psize,
>> -                                      int *fault_cause, hwaddr *pte_addr)
>> +static uint64_t ppc_radix64_next_level(PowerPCCPU *cpu, vaddr eaddr,
>> +                                       uint64_t *pte_addr, uint64_t *nls,
>> +                                       int *psize, int *fault_cause)
>>  {
>>      CPUState *cs = CPU(cpu);
>>      uint64_t index, pde;
>>  
>> -    if (nls < 5) { /* Directory maps less than 2**5 entries */
>> +    if (*nls < 5) { /* Directory maps less than 2**5 entries */
>>          *fault_cause |= DSISR_R_BADCONFIG;
>>          return 0;
>>      }
>>  
> 
> I think this should stay in the caller...
> 
>>      /* Read page <directory/table> entry from guest address space */
>> -    index = eaddr >> (*psize - nls); /* Shift */
>> -    index &= ((1UL << nls) - 1); /* Mask */
>> -    pde = ldq_phys(cs->as, base_addr + (index * sizeof(pde)));
>> -    if (!(pde & R_PTE_VALID)) { /* Invalid Entry */
>> +    pde = ldq_phys(cs->as, *pte_addr);
>> +    if (!(pde & R_PTE_VALID)) {         /* Invalid Entry */
>>          *fault_cause |= DSISR_NOPTE;
>>          return 0;
>>      }
>>  
>> -    *psize -= nls;
>> +    *psize -= *nls;
>> +    if (!(pde & R_PTE_LEAF)) { /* Prepare for next iteration */
>> +        *nls = pde & R_PDE_NLS;
>> +        index = eaddr >> (*psize - *nls);       /* Shift */
>> +        index &= ((1UL << *nls) - 1);           /* Mask */
>> +        *pte_addr = (pde & R_PDE_NLB) + (index * sizeof(pde));
>> +    }
>> +    return pde;
>> +}
>> +
>> +static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, vaddr eaddr,
>> +                                      uint64_t base_addr, uint64_t nls,
>> +                                      hwaddr *raddr, int *psize,
>> +                                      int *fault_cause, hwaddr *pte_addr)
>> +{
>> +    uint64_t index, pde;
>> +
>> +    index = eaddr >> (*psize - nls);    /* Shift */
>> +    index &= ((1UL << nls) - 1);       /* Mask */
>> +    *pte_addr = base_addr + (index * sizeof(pde));
>> +    do {
> 
> ... here. So that we have a well established "bad config" path at
> the root level, just like the current code has.
> 
> Since the ppc_radix64_walk_tree() now calls ppc_radix64_next_level()
> in a loop instead of recursing, and since ppc_radix64_next_level()
> returns the nls value for the next level, it really makes sense to
> have this check in ppc_radix64_walk_tree() and maybe put an assert
> in ppc_radix64_next_level().

ppc_radix64_next_level() also covers the needs of partition-scoped 
translation which translates each process table address. See PATCH 7.

I rather not duplicate more code and leave it as it is.
 
Thanks,

C.

> 
>> +        pde = ppc_radix64_next_level(cpu, eaddr, pte_addr, &nls, psize,
>> +                                     fault_cause);
>> +    } while ((pde & R_PTE_VALID) && !(pde & R_PTE_LEAF));
>>  
>> -    /* Check if Leaf Entry -> Page Table Entry -> Stop the Search */
>> -    if (pde & R_PTE_LEAF) {
>> +    /* Did we find a valid leaf? */
>> +    if ((pde & R_PTE_VALID) && (pde & R_PTE_LEAF)) {
>>          uint64_t rpn = pde & R_PTE_RPN;
>>          uint64_t mask = (1UL << *psize) - 1;
>>  
>>          /* Or high bits of rpn and low bits to ea to form whole real addr */
>>          *raddr = (rpn & ~mask) | (eaddr & mask);
>> -        *pte_addr = base_addr + (index * sizeof(pde));
>> -        return pde;
>>      }
>>  
>> -    /* Next Level of Radix Tree */
>> -    return ppc_radix64_walk_tree(cpu, eaddr, pde & R_PDE_NLB, pde & R_PDE_NLS,
>> -                                 raddr, psize, fault_cause, pte_addr);
>> +    return pde;
>>  }
>>  
>>  static bool validate_pate(PowerPCCPU *cpu, uint64_t lpid, ppc_v3_pate_t *pate)
> 



  reply	other threads:[~2020-03-31  9:11 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-30  9:49 [PATCH 0/7] target/ppc: Add support for Radix partition-scoped translation Cédric Le Goater
2020-03-30  9:49 ` [PATCH 1/7] target/ppc: Enforce that the root page directory size must be at least 5 Cédric Le Goater
2020-03-30 10:45   ` Greg Kurz
2020-03-31  0:57   ` David Gibson
2020-03-30  9:49 ` [PATCH 2/7] target/ppc: Introduce a relocation bool in ppc_radix64_handle_mmu_fault() Cédric Le Goater
2020-03-30 13:01   ` Greg Kurz
2020-03-31  0:58   ` David Gibson
2020-03-30  9:49 ` [PATCH 3/7] target/ppc: Assert if HV mode is set when running under a pseries machine Cédric Le Goater
2020-03-30 10:46   ` Greg Kurz
2020-03-31  0:59   ` David Gibson
2020-03-30  9:49 ` [PATCH 4/7] target/ppc: Introduce ppc_radix64_xlate() for Radix tree translation Cédric Le Goater
2020-03-30 14:18   ` Greg Kurz
2020-03-30 15:24     ` Cédric Le Goater
2020-03-30 15:34       ` Cédric Le Goater
2020-03-30 17:07         ` Greg Kurz
2020-03-31  1:13         ` David Gibson
2020-03-31  8:15           ` Cédric Le Goater
2020-03-30  9:49 ` [PATCH 5/7] target/ppc: Rework ppc_radix64_walk_tree() for partition-scoped translation Cédric Le Goater
2020-03-30 17:00   ` Greg Kurz
2020-03-31  9:10     ` Cédric Le Goater [this message]
2020-03-31  9:49       ` Greg Kurz
2020-03-30  9:49 ` [PATCH 6/7] target/ppc: Extend ppc_radix64_check_prot() with a 'partition_scoped' bool Cédric Le Goater
2020-03-30 17:01   ` Greg Kurz
2020-03-31  8:22     ` Cédric Le Goater
2020-03-30 17:08   ` Greg Kurz
2020-03-30  9:49 ` [PATCH 7/7] target/ppc: Add support for Radix partition-scoped translation Cédric Le Goater

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=ad71ef52-835f-f250-afc1-579e4f070c44@kaod.org \
    --to=clg@kaod.org \
    --cc=david@gibson.dropbear.id.au \
    --cc=groug@kaod.org \
    --cc=npiggin@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=sjitindarsingh@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.