On Sat, Feb 1, 2014 at 9:45 AM, Alexey Kardashevskiy <a...@ozlabs.ru> 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 <a...@ozlabs.ru> Acked-by: Mike Day <ncm...@ncultra.org>
> --- > 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, ®); > 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, ®); > 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,8544@%x", > - 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/%s@%x", 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 > >