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: Alexey Kardashevskiy
Subject: Re: [Qemu-devel] [PATCH v7 2/2] target-ppc: spapr: e500: fix to use cpu_dt_id
Date: Tue, 04 Mar 2014 09:53:49 +1100
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

On 03/04/2014 06:57 AM, Mike Day wrote:
> 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>


Thanks, Mike!


>> ---
>> 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
>>
>>


-- 
Alexey



reply via email to

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