qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH v3 05/12] spapr: Add ibm, processor-radix-AP-encod


From: David Gibson
Subject: Re: [Qemu-ppc] [PATCH v3 05/12] spapr: Add ibm, processor-radix-AP-encodings to the device tree
Date: Fri, 3 Mar 2017 14:37:52 +1100
User-agent: Mutt/1.7.1 (2016-10-04)

On Thu, Mar 02, 2017 at 04:39:00PM +1100, Sam Bobroff wrote:
> 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 <address@hidden>
> ---
>  hw/ppc/spapr.c       | 12 ++++++++++++
>  include/sysemu/kvm.h |  1 +
>  target/ppc/cpu-qom.h |  1 +
>  target/ppc/cpu.h     |  4 ++++
>  target/ppc/kvm.c     | 27 +++++++++++++++++++++++++++
>  5 files changed, 45 insertions(+)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index bad45b4a82..d154fa2112 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -427,6 +427,8 @@ static void spapr_populate_cpu_dt(CPUState *cs, void 
> *fdt, int offset,
>      sPAPRDRConnector *drc;
>      sPAPRDRConnectorClass *drck;
>      int drc_index;
> +    uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ];
> +    int i;
>  
>      drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index);
>      if (drc) {
> @@ -512,6 +514,16 @@ static void spapr_populate_cpu_dt(CPUState *cs, void 
> *fdt, int offset,
>      _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cs));
>  
>      _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt));
> +
> +    if (pcc->radix_page_info) {
> +        for (i = 0; i < pcc->radix_page_info->count; i++) {
> +            radix_AP_encodings[i] = 
> cpu_to_be32(pcc->radix_page_info->entries[i]);
> +        }
> +        _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
> +                          radix_AP_encodings,
> +                          pcc->radix_page_info->count *
> +                          sizeof(radix_AP_encodings[0]))));
> +    }
>  }
>  
>  static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 3045ee7678..01a8db1180 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -526,5 +526,6 @@ int kvm_set_one_reg(CPUState *cs, uint64_t id, void 
> *source);
>   * Returns: 0 on success, or a negative errno on failure.
>   */
>  int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target);
> +struct ppc_radix_page_info *kvm_get_radix_page_info(void);
>  int kvm_get_max_memslots(void);
>  #endif
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index 81500e5748..d0cf6ca2a9 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -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);
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index 71a198e939..b3ef0d38ad 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -929,6 +929,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 */
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 38ce6c2e6c..ee330d8993 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -48,6 +48,7 @@
>  #if defined(TARGET_PPC64)
>  #include "hw/ppc/spapr_cpu_core.h"
>  #endif
> +#include "sysemu/kvm_int.h"
>  
>  //#define DEBUG_KVM
>  
> @@ -329,6 +330,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 long gethugepagesize(const char *mem_path)
>  {
>      struct statfs fs;
> @@ -2379,6 +2404,8 @@ static void kvmppc_host_cpu_class_init(ObjectClass *oc, 
> void *data)
>          pcc->l1_icache_size = icache_size;
>      }
>  
> +    pcc->radix_page_info = kvm_enabled() ? kvm_get_radix_page_info() : NULL;

This isn't quite right.  If KVM is not enabled, you should leave the
radix page info as it is.  For now that will be NULL, but once TCG
radix is implemented, the base cpu type, from which the host cpu class
is copied, should have information here.

> +
>      /* Reason: kvmppc_host_cpu_initfn() dies when !kvm_enabled() */
>      dc->cannot_destroy_with_object_finalize_yet = true;
>  }

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]