On Wed, 13 Jun 2018 16:57:07 +1000 David Gibson <da...@gibson.dropbear.id.au> wrote:
> CPUPPCState currently contains a number of fields containing the state of > the VPA. The VPA is a PAPR specific concept covering several guest/host > shared memory areas used to communicate some information with the > hypervisor. > > As a PAPR concept this is really machine specific information, although it > is per-cpu, so it doesn't really belong in the core CPU state structure. > So, move it to the PAPR specific 'machine_data' structure. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > --- Nice ! I'll rework VPA migration on top of that. Reviewed-by: Greg Kurz <gr...@kaod.org> > hw/ppc/spapr_cpu_core.c | 7 +++ > hw/ppc/spapr_hcall.c | 77 ++++++++++++++++++--------------- > include/hw/ppc/spapr_cpu_core.h | 3 ++ > target/ppc/cpu.h | 6 --- > target/ppc/translate_init.inc.c | 8 ---- > 5 files changed, 52 insertions(+), 49 deletions(-) > > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c > index 544bda93e2..f642c95967 100644 > --- a/hw/ppc/spapr_cpu_core.c > +++ b/hw/ppc/spapr_cpu_core.c > @@ -28,6 +28,7 @@ static void spapr_cpu_reset(void *opaque) > CPUState *cs = CPU(cpu); > CPUPPCState *env = &cpu->env; > PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > target_ulong lpcr; > > cpu_reset(cs); > @@ -69,6 +70,12 @@ static void spapr_cpu_reset(void *opaque) > > /* Set a full AMOR so guest can use the AMR as it sees fit */ > env->spr[SPR_AMOR] = 0xffffffffffffffffull; > + > + spapr_cpu->vpa_addr = 0; > + spapr_cpu->slb_shadow_addr = 0; > + spapr_cpu->slb_shadow_size = 0; > + spapr_cpu->dtl_addr = 0; > + spapr_cpu->dtl_size = 0; > } > > void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, > target_ulong r3) > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c > index 8b9a4b577f..ae913d070f 100644 > --- a/hw/ppc/spapr_hcall.c > +++ b/hw/ppc/spapr_hcall.c > @@ -8,6 +8,7 @@ > #include "exec/exec-all.h" > #include "helper_regs.h" > #include "hw/ppc/spapr.h" > +#include "hw/ppc/spapr_cpu_core.h" > #include "mmu-hash64.h" > #include "cpu-models.h" > #include "trace.h" > @@ -908,9 +909,11 @@ unmap_out: > #define VPA_SHARED_PROC_OFFSET 0x9 > #define VPA_SHARED_PROC_VAL 0x2 > > -static target_ulong register_vpa(CPUPPCState *env, target_ulong vpa) > +static target_ulong register_vpa(PowerPCCPU *cpu, target_ulong vpa) > { > - CPUState *cs = CPU(ppc_env_get_cpu(env)); > + CPUState *cs = CPU(cpu); > + CPUPPCState *env = &cpu->env; > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > uint16_t size; > uint8_t tmp; > > @@ -935,32 +938,34 @@ static target_ulong register_vpa(CPUPPCState *env, > target_ulong vpa) > return H_PARAMETER; > } > > - env->vpa_addr = vpa; > + spapr_cpu->vpa_addr = vpa; > > - tmp = ldub_phys(cs->as, env->vpa_addr + VPA_SHARED_PROC_OFFSET); > + tmp = ldub_phys(cs->as, spapr_cpu->vpa_addr + VPA_SHARED_PROC_OFFSET); > tmp |= VPA_SHARED_PROC_VAL; > - stb_phys(cs->as, env->vpa_addr + VPA_SHARED_PROC_OFFSET, tmp); > + stb_phys(cs->as, spapr_cpu->vpa_addr + VPA_SHARED_PROC_OFFSET, tmp); > > return H_SUCCESS; > } > > -static target_ulong deregister_vpa(CPUPPCState *env, target_ulong vpa) > +static target_ulong deregister_vpa(PowerPCCPU *cpu, target_ulong vpa) > { > - if (env->slb_shadow_addr) { > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > + > + if (spapr_cpu->slb_shadow_addr) { > return H_RESOURCE; > } > > - if (env->dtl_addr) { > + if (spapr_cpu->dtl_addr) { > return H_RESOURCE; > } > > - env->vpa_addr = 0; > + spapr_cpu->vpa_addr = 0; > return H_SUCCESS; > } > > -static target_ulong register_slb_shadow(CPUPPCState *env, target_ulong addr) > +static target_ulong register_slb_shadow(PowerPCCPU *cpu, target_ulong addr) > { > - CPUState *cs = CPU(ppc_env_get_cpu(env)); > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > uint32_t size; > > if (addr == 0) { > @@ -968,7 +973,7 @@ static target_ulong register_slb_shadow(CPUPPCState *env, > target_ulong addr) > return H_HARDWARE; > } > > - size = ldl_be_phys(cs->as, addr + 0x4); > + size = ldl_be_phys(CPU(cpu)->as, addr + 0x4); > if (size < 0x8) { > return H_PARAMETER; > } > @@ -977,26 +982,28 @@ static target_ulong register_slb_shadow(CPUPPCState > *env, target_ulong addr) > return H_PARAMETER; > } > > - if (!env->vpa_addr) { > + if (!spapr_cpu->vpa_addr) { > return H_RESOURCE; > } > > - env->slb_shadow_addr = addr; > - env->slb_shadow_size = size; > + spapr_cpu->slb_shadow_addr = addr; > + spapr_cpu->slb_shadow_size = size; > > return H_SUCCESS; > } > > -static target_ulong deregister_slb_shadow(CPUPPCState *env, target_ulong > addr) > +static target_ulong deregister_slb_shadow(PowerPCCPU *cpu, target_ulong addr) > { > - env->slb_shadow_addr = 0; > - env->slb_shadow_size = 0; > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > + > + spapr_cpu->slb_shadow_addr = 0; > + spapr_cpu->slb_shadow_size = 0; > return H_SUCCESS; > } > > -static target_ulong register_dtl(CPUPPCState *env, target_ulong addr) > +static target_ulong register_dtl(PowerPCCPU *cpu, target_ulong addr) > { > - CPUState *cs = CPU(ppc_env_get_cpu(env)); > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > uint32_t size; > > if (addr == 0) { > @@ -1004,26 +1011,28 @@ static target_ulong register_dtl(CPUPPCState *env, > target_ulong addr) > return H_HARDWARE; > } > > - size = ldl_be_phys(cs->as, addr + 0x4); > + size = ldl_be_phys(CPU(cpu)->as, addr + 0x4); > > if (size < 48) { > return H_PARAMETER; > } > > - if (!env->vpa_addr) { > + if (!spapr_cpu->vpa_addr) { > return H_RESOURCE; > } > > - env->dtl_addr = addr; > - env->dtl_size = size; > + spapr_cpu->dtl_addr = addr; > + spapr_cpu->dtl_size = size; > > return H_SUCCESS; > } > > -static target_ulong deregister_dtl(CPUPPCState *env, target_ulong addr) > +static target_ulong deregister_dtl(PowerPCCPU *cpu, target_ulong addr) > { > - env->dtl_addr = 0; > - env->dtl_size = 0; > + sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); > + > + spapr_cpu->dtl_addr = 0; > + spapr_cpu->dtl_size = 0; > > return H_SUCCESS; > } > @@ -1035,38 +1044,36 @@ static target_ulong h_register_vpa(PowerPCCPU *cpu, > sPAPRMachineState *spapr, > target_ulong procno = args[1]; > target_ulong vpa = args[2]; > target_ulong ret = H_PARAMETER; > - CPUPPCState *tenv; > PowerPCCPU *tcpu; > > tcpu = spapr_find_cpu(procno); > if (!tcpu) { > return H_PARAMETER; > } > - tenv = &tcpu->env; > > switch (flags) { > case FLAGS_REGISTER_VPA: > - ret = register_vpa(tenv, vpa); > + ret = register_vpa(tcpu, vpa); > break; > > case FLAGS_DEREGISTER_VPA: > - ret = deregister_vpa(tenv, vpa); > + ret = deregister_vpa(tcpu, vpa); > break; > > case FLAGS_REGISTER_SLBSHADOW: > - ret = register_slb_shadow(tenv, vpa); > + ret = register_slb_shadow(tcpu, vpa); > break; > > case FLAGS_DEREGISTER_SLBSHADOW: > - ret = deregister_slb_shadow(tenv, vpa); > + ret = deregister_slb_shadow(tcpu, vpa); > break; > > case FLAGS_REGISTER_DTL: > - ret = register_dtl(tenv, vpa); > + ret = register_dtl(tcpu, vpa); > break; > > case FLAGS_DEREGISTER_DTL: > - ret = deregister_dtl(tenv, vpa); > + ret = deregister_dtl(tcpu, vpa); > break; > } > > diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h > index e3d2aa45a4..40129cc452 100644 > --- a/include/hw/ppc/spapr_cpu_core.h > +++ b/include/hw/ppc/spapr_cpu_core.h > @@ -44,6 +44,9 @@ void spapr_cpu_set_entry_state(PowerPCCPU *cpu, > target_ulong nip, target_ulong r > typedef struct ICPState ICPState; > typedef struct sPAPRCPUState { > ICPState *icp; > + uint64_t vpa_addr; > + uint64_t slb_shadow_addr, slb_shadow_size; > + uint64_t dtl_addr, dtl_size; > } sPAPRCPUState; > > static inline sPAPRCPUState *spapr_cpu_state(PowerPCCPU *cpu) > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index abf0bf0224..6c2f4d29f2 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -1091,12 +1091,6 @@ struct CPUPPCState { > target_ulong rmls; > #endif > > -#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) > - uint64_t vpa_addr; > - uint64_t slb_shadow_addr, slb_shadow_size; > - uint64_t dtl_addr, dtl_size; > -#endif /* TARGET_PPC64 */ > - > int error_code; > uint32_t pending_interrupts; > #if !defined(CONFIG_USER_ONLY) > diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c > index bb9296f5a3..76d6f3fd5e 100644 > --- a/target/ppc/translate_init.inc.c > +++ b/target/ppc/translate_init.inc.c > @@ -10316,14 +10316,6 @@ static void ppc_cpu_reset(CPUState *s) > s->exception_index = POWERPC_EXCP_NONE; > env->error_code = 0; > > -#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) > - env->vpa_addr = 0; > - env->slb_shadow_addr = 0; > - env->slb_shadow_size = 0; > - env->dtl_addr = 0; > - env->dtl_size = 0; > -#endif /* TARGET_PPC64 */ > - > for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) { > ppc_spr_t *spr = &env->spr_cb[i]; >