diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2011-10-17 18:15:41 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2011-10-30 20:03:26 +0100 |
commit | a7342588c081c7497bc7810431a03fa7b669af40 (patch) | |
tree | d121069b76642938903b419654c53c7f256b85f4 /hw/spapr.c | |
parent | f90a9d02401eeeec18a122b61ccccb91244f321c (diff) |
pseries: Correct vmx/dfp handling in both KVM and TCG cases
Currently, when KVM is enabled, the pseries machine checks if the host
CPU supports VMX, VSX and/or DFP instructions and advertises
accordingly in the guest device tree. It does this regardless of what
CPU is selected on the command line. On the other hand, when in TCG
mode, it never advertises any of these facilities, even basic VMX
(Altivec) which is supported in TCG.
Now that we have a -cpu host option for ppc, it is fairly
straightforward to fix both problems. This patch changes the -cpu
host code to override the basic cpu spec derived from the PVR with
information queried from the host avout VMX, VSX and DFP capability.
The pseries code then uses the instruction availability advertised in
the cpu state to set the guest device tree correctly for both the KVM
and TCG cases.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/spapr.c')
-rw-r--r-- | hw/spapr.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/hw/spapr.c b/hw/spapr.c index 08c7399fef..933af322c5 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -188,8 +188,6 @@ static void *spapr_create_fdt_skel(const char *cpu_model, 0xffffffff, 0xffffffff}; uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ; uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000; - uint32_t vmx = kvm_enabled() ? kvmppc_get_vmx() : 0; - uint32_t dfp = kvm_enabled() ? kvmppc_get_dfp() : 0; if ((index % smt) != 0) { continue; @@ -241,15 +239,17 @@ static void *spapr_create_fdt_skel(const char *cpu_model, * 0 / no property == no vector extensions * 1 == VMX / Altivec available * 2 == VSX available */ - if (vmx) { + if (env->insns_flags & PPC_ALTIVEC) { + uint32_t vmx = (env->insns_flags2 & PPC2_VSX) ? 2 : 1; + _FDT((fdt_property_cell(fdt, "ibm,vmx", vmx))); } /* Advertise DFP (Decimal Floating Point) if available * 0 / no property == no DFP * 1 == DFP available */ - if (dfp) { - _FDT((fdt_property_cell(fdt, "ibm,dfp", dfp))); + if (env->insns_flags2 & PPC2_DFP) { + _FDT((fdt_property_cell(fdt, "ibm,dfp", 1))); } _FDT((fdt_end_node(fdt))); |