[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v5 2/2] target-ppc: spapr: e500: fix to use cpu_dt
From: |
Alexander Graf |
Subject: |
Re: [Qemu-ppc] [PATCH v5 2/2] target-ppc: spapr: e500: fix to use cpu_dt_id |
Date: |
Fri, 31 Jan 2014 15:09:47 +0100 |
On 03.12.2013, at 04:30, 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>
> ---
> 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 | 10 +---------
> target-ppc/translate_init.c | 2 ++
> 9 files changed, 42 insertions(+), 33 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 cfdd84b..256ac22 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_devtree_add_subnode(fdt, cpu_name);
> qemu_devtree_setprop_cell(fdt, cpu_name, "clock-frequency",
> clock_freq);
> qemu_devtree_setprop_cell(fdt, cpu_name, "timebase-frequency",
> tb_freq);
> qemu_devtree_setprop_string(fdt, cpu_name, "device_type", "cpu");
> - qemu_devtree_setprop_cell(fdt, cpu_name, "reg", cpu->cpu_index);
> + qemu_devtree_setprop_cell(fdt, cpu_name, "reg",
> + ppc_get_vcpu_dt_id(pcpu));
> qemu_devtree_setprop_cell(fdt, cpu_name, "d-cache-line-size",
> env->dcache_line_size);
> qemu_devtree_setprop_cell(fdt, cpu_name, "i-cache-line-size",
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 7e53a5f..c543054 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -206,19 +206,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) {
> @@ -367,7 +368,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 6149907..2dc0b0c 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->parent_obj.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 10d0cd9..3b50789 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)
> @@ -1768,14 +1768,6 @@ static void kvmppc_host_cpu_class_init(ObjectClass
> *oc, void *data)
>
> int kvmppc_fixup_cpu(PowerPCCPU *cpu)
This function is not needed anymore now, no? Just remove it and all of its
callers.
> {
> - CPUState *cs = CPU(cpu);
> - int smt;
> -
> - /* Adjust cpu index for SMT */
> - smt = kvmppc_smt_threads();
> - cs->cpu_index = (cs->cpu_index / smp_threads) * smt
> - + (cs->cpu_index % smp_threads);
> -
> return 0;
> }
>
> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> index c030a20..1b0ff38 100644
> --- a/target-ppc/translate_init.c
> +++ b/target-ppc/translate_init.c
> @@ -7976,6 +7976,7 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error
> **errp)
> max_smt, kvm_enabled() ? "KVM" : "TCG");
> return;
> }
> + ppc_fixup_cpu_dt_id(cpu);
It's not a fixup. It's more of a sync or a populate. In fact, it should
probably be inlined.
Alex
> #endif
>
> if (kvm_enabled()) {
> @@ -8598,6 +8599,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
>
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-ppc] [PATCH v5 2/2] target-ppc: spapr: e500: fix to use cpu_dt_id,
Alexander Graf <=