qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v7 2/2] target-ppc: spapr: e500: fix to use cpu_


From: Mike Day
Subject: Re: [Qemu-devel] [PATCH v7 2/2] target-ppc: spapr: e500: fix to use cpu_dt_id
Date: Mon, 3 Mar 2014 14:57:11 -0500

On Sat, Feb 1, 2014 at 9:45 AM, Alexey Kardashevskiy <address@hidden> wrote:
> This makes use of @cpu_dt_id and related API in:
> 1. emulated XICS hypercall handlers as they receive fixed CPU indexes;
> 2. XICS-KVM to enable in-kernel XICS on right CPU;
> 3. device-tree renderer.
>
> This removes @cpu_index fixup as @cpu_dt_id is used instead so QEMU monitor
> can accept command-line CPU indexes again.
>
> This changes kvm_arch_vcpu_id() to use ppc_get_vcpu_dt_id() as at the moment
> KVM CPU id and device tree ID are calculated using the same algorithm.
>
Signed-off-by: Alexey Kardashevskiy <address@hidden>
Acked-by: Mike Day <address@hidden>

> ---
> Changes:
> v7:
> * replaced referencing to PowerPCCPU::parent_obj with the CPU macro
> ---
>  hw/intc/openpic_kvm.c       |  2 +-
>  hw/intc/xics.c              | 15 +++++++++++++--
>  hw/intc/xics_kvm.c          | 10 +++++-----
>  hw/ppc/e500.c               |  7 +++++--
>  hw/ppc/spapr.c              |  9 +++++----
>  hw/ppc/spapr_hcall.c        |  6 +++---
>  hw/ppc/spapr_rtas.c         | 14 +++++++-------
>  target-ppc/kvm.c            |  2 +-
>  target-ppc/translate_init.c |  1 +
>  9 files changed, 41 insertions(+), 25 deletions(-)
>
> diff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c
> index c7f7b84..87fdb12 100644
> --- a/hw/intc/openpic_kvm.c
> +++ b/hw/intc/openpic_kvm.c
> @@ -228,7 +228,7 @@ int kvm_openpic_connect_vcpu(DeviceState *d, CPUState *cs)
>
>      encap.cap = KVM_CAP_IRQ_MPIC;
>      encap.args[0] = opp->fd;
> -    encap.args[1] = cs->cpu_index;
> +    encap.args[1] = kvm_arch_vcpu_id(cs);
>
>      return kvm_vcpu_ioctl(cs, KVM_ENABLE_CAP, &encap);
>  }
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index b437563..64aabe7 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -33,6 +33,17 @@
>  #include "qemu/error-report.h"
>  #include "qapi/visitor.h"
>
> +static int get_cpu_index_by_dt_id(int cpu_dt_id)
> +{
> +    PowerPCCPU *cpu = ppc_get_vcpu_by_dt_id(cpu_dt_id);
> +
> +    if (cpu) {
> +        return cpu->parent_obj.cpu_index;
> +    }
> +
> +    return -1;
> +}
> +
>  void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu)
>  {
>      CPUState *cs = CPU(cpu);
> @@ -659,7 +670,7 @@ static target_ulong h_cppr(PowerPCCPU *cpu, 
> sPAPREnvironment *spapr,
>  static target_ulong h_ipi(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>                            target_ulong opcode, target_ulong *args)
>  {
> -    target_ulong server = args[0];
> +    target_ulong server = get_cpu_index_by_dt_id(args[0]);
>      target_ulong mfrr = args[1];
>
>      if (server >= spapr->icp->nr_servers) {
> @@ -728,7 +739,7 @@ static void rtas_set_xive(PowerPCCPU *cpu, 
> sPAPREnvironment *spapr,
>      }
>
>      nr = rtas_ld(args, 0);
> -    server = rtas_ld(args, 1);
> +    server = get_cpu_index_by_dt_id(rtas_ld(args, 1));
>      priority = rtas_ld(args, 2);
>
>      if (!ics_valid_irq(ics, nr) || (server >= ics->icp->nr_servers)
> diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
> index c203646..a5bbc24 100644
> --- a/hw/intc/xics_kvm.c
> +++ b/hw/intc/xics_kvm.c
> @@ -65,7 +65,7 @@ static void icp_get_kvm_state(ICPState *ss)
>      ret = kvm_vcpu_ioctl(ss->cs, KVM_GET_ONE_REG, &reg);
>      if (ret != 0) {
>          error_report("Unable to retrieve KVM interrupt controller state"
> -                " for CPU %d: %s", ss->cs->cpu_index, strerror(errno));
> +                " for CPU %ld: %s", kvm_arch_vcpu_id(ss->cs), 
> strerror(errno));
>          exit(1);
>      }
>
> @@ -97,7 +97,7 @@ static int icp_set_kvm_state(ICPState *ss, int version_id)
>      ret = kvm_vcpu_ioctl(ss->cs, KVM_SET_ONE_REG, &reg);
>      if (ret != 0) {
>          error_report("Unable to restore KVM interrupt controller state (0x%"
> -                PRIx64 ") for CPU %d: %s", state, ss->cs->cpu_index,
> +                PRIx64 ") for CPU %ld: %s", state, kvm_arch_vcpu_id(ss->cs),
>                  strerror(errno));
>          return ret;
>      }
> @@ -325,15 +325,15 @@ static void xics_kvm_cpu_setup(XICSState *icp, 
> PowerPCCPU *cpu)
>          struct kvm_enable_cap xics_enable_cap = {
>              .cap = KVM_CAP_IRQ_XICS,
>              .flags = 0,
> -            .args = {icpkvm->kernel_xics_fd, cs->cpu_index, 0, 0},
> +            .args = {icpkvm->kernel_xics_fd, kvm_arch_vcpu_id(cs), 0, 0},
>          };
>
>          ss->cs = cs;
>
>          ret = kvm_vcpu_ioctl(ss->cs, KVM_ENABLE_CAP, &xics_enable_cap);
>          if (ret < 0) {
> -            error_report("Unable to connect CPU%d to kernel XICS: %s",
> -                    cs->cpu_index, strerror(errno));
> +            error_report("Unable to connect CPU%ld to kernel XICS: %s",
> +                    kvm_arch_vcpu_id(cs), strerror(errno));
>              exit(1);
>          }
>      }
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index b37ce9d..8a08752 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -238,6 +238,7 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs 
> *args,
>         the first node as boot node and be happy */
>      for (i = smp_cpus - 1; i >= 0; i--) {
>          CPUState *cpu;
> +        PowerPCCPU *pcpu;
>          char cpu_name[128];
>          uint64_t cpu_release_addr = MPC8544_SPIN_BASE + (i * 0x20);
>
> @@ -246,14 +247,16 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs 
> *args,
>              continue;
>          }
>          env = cpu->env_ptr;
> +        pcpu = POWERPC_CPU(cpu);
>
>          snprintf(cpu_name, sizeof(cpu_name), "/cpus/PowerPC,address@hidden",
> -                 cpu->cpu_index);
> +                 ppc_get_vcpu_dt_id(pcpu));
>          qemu_fdt_add_subnode(fdt, cpu_name);
>          qemu_fdt_setprop_cell(fdt, cpu_name, "clock-frequency", clock_freq);
>          qemu_fdt_setprop_cell(fdt, cpu_name, "timebase-frequency", tb_freq);
>          qemu_fdt_setprop_string(fdt, cpu_name, "device_type", "cpu");
> -        qemu_fdt_setprop_cell(fdt, cpu_name, "reg", cpu->cpu_index);
> +        qemu_fdt_setprop_cell(fdt, cpu_name, "reg",
> +                              ppc_get_vcpu_dt_id(pcpu));
>          qemu_fdt_setprop_cell(fdt, cpu_name, "d-cache-line-size",
>                                env->dcache_line_size);
>          qemu_fdt_setprop_cell(fdt, cpu_name, "i-cache-line-size",
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 5b21562..807f488 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -207,19 +207,20 @@ static int spapr_fixup_cpu_dt(void *fdt, 
> sPAPREnvironment *spapr)
>
>      CPU_FOREACH(cpu) {
>          DeviceClass *dc = DEVICE_GET_CLASS(cpu);
> +        int index = ppc_get_vcpu_dt_id(POWERPC_CPU(cpu));
>          uint32_t associativity[] = {cpu_to_be32(0x5),
>                                      cpu_to_be32(0x0),
>                                      cpu_to_be32(0x0),
>                                      cpu_to_be32(0x0),
>                                      cpu_to_be32(cpu->numa_node),
> -                                    cpu_to_be32(cpu->cpu_index)};
> +                                    cpu_to_be32(index)};
>
> -        if ((cpu->cpu_index % smt) != 0) {
> +        if ((index % smt) != 0) {
>              continue;
>          }
>
>          snprintf(cpu_model, 32, "/cpus/address@hidden", dc->fw_name,
> -                 cpu->cpu_index);
> +                 index);
>
>          offset = fdt_path_offset(fdt, cpu_model);
>          if (offset < 0) {
> @@ -368,7 +369,7 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>          CPUPPCState *env = &cpu->env;
>          DeviceClass *dc = DEVICE_GET_CLASS(cs);
>          PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
> -        int index = cs->cpu_index;
> +        int index = ppc_get_vcpu_dt_id(cpu);
>          uint32_t servers_prop[smp_threads];
>          uint32_t gservers_prop[smp_threads * 2];
>          char *nodename;
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index f755a53..c55c356 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -464,13 +464,13 @@ static target_ulong h_register_vpa(PowerPCCPU *cpu, 
> sPAPREnvironment *spapr,
>      target_ulong vpa = args[2];
>      target_ulong ret = H_PARAMETER;
>      CPUPPCState *tenv;
> -    CPUState *tcpu;
> +    PowerPCCPU *tcpu;
>
> -    tcpu = qemu_get_cpu(procno);
> +    tcpu = ppc_get_vcpu_by_dt_id(procno);
>      if (!tcpu) {
>          return H_PARAMETER;
>      }
> -    tenv = tcpu->env_ptr;
> +    tenv = &tcpu->env;
>
>      switch (flags) {
>      case FLAGS_REGISTER_VPA:
> diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> index 1cb276d..73860d0 100644
> --- a/hw/ppc/spapr_rtas.c
> +++ b/hw/ppc/spapr_rtas.c
> @@ -131,7 +131,7 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
>                                           uint32_t nret, target_ulong rets)
>  {
>      target_ulong id;
> -    CPUState *cpu;
> +    PowerPCCPU *cpu;
>
>      if (nargs != 1 || nret != 2) {
>          rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> @@ -139,9 +139,9 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
>      }
>
>      id = rtas_ld(args, 0);
> -    cpu = qemu_get_cpu(id);
> +    cpu = ppc_get_vcpu_by_dt_id(id);
>      if (cpu != NULL) {
> -        if (cpu->halted) {
> +        if (CPU(cpu)->halted) {
>              rtas_st(rets, 1, 0);
>          } else {
>              rtas_st(rets, 1, 2);
> @@ -161,7 +161,7 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, 
> sPAPREnvironment *spapr,
>                             uint32_t nret, target_ulong rets)
>  {
>      target_ulong id, start, r3;
> -    CPUState *cs;
> +    PowerPCCPU *cpu;
>
>      if (nargs != 3 || nret != 1) {
>          rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> @@ -172,9 +172,9 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, 
> sPAPREnvironment *spapr,
>      start = rtas_ld(args, 1);
>      r3 = rtas_ld(args, 2);
>
> -    cs = qemu_get_cpu(id);
> -    if (cs != NULL) {
> -        PowerPCCPU *cpu = POWERPC_CPU(cs);
> +    cpu = ppc_get_vcpu_by_dt_id(id);
> +    if (cpu != NULL) {
> +        CPUState *cs = CPU(cpu);
>          CPUPPCState *env = &cpu->env;
>
>          if (!cs->halted) {
> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
> index 8bcc5fb..c9b7778 100644
> --- a/target-ppc/kvm.c
> +++ b/target-ppc/kvm.c
> @@ -401,7 +401,7 @@ static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu)
>
>  unsigned long kvm_arch_vcpu_id(CPUState *cpu)
>  {
> -    return cpu->cpu_index;
> +    return ppc_get_vcpu_dt_id(POWERPC_CPU(cpu));
>  }
>
>  int kvm_arch_init_vcpu(CPUState *cs)
> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> index 6de7126..a67e2b4 100644
> --- a/target-ppc/translate_init.c
> +++ b/target-ppc/translate_init.c
> @@ -8429,6 +8429,7 @@ static void ppc_cpu_initfn(Object *obj)
>
>      cs->env_ptr = env;
>      cpu_exec_init(env);
> +    cpu->cpu_dt_id = cs->cpu_index;
>
>      env->msr_mask = pcc->msr_mask;
>      env->mmu_model = pcc->mmu_model;
> --
> 1.8.4.rc4
>
>



reply via email to

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