summaryrefslogtreecommitdiffstats
path: root/target/ppc/kvm.c
diff options
context:
space:
mode:
authorSam Bobroff2017-03-29 07:01:28 +0200
committerDavid Gibson2017-04-26 04:00:41 +0200
commitf3d9f303acba2fcb97aaa68fdcd4b058c332d0f8 (patch)
treedf5a68c8ce8c0b0b42e27893fe38335cdf2de871 /target/ppc/kvm.c
parentMerge remote-tracking branch 'remotes/agraf/tags/signed-s390-for-upstream' in... (diff)
downloadqemu-f3d9f303acba2fcb97aaa68fdcd4b058c332d0f8.tar.gz
qemu-f3d9f303acba2fcb97aaa68fdcd4b058c332d0f8.tar.xz
qemu-f3d9f303acba2fcb97aaa68fdcd4b058c332d0f8.zip
target/ppc: Improve accuracy of guest HTM availability on P8s
On Power8 hosts it is currently theoretically possible for QEMU/KVM-HV guests to receive a ibm,pa-features property indicating that HTM support is available when it is not. The situation would occur if the platform firmware of a Power8 host cleared the HTM bit of the ibm,pa-features property. QEMU would query KVM for the availability of HTM, which will return no support, but workaround code in kvm_arch_init_vcpu() would then re-enable it because KVM_HV is in use and the processor is P8. This patch adjusts the workaround in kvm_arch_init_vcpu() so that it does not enable HTM (in the above case) unless the host kernel indicates to the QEMU process, via the auxiliary vector, that userspace can use HTM (via the HWCAP2 bit KVM_FEATURE2_HTM). The reason to use the value from the auxiliary vector is that it is set based only on what the host kernel found in the ibm,pa-features HTM bit at boot time. Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'target/ppc/kvm.c')
-rw-r--r--target/ppc/kvm.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 64017acfad..c3d426292c 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -49,6 +49,7 @@
#if defined(TARGET_PPC64)
#include "hw/ppc/spapr_cpu_core.h"
#endif
+#include "elf.h"
//#define DEBUG_KVM
@@ -509,8 +510,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
case POWERPC_MMU_2_07:
if (!cap_htm && !kvmppc_is_pr(cs->kvm_state)) {
/* KVM-HV has transactional memory on POWER8 also without the
- * KVM_CAP_PPC_HTM extension, so enable it here instead. */
- cap_htm = true;
+ * KVM_CAP_PPC_HTM extension, so enable it here instead as
+ * long as it's availble to userspace on the host. */
+ if (qemu_getauxval(AT_HWCAP2) & PPC_FEATURE2_HAS_HTM) {
+ cap_htm = true;
+ }
}
break;
default: