On Wed, Mar 08, 2017 at 11:52:44AM +0100, Cédric Le Goater wrote: > This helper will be used to translate the server number of the XIVE > (which is a PIR) into an ICPState index number (which is a cpu index). > > Signed-off-by: Cédric Le Goater This seems a slightly roundabout way of doing things. Why not just have the vcpu_by_pir() interface, then have the XICSFabric implementor go directly from PIR to xics server state. > --- > hw/intc/xics.c | 11 +++++++++++ > hw/ppc/ppc.c | 16 ++++++++++++++++ > include/hw/ppc/xics.h | 1 + > target/ppc/cpu.h | 10 ++++++++++ > 4 files changed, 38 insertions(+) > > diff --git a/hw/intc/xics.c b/hw/intc/xics.c > index e740989a1162..209e1a75ecb9 100644 > --- a/hw/intc/xics.c > +++ b/hw/intc/xics.c > @@ -49,6 +49,17 @@ int xics_get_cpu_index_by_dt_id(int cpu_dt_id) > return -1; > } > > +int xics_get_cpu_index_by_pir(int pir) > +{ > + PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir); > + > + if (cpu) { > + return cpu->parent_obj.cpu_index; > + } > + > + return -1; > +} > + > void xics_cpu_destroy(XICSFabric *xi, PowerPCCPU *cpu) > { > CPUState *cs = CPU(cpu); > diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c > index 5f93083d4a16..94bbe382a73a 100644 > --- a/hw/ppc/ppc.c > +++ b/hw/ppc/ppc.c > @@ -1379,6 +1379,22 @@ PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id) > return NULL; > } > > +PowerPCCPU *ppc_get_vcpu_by_pir(int pir) > +{ > + CPUState *cs; > + > + CPU_FOREACH(cs) { > + PowerPCCPU *cpu = POWERPC_CPU(cs); > + CPUPPCState *env = &cpu->env; > + > + if (env->spr_cb[SPR_PIR].default_value == pir) { > + return cpu; > + } > + } > + > + return NULL; > +} > + > void ppc_cpu_parse_features(const char *cpu_model) > { > CPUClass *cc; > diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h > index 9a5e715fe553..42bd24e975cb 100644 > --- a/include/hw/ppc/xics.h > +++ b/include/hw/ppc/xics.h > @@ -173,6 +173,7 @@ void xics_cpu_destroy(XICSFabric *xi, PowerPCCPU *cpu); > > /* Internal XICS interfaces */ > int xics_get_cpu_index_by_dt_id(int cpu_dt_id); > +int xics_get_cpu_index_by_pir(int pir); > > void icp_set_cppr(ICPState *icp, uint8_t cppr); > void icp_set_mfrr(ICPState *icp, uint8_t mfrr); > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index 7c4a1f50b38b..24a5af95cb45 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -2518,5 +2518,15 @@ int ppc_get_vcpu_dt_id(PowerPCCPU *cpu); > */ > PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id); > > +/** > + * ppc_get_vcpu_by_pir_id: > + * @pir: Processor Identifier Register (SPR_PIR) > + * > + * Searches for a CPU by @pir. > + * > + * Returns: a PowerPCCPU struct > + */ > +PowerPCCPU *ppc_get_vcpu_by_pir(int pir); > + > void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len); > #endif /* PPC_CPU_H */ -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson