qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH qemu] spapr/target-ppc/kvm: Only add hcall-instr


From: Thomas Huth
Subject: Re: [Qemu-devel] [PATCH qemu] spapr/target-ppc/kvm: Only add hcall-instructions if KVM supports it
Date: Tue, 15 Mar 2016 12:32:37 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0

On 15.03.2016 10:42, Alexey Kardashevskiy wrote:
> On 03/15/2016 07:18 PM, Thomas Huth wrote:
>>
>>   Hi Alexey,
>>
>> On 15.03.2016 06:51, Alexey Kardashevskiy wrote:
>>> ePAPR defines "hcall-instructions" device-tree property which contains
>>> code to call hypercalls in ePAPR paravirtualized guests. However this
>>> property is also present for pseries guests where it does not make
>>> sense,
>>> even though it contains dummy code which simply fails.
>>>
>>> Instead of maintaining the property (which used to be BE only; then was
>>> fixed to be endian-agnostic) and confusing the guest (which might think
>>> there is ePAPR host while there is none), this simply does not
>>> the property to the device tree if the host kernel does not implement
>>> it.
>>>
>>> In order to tell the machine code if the host kernel supports
>>> KVM_CAP_PPC_GET_PVINFO, this changes kvmppc_get_hypercall() to return 1
>>> if the host kernel does not implement it (which is HV KVM case).
>>>
>>> Signed-off-by: Alexey Kardashevskiy <address@hidden>
>>> ---
>>>
>>>
>>> Alexander,
>>>
>>> We just got a bug report that LE guests would not boot under quite
>>> old QEMU
>>> and we (powerkvm) wonder if it makes sense to backport endian-agnostic
>>> hypercall code to older QEMU or it is simpler/more correct
>>> not to have epapr-hypercall property in the tree.
>>>
>>>
>>> ---
>>>   hw/ppc/spapr.c   | 9 +++++----
>>>   target-ppc/kvm.c | 2 +-
>>>   2 files changed, 6 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>> index 43708a2..8130eb4 100644
>>> --- a/hw/ppc/spapr.c
>>> +++ b/hw/ppc/spapr.c
>>> @@ -497,10 +497,11 @@ static void *spapr_create_fdt_skel(hwaddr
>>> initrd_base,
>>>                * Older KVM versions with older guest kernels were
>>> broken with the
>>>                * magic page, don't allow the guest to map it.
>>>                */
>>> -            kvmppc_get_hypercall(first_cpu->env_ptr, hypercall,
>>> -                                 sizeof(hypercall));
>>> -            _FDT((fdt_property(fdt, "hcall-instructions", hypercall,
>>> -                              sizeof(hypercall))));
>>> +            if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall,
>>> +                                      sizeof(hypercall))) {
>>> +                _FDT((fdt_property(fdt, "hcall-instructions",
>>> hypercall,
>>> +                                   sizeof(hypercall))));
>>> +            }
>>>           }
>>>           _FDT((fdt_end_node(fdt)));
>>>       }
>>> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
>>> index 776336b..e5183db 100644
>>> --- a/target-ppc/kvm.c
>>> +++ b/target-ppc/kvm.c
>>> @@ -2001,7 +2001,7 @@ int kvmppc_get_hypercall(CPUPPCState *env,
>>> uint8_t *buf, int buf_len)
>>>       hc[2] = cpu_to_be32(0x48000008);
>>>       hc[3] = cpu_to_be32(bswap32(0x3860ffff));
>>>
>>> -    return 0;
>>> +    return 1;
>>>   }
>>>
>>>   static inline int kvmppc_enable_hcall(KVMState *s, target_ulong hcall)
>>
>> Sorry, I have a hard time to understand what this is really good for. Is
>> it a patch for current QEMU or for older ones? If it is for older ones,
>> then why did you not CC: to qemu-stable?
>> If it is for current QEMU, then I've got some more questions about
>> things I do not understand:
>>
>> 1) In your patch description, you talk about ePAPR and that the property
>> does not make sense for pseries. But why is this code then available at
>> all in spapr.c? ... there must be a reason for this, I think (like using
>> a different h-call on nested KVM-PR for example?)
> 
> 
> No, this is from old times when there was only PR KVM fully emulating
> powermac (not pseries) which needed to interact with the hypervisor and
> epapr_hypercall was chosen for this.
> 
> 
>> 2) The code in spapr.c is already protected with a
>>    if (kvmppc_has_cap_fixup_hcalls()) ...
>> and that CAP should only be there if the PVINFO CAP is available, too.
>> So I don't see how you could run into that problem anyway where PVINFO
>> is _not_ available but the FIXUP_HCALL CAP _is_ available?
> 
> 
> HV KVM guest calls (on pseries machine as well):
> 
> kvm_guest_init
> kvm_para_has_feature
> kvm_arch_para_features
> kvm_para_available - this returns "1"
> epapr_hypercall0_1(KVM_HC_FEATURES)
> 
> This epapr_hypercall0_1() calls a binary blob from "hcall-instructions".
> And fails if the guest is LE and the blob from BE-only times.

What about that "if (kvmppc_has_cap_fixup_hcalls())" ? Could you please
check why this succeeds on your system , but the KVM_CAP_PPC_GET_PVINFO
call does not?

 Thomas





reply via email to

[Prev in Thread] Current Thread [Next in Thread]