mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
spapr: Add ibm,processor-radix-AP-encodings to the device tree
Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU information from KVM and present the page encodings in the device tree under ibm,processor-radix-AP-encodings. This provides page size information to the guest which is necessary for it to use radix mode. Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com> [dwg: Compile fix for 32-bit targets, style nit fix] Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
d6ee2a7c85
commit
c64abd1f9c
5 changed files with 48 additions and 0 deletions
|
@ -197,6 +197,7 @@ typedef struct PowerPCCPUClass {
|
|||
int bfd_mach;
|
||||
uint32_t l1_dcache_size, l1_icache_size;
|
||||
const struct ppc_segment_page_sizes *sps;
|
||||
struct ppc_radix_page_info *radix_page_info;
|
||||
void (*init_proc)(CPUPPCState *env);
|
||||
int (*check_pow)(CPUPPCState *env);
|
||||
int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
|
||||
|
|
|
@ -943,6 +943,10 @@ struct ppc_segment_page_sizes {
|
|||
struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
|
||||
};
|
||||
|
||||
struct ppc_radix_page_info {
|
||||
uint32_t count;
|
||||
uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* The whole PowerPC CPU context */
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include "hw/ppc/spapr_cpu_core.h"
|
||||
#endif
|
||||
#include "elf.h"
|
||||
#include "sysemu/kvm_int.h"
|
||||
|
||||
//#define DEBUG_KVM
|
||||
|
||||
|
@ -333,6 +334,30 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
|
|||
kvm_get_fallback_smmu_info(cpu, info);
|
||||
}
|
||||
|
||||
struct ppc_radix_page_info *kvm_get_radix_page_info(void)
|
||||
{
|
||||
KVMState *s = KVM_STATE(current_machine->accelerator);
|
||||
struct ppc_radix_page_info *radix_page_info;
|
||||
struct kvm_ppc_rmmu_info rmmu_info;
|
||||
int i;
|
||||
|
||||
if (!kvm_check_extension(s, KVM_CAP_PPC_MMU_RADIX)) {
|
||||
return NULL;
|
||||
}
|
||||
if (kvm_vm_ioctl(s, KVM_PPC_GET_RMMU_INFO, &rmmu_info)) {
|
||||
return NULL;
|
||||
}
|
||||
radix_page_info = g_malloc0(sizeof(*radix_page_info));
|
||||
radix_page_info->count = 0;
|
||||
for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
|
||||
if (rmmu_info.ap_encodings[i]) {
|
||||
radix_page_info->entries[i] = rmmu_info.ap_encodings[i];
|
||||
radix_page_info->count++;
|
||||
}
|
||||
}
|
||||
return radix_page_info;
|
||||
}
|
||||
|
||||
static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift)
|
||||
{
|
||||
if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) {
|
||||
|
@ -2303,6 +2328,10 @@ static void kvmppc_host_cpu_class_init(ObjectClass *oc, void *data)
|
|||
if (icache_size != -1) {
|
||||
pcc->l1_icache_size = icache_size;
|
||||
}
|
||||
|
||||
#if defined(TARGET_PPC64)
|
||||
pcc->radix_page_info = kvm_get_radix_page_info();
|
||||
#endif /* defined(TARGET_PPC64) */
|
||||
}
|
||||
|
||||
bool kvmppc_has_cap_epr(void)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue