KVM: PPC: Override host vmx/vsx/dfp only when information known

Submitted by Alexander Graf on Oct. 24, 2011, 6:53 p.m.

Details

Message ID 1319482434-21185-1-git-send-email-agraf@suse.de
State New
Headers show

Commit Message

Alexander Graf Oct. 24, 2011, 6:53 p.m.
The -cpu host feature tries to find out the host capabilities based
on device tree information. However, we don't always have that available
because it's an optional property in dt.

So instead of force unsetting values depending on an unreliable source
of information, let's just try to be clever about it and not override
capabilities when we don't know the device tree pieces.

This fixes altivec with -cpu host on YDL PowerStations.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 target-ppc/kvm.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

Comments

David Gibson Oct. 24, 2011, 11:01 p.m.
On Mon, Oct 24, 2011 at 08:53:54PM +0200, Alexander Graf wrote:
> The -cpu host feature tries to find out the host capabilities based
> on device tree information. However, we don't always have that available
> because it's an optional property in dt.
> 
> So instead of force unsetting values depending on an unreliable source
> of information, let's just try to be clever about it and not override
> capabilities when we don't know the device tree pieces.
> 
> This fixes altivec with -cpu host on YDL PowerStations.

Yeah, this is probably the best we can do.  I forgot that we can only
really rely on the ibm,vmx property on systems with IBM firmware.  On
those it does indicate that there is no VMX if the property is
missing, but other firmwares just don't provide it at all.

> 
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  target-ppc/kvm.c |   12 +++++++++---
>  1 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
> index a090d79..f3d0861 100644
> --- a/target-ppc/kvm.c
> +++ b/target-ppc/kvm.c
> @@ -912,9 +912,15 @@ const ppc_def_t *kvmppc_host_cpu_def(void)
>  
>      /* Now fix up the spec with information we can query from the host */
>  
> -    alter_insns(&spec->insns_flags, PPC_ALTIVEC, vmx > 0);
> -    alter_insns(&spec->insns_flags2, PPC2_VSX, vmx > 1);
> -    alter_insns(&spec->insns_flags2, PPC2_DFP, dfp);
> +    if (vmx != -1) {
> +        /* Only override when we know what the host supports */
> +        alter_insns(&spec->insns_flags, PPC_ALTIVEC, vmx > 0);
> +        alter_insns(&spec->insns_flags2, PPC2_VSX, vmx > 1);
> +    }
> +    if (dfp != -1) {
> +        /* Only override when we know what the host supports */
> +        alter_insns(&spec->insns_flags2, PPC2_DFP, dfp);
> +    }
>  
>      return spec;
>  }

Patch hide | download patch | download mbox

diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index a090d79..f3d0861 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -912,9 +912,15 @@  const ppc_def_t *kvmppc_host_cpu_def(void)
 
     /* Now fix up the spec with information we can query from the host */
 
-    alter_insns(&spec->insns_flags, PPC_ALTIVEC, vmx > 0);
-    alter_insns(&spec->insns_flags2, PPC2_VSX, vmx > 1);
-    alter_insns(&spec->insns_flags2, PPC2_DFP, dfp);
+    if (vmx != -1) {
+        /* Only override when we know what the host supports */
+        alter_insns(&spec->insns_flags, PPC_ALTIVEC, vmx > 0);
+        alter_insns(&spec->insns_flags2, PPC2_VSX, vmx > 1);
+    }
+    if (dfp != -1) {
+        /* Only override when we know what the host supports */
+        alter_insns(&spec->insns_flags2, PPC2_DFP, dfp);
+    }
 
     return spec;
 }