diff options
author | Andreas Färber <afaerber@suse.de> | 2013-02-17 23:16:41 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-03-08 21:04:51 +0100 |
commit | cfe34f44b3a13ed32891e0b3c84be91d3d91a4b8 (patch) | |
tree | cff183f9a5131a984f42a359f1dab7090f6efdc3 /target-ppc/kvm.c | |
parent | de400129daf3ff0f7468363f6d886fcdcc626ea6 (diff) |
target-ppc: Convert CPU definitions
Turn the array of model definitions into a set of self-registering QOM
types with their own class_init. Unique identifiers are obtained from
the combination of PVR, SVR and family identifiers; this requires all
alias #defines to be removed from the list. Possibly there are some more
left after this commit that are not currently being compiled.
Prepares for introducing abstract intermediate CPU types for families.
Keep the right-aligned macro line breaks within 78 chars to aid
three-way merges.
Signed-off-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-ppc/kvm.c')
-rw-r--r-- | target-ppc/kvm.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 8e6441614e..a89c3cf7a5 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -1263,7 +1263,7 @@ static void kvmppc_host_cpu_initfn(Object *obj) assert(kvm_enabled()); - if (pcc->info->pvr != mfpvr()) { + if (pcc->pvr != mfpvr()) { fprintf(stderr, "Your host CPU is unsupported.\n" "Please choose a supported model instead, see -cpu ?.\n"); exit(1); @@ -1275,30 +1275,38 @@ static void kvmppc_host_cpu_class_init(ObjectClass *oc, void *data) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); uint32_t host_pvr = mfpvr(); PowerPCCPUClass *pvr_pcc; - ppc_def_t *spec; uint32_t vmx = kvmppc_get_vmx(); uint32_t dfp = kvmppc_get_dfp(); - spec = g_malloc0(sizeof(*spec)); - pvr_pcc = ppc_cpu_class_by_pvr(host_pvr); if (pvr_pcc != NULL) { - memcpy(spec, pvr_pcc->info, sizeof(*spec)); + pcc->pvr = pvr_pcc->pvr; + pcc->svr = pvr_pcc->svr; + pcc->insns_flags = pvr_pcc->insns_flags; + pcc->insns_flags2 = pvr_pcc->insns_flags2; + pcc->msr_mask = pvr_pcc->msr_mask; + pcc->mmu_model = pvr_pcc->mmu_model; + pcc->excp_model = pvr_pcc->excp_model; + pcc->bus_model = pvr_pcc->bus_model; + pcc->flags = pvr_pcc->flags; + pcc->bfd_mach = pvr_pcc->bfd_mach; +#ifdef TARGET_PPC64 + pcc->sps = pvr_pcc->sps; +#endif + pcc->init_proc = pvr_pcc->init_proc; + pcc->check_pow = pvr_pcc->check_pow; } - pcc->info = spec; - /* Override the display name for -cpu ? and QMP */ - pcc->info->name = "host"; - /* Now fix up the spec with information we can query from the host */ + /* Now fix up the class with information we can query from the host */ if (vmx != -1) { /* Only override when we know what the host supports */ - alter_insns(&spec->insns_flags, PPC_ALTIVEC, vmx > 0); - alter_insns(&spec->insns_flags2, PPC2_VSX, vmx > 1); + alter_insns(&pcc->insns_flags, PPC_ALTIVEC, vmx > 0); + alter_insns(&pcc->insns_flags2, PPC2_VSX, vmx > 1); } if (dfp != -1) { /* Only override when we know what the host supports */ - alter_insns(&spec->insns_flags2, PPC2_DFP, dfp); + alter_insns(&pcc->insns_flags2, PPC2_DFP, dfp); } } |