summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/ppc/kvm.c17
-rw-r--r--target/ppc/kvm_ppc.h6
2 files changed, 21 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 {
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index e2840e1d33..a7ddb8a5d6 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -70,6 +70,7 @@ int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift);
int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift);
bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu);
+bool kvmppc_hpt_needs_host_contiguous_pages(void);
bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path);
#else
@@ -222,6 +223,11 @@ static inline uint64_t kvmppc_rma_size(uint64_t current_size,
return ram_size;
}
+static inline bool kvmppc_hpt_needs_host_contiguous_pages(void)
+{
+ return false;
+}
+
static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path)
{
return true;