summaryrefslogtreecommitdiffstats
path: root/target/ppc/kvm.c
diff options
context:
space:
mode:
authorDavid Gibson2018-06-14 04:11:08 +0200
committerDavid Gibson2018-06-21 13:22:53 +0200
commit24c6863c7b61efcfe4a0f0916ed4e8b797c8d281 (patch)
treecc463707192464581005d26840b99de7051c6f0b /target/ppc/kvm.c
parentspapr: Add cpu_apply hook to capabilities (diff)
downloadqemu-24c6863c7b61efcfe4a0f0916ed4e8b797c8d281.tar.gz
qemu-24c6863c7b61efcfe4a0f0916ed4e8b797c8d281.tar.xz
qemu-24c6863c7b61efcfe4a0f0916ed4e8b797c8d281.zip
target/ppc: Add kvmppc_hpt_needs_host_contiguous_pages() helper
KVM HV has a restriction that for HPT mode guests, guest pages must be hpa contiguous as well as gpa contiguous. We have to account for that in various places. We determine whether we're subject to this restriction from the SMMU information exposed by KVM. Planned cleanups to the way we handle this will require knowing whether this restriction is in play in wider parts of the code. So, expose a helper function which returns it. This does mean some redundant calls to kvm_get_smmu_info(), but they'll go away again with future cleanups. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Greg Kurz <groug@kaod.org> Reviewed-by: Cédric Le Goater <clg@kaod.org>
Diffstat (limited to 'target/ppc/kvm.c')
-rw-r--r--target/ppc/kvm.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 5c0e313ca6..50b5d01432 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -406,9 +406,22 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
}
}
+bool kvmppc_hpt_needs_host_contiguous_pages(void)
+{
+ PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
+ static struct kvm_ppc_smmu_info smmu_info;
+
+ if (!kvm_enabled()) {
+ return false;
+ }
+
+ kvm_get_smmu_info(cpu, &smmu_info);
+ return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL);
+}
+
static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift)
{
- if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) {
+ if (!kvmppc_hpt_needs_host_contiguous_pages()) {
return true;
}
@@ -445,7 +458,7 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
/* If we have HV KVM, we need to forbid CI large pages if our
* host page size is smaller than 64K.
*/
- if (smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL) {
+ if (kvmppc_hpt_needs_host_contiguous_pages()) {
if (getpagesize() >= 0x10000) {
cpu->hash64_opts->flags |= PPC_HASH64_CI_LARGEPAGE;
} else {