[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 4/4] target/ppc: Add support for Radix partition-scoped tr
From: |
Cédric Le Goater |
Subject: |
Re: [PATCH v4 4/4] target/ppc: Add support for Radix partition-scoped translation |
Date: |
Wed, 8 Apr 2020 09:22:44 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 |
>>> - *raddr = g_raddr;
>>> + /*
>>> + * Perform partition-scoped translation if !HV or HV access to
>>> + * quadrants 1 or 2. Translates a guest real address to a host
>>> + * real address.
>>> + */
>>> + if ((lpid != 0) || (!cpu->vhyp && !msr_hv)) {
>>
>> This check is too complex for my taste. Also it doesn't seem right
>> to look at lpid if the machine is pseries, even if it would happen
>> to work because pseries cannot have lpid != 0. I think we should
>> have distinct paths for powernv and pseries.
>>
>> A bit like with the following squashed in:
>>
>> =======================================
>> --- a/target/ppc/mmu-radix64.c
>> +++ b/target/ppc/mmu-radix64.c
>> @@ -489,22 +489,28 @@ static int ppc_radix64_xlate(PowerPCCPU *cpu, vaddr
>> eaddr, int rwx,
>> g_raddr = eaddr & R_EADDR_MASK;
>> }
>>
>> - /*
>> - * Perform partition-scoped translation if !HV or HV access to
>> - * quadrants 1 or 2. Translates a guest real address to a host
>> - * real address.
>> - */
>> - if ((lpid != 0) || (!cpu->vhyp && !msr_hv)) {
>> - int ret = ppc_radix64_partition_scoped_xlate(cpu, rwx, eaddr,
>> g_raddr,
>> + if (cpu->vhyp) {
>> + *raddr = g_raddr;
>> + } else {
>> + /*
>> + * Perform partition-scoped translation if !HV or HV access to
>> + * quadrants 1 or 2. Translates a guest real address to a host
>> + * real address.
>> + */
>> + if (lpid || !msr_hv) {
>> + int ret;
>> +
>> + ret = ppc_radix64_partition_scoped_xlate(cpu, rwx, eaddr,
>> g_raddr,
>> pate, raddr, &prot,
>> &psize,
>> 0, cause_excp);
>> - if (ret) {
>> - return ret;
>> + if (ret) {
>> + return ret;
>> + }
>> + *psizep = MIN(*psizep, psize);
>> + *protp &= prot;
>> + } else {
>> + *raddr = g_raddr;
>> }
>> - *psizep = MIN(*psizep, psize);
>> - *protp &= prot;
>> - } else {
>> - *raddr = g_raddr;
>> }
>>
>> return 0;
>> =======================================
>>
>> David,
>>
>> If my comment makes sense to you, can you squash the above fix into
>> Cedric's patch ?
>
> Yes. I also think we shouldn't be looking at lpid for the vhyp case.
> I've applied the rest of the series to ppc-for-5.1, and folded in this
> correction as suggested.
I explored a solution with two ppc_radix64_xlate() routines, one simple
for pseries, a second more complex for powernv but it didn't look very
good. May be it will be easier now that the first patches are merged.
Thanks,
C.