qemu-ppc
[Top][All Lists]
Advanced

[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, &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 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
> 
> 




reply via email to

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