Patchwork [45/66] target-ppc: Introduce abstract CPU family types

login
register
mail settings
Submitter Alexander Graf
Date March 8, 2013, 8:06 p.m.
Message ID <1362773228-1747-46-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/226246/
State New
Headers show

Comments

Alexander Graf - March 8, 2013, 8:06 p.m.
From: Andreas Färber <afaerber@suse.de>

Instead of assigning *_<family> constants, set .parent to a family type.

Introduce a POWERPC_FAMILY() macro to keep type registration close to
its implementation. This macro will need tweaking later.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 target-ppc/translate_init.c |  501 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 432 insertions(+), 69 deletions(-)

Patch

diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index f707197..c300aa8 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -3252,6 +3252,28 @@  static int check_pow_hid0_74xx (CPUPPCState *env)
 /*****************************************************************************/
 /* PowerPC implementations definitions                                       */
 
+#define POWERPC_FAMILY(_name)                                               \
+    static void                                                             \
+    glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
+                                                                            \
+    static const TypeInfo                                                   \
+    glue(glue(ppc_, _name), _cpu_family_type_info) = {                      \
+        .name = stringify(_name) "-family-" TYPE_POWERPC_CPU,               \
+        .parent = TYPE_POWERPC_CPU,                                         \
+        .abstract = true,                                                   \
+        .class_init = glue(glue(ppc_, _name), _cpu_family_class_init),      \
+    };                                                                      \
+                                                                            \
+    static void glue(glue(ppc_, _name), _cpu_family_register_types)(void)   \
+    {                                                                       \
+        type_register_static(                                               \
+            &glue(glue(ppc_, _name), _cpu_family_type_info));               \
+    }                                                                       \
+                                                                            \
+    type_init(glue(glue(ppc_, _name), _cpu_family_register_types))          \
+                                                                            \
+    static void glue(glue(ppc_, _name), _cpu_family_class_init)
+
 /* PowerPC 401                                                               */
 #define POWERPC_INSNS_401    (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_WRTEE | PPC_DCR |                           \
@@ -3267,7 +3289,6 @@  static int check_pow_hid0_74xx (CPUPPCState *env)
 #define POWERPC_BFDM_401     (bfd_mach_ppc_403)
 #define POWERPC_FLAG_401     (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_401        check_pow_nocheck
 
 static void init_proc_401 (CPUPPCState *env)
 {
@@ -3284,6 +3305,14 @@  static void init_proc_401 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_401;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 401x2                                                             */
 #define POWERPC_INSNS_401x2  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3300,7 +3329,6 @@  static void init_proc_401 (CPUPPCState *env)
 #define POWERPC_BFDM_401x2   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_401x2   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_401x2      check_pow_nocheck
 
 static void init_proc_401x2 (CPUPPCState *env)
 {
@@ -3325,6 +3353,14 @@  static void init_proc_401x2 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_401x2;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 401x3                                                             */
 #define POWERPC_INSNS_401x3  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3341,9 +3377,7 @@  static void init_proc_401x2 (CPUPPCState *env)
 #define POWERPC_BFDM_401x3   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_401x3   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_401x3      check_pow_nocheck
 
-__attribute__ (( unused ))
 static void init_proc_401x3 (CPUPPCState *env)
 {
     gen_spr_40x(env);
@@ -3361,6 +3395,14 @@  static void init_proc_401x3 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_401x3;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* IOP480                                                                    */
 #define POWERPC_INSNS_IOP480 (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3377,7 +3419,6 @@  static void init_proc_401x3 (CPUPPCState *env)
 #define POWERPC_BFDM_IOP480  (bfd_mach_ppc_403)
 #define POWERPC_FLAG_IOP480  (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_IOP480     check_pow_nocheck
 
 static void init_proc_IOP480 (CPUPPCState *env)
 {
@@ -3402,6 +3443,14 @@  static void init_proc_IOP480 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_IOP480;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 403                                                               */
 #define POWERPC_INSNS_403    (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3417,7 +3466,6 @@  static void init_proc_IOP480 (CPUPPCState *env)
 #define POWERPC_BFDM_403     (bfd_mach_ppc_403)
 #define POWERPC_FLAG_403     (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_403        check_pow_nocheck
 
 static void init_proc_403 (CPUPPCState *env)
 {
@@ -3435,6 +3483,14 @@  static void init_proc_403 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_403;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 403 GCX                                                           */
 #define POWERPC_INSNS_403GCX (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3451,7 +3507,6 @@  static void init_proc_403 (CPUPPCState *env)
 #define POWERPC_BFDM_403GCX  (bfd_mach_ppc_403)
 #define POWERPC_FLAG_403GCX  (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_403GCX     check_pow_nocheck
 
 static void init_proc_403GCX (CPUPPCState *env)
 {
@@ -3488,6 +3543,14 @@  static void init_proc_403GCX (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_403GCX;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 405                                                               */
 #define POWERPC_INSNS_405    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3504,7 +3567,6 @@  static void init_proc_403GCX (CPUPPCState *env)
 #define POWERPC_BFDM_405     (bfd_mach_ppc_403)
 #define POWERPC_FLAG_405     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_405        check_pow_nocheck
 
 static void init_proc_405 (CPUPPCState *env)
 {
@@ -3540,6 +3602,14 @@  static void init_proc_405 (CPUPPCState *env)
     SET_WDT_PERIOD(16, 20, 24, 28);
 }
 
+POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_405;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 440 EP                                                            */
 #define POWERPC_INSNS_440EP  (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |   \
@@ -3559,7 +3629,6 @@  static void init_proc_405 (CPUPPCState *env)
 #define POWERPC_BFDM_440EP   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_440EP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_440EP      check_pow_nocheck
 
 static void init_proc_440EP (CPUPPCState *env)
 {
@@ -3627,6 +3696,14 @@  static void init_proc_440EP (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_440EP;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 440 GP                                                            */
 #define POWERPC_INSNS_440GP  (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |  \
@@ -3643,9 +3720,7 @@  static void init_proc_440EP (CPUPPCState *env)
 #define POWERPC_BFDM_440GP   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_440GP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_440GP      check_pow_nocheck
 
-__attribute__ (( unused ))
 static void init_proc_440GP (CPUPPCState *env)
 {
     /* Time base */
@@ -3694,6 +3769,14 @@  static void init_proc_440GP (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_440GP;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 440x4                                                             */
 #define POWERPC_INSNS_440x4  (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_WRTEE |                           \
@@ -3710,9 +3793,7 @@  static void init_proc_440GP (CPUPPCState *env)
 #define POWERPC_BFDM_440x4   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_440x4   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_440x4      check_pow_nocheck
 
-__attribute__ (( unused ))
 static void init_proc_440x4 (CPUPPCState *env)
 {
     /* Time base */
@@ -3761,6 +3842,14 @@  static void init_proc_440x4 (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_440x4;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 440x5                                                             */
 #define POWERPC_INSNS_440x5  (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_WRTEE | PPC_RFMCI |               \
@@ -3777,7 +3866,6 @@  static void init_proc_440x4 (CPUPPCState *env)
 #define POWERPC_BFDM_440x5   (bfd_mach_ppc_403)
 #define POWERPC_FLAG_440x5   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |           \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_440x5      check_pow_nocheck
 
 static void init_proc_440x5 (CPUPPCState *env)
 {
@@ -3845,6 +3933,14 @@  static void init_proc_440x5 (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_440x5;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 460 (guessed)                                                     */
 #define POWERPC_INSNS_460    (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_DCR | PPC_DCRX  | PPC_DCRUX |               \
@@ -3862,9 +3958,7 @@  static void init_proc_440x5 (CPUPPCState *env)
 #define POWERPC_BFDM_460     (bfd_mach_ppc_403)
 #define POWERPC_FLAG_460     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_460        check_pow_nocheck
 
-__attribute__ (( unused ))
 static void init_proc_460 (CPUPPCState *env)
 {
     /* Time base */
@@ -3936,6 +4030,14 @@  static void init_proc_460 (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(460)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_460;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 460F (guessed)                                                    */
 #define POWERPC_INSNS_460F   (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |   \
@@ -3956,9 +4058,7 @@  static void init_proc_460 (CPUPPCState *env)
 #define POWERPC_BFDM_460F    (bfd_mach_ppc_403)
 #define POWERPC_FLAG_460F    (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_460F       check_pow_nocheck
 
-__attribute__ (( unused ))
 static void init_proc_460F (CPUPPCState *env)
 {
     /* Time base */
@@ -4030,6 +4130,14 @@  static void init_proc_460F (CPUPPCState *env)
     SET_WDT_PERIOD(20, 24, 28, 32);
 }
 
+POWERPC_FAMILY(460F)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_460F;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* Freescale 5xx cores (aka RCPU) */
 #define POWERPC_INSNS_MPC5xx (PPC_INSNS_BASE | PPC_STRING |                   \
                               PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
@@ -4043,9 +4151,7 @@  static void init_proc_460F (CPUPPCState *env)
 #define POWERPC_BFDM_MPC5xx  (bfd_mach_ppc_505)
 #define POWERPC_FLAG_MPC5xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_MPC5xx     check_pow_none
 
-__attribute__ (( unused ))
 static void init_proc_MPC5xx (CPUPPCState *env)
 {
     /* Time base */
@@ -4058,6 +4164,14 @@  static void init_proc_MPC5xx (CPUPPCState *env)
     /* XXX: TODO: allocate internal IRQ controller */
 }
 
+POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_MPC5xx;
+    pcc->check_pow = check_pow_none;
+}
+
 /* Freescale 8xx cores (aka PowerQUICC) */
 #define POWERPC_INSNS_MPC8xx (PPC_INSNS_BASE | PPC_STRING  |                  \
                               PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
@@ -4070,9 +4184,7 @@  static void init_proc_MPC5xx (CPUPPCState *env)
 #define POWERPC_BFDM_MPC8xx  (bfd_mach_ppc_860)
 #define POWERPC_FLAG_MPC8xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_MPC8xx     check_pow_none
 
-__attribute__ (( unused ))
 static void init_proc_MPC8xx (CPUPPCState *env)
 {
     /* Time base */
@@ -4085,6 +4197,14 @@  static void init_proc_MPC8xx (CPUPPCState *env)
     /* XXX: TODO: allocate internal IRQ controller */
 }
 
+POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_MPC8xx;
+    pcc->check_pow = check_pow_none;
+}
+
 /* Freescale 82xx cores (aka PowerQUICC-II)                                  */
 /* PowerPC G2                                                                */
 #define POWERPC_INSNS_G2     (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
@@ -4102,7 +4222,6 @@  static void init_proc_MPC8xx (CPUPPCState *env)
 #define POWERPC_BFDM_G2      (bfd_mach_ppc_ec603e)
 #define POWERPC_FLAG_G2      (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_G2         check_pow_hid0
 
 static void init_proc_G2 (CPUPPCState *env)
 {
@@ -4144,6 +4263,14 @@  static void init_proc_G2 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_G2;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC G2LE                                                              */
 #define POWERPC_INSNS_G2LE   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4160,7 +4287,6 @@  static void init_proc_G2 (CPUPPCState *env)
 #define POWERPC_BFDM_G2LE    (bfd_mach_ppc_ec603e)
 #define POWERPC_FLAG_G2LE    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_G2LE       check_pow_hid0
 
 static void init_proc_G2LE (CPUPPCState *env)
 {
@@ -4202,6 +4328,14 @@  static void init_proc_G2LE (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_G2LE;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* e200 core                                                                 */
 /* XXX: unimplemented instructions:
  * dcblc
@@ -4228,9 +4362,7 @@  static void init_proc_G2LE (CPUPPCState *env)
 #define POWERPC_FLAG_e200    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |            \
                               POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |           \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_e200       check_pow_hid0
 
-__attribute__ (( unused ))
 static void init_proc_e200 (CPUPPCState *env)
 {
     /* Time base */
@@ -4338,6 +4470,14 @@  static void init_proc_e200 (CPUPPCState *env)
     /* XXX: TODO: allocate internal IRQ controller */
 }
 
+POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e200;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* e300 core                                                                 */
 #define POWERPC_INSNS_e300   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4354,9 +4494,7 @@  static void init_proc_e200 (CPUPPCState *env)
 #define POWERPC_BFDM_e300    (bfd_mach_ppc_603)
 #define POWERPC_FLAG_e300    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_e300       check_pow_hid0
 
-__attribute__ (( unused ))
 static void init_proc_e300 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -4390,6 +4528,14 @@  static void init_proc_e300 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e300;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* e500v1 core                                                               */
 #define POWERPC_INSNS_e500v1   (PPC_INSNS_BASE | PPC_ISEL |             \
                                 PPC_SPE | PPC_SPE_SINGLE |              \
@@ -4406,8 +4552,6 @@  static void init_proc_e300 (CPUPPCState *env)
 #define POWERPC_FLAG_e500v1    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
                                 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
                                 POWERPC_FLAG_BUS_CLK)
-#define check_pow_e500v1       check_pow_hid0
-#define init_proc_e500v1       init_proc_e500v1
 
 /* e500v2 core                                                               */
 #define POWERPC_INSNS_e500v2   (PPC_INSNS_BASE | PPC_ISEL |             \
@@ -4425,8 +4569,6 @@  static void init_proc_e300 (CPUPPCState *env)
 #define POWERPC_FLAG_e500v2    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
                                 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
                                 POWERPC_FLAG_BUS_CLK)
-#define check_pow_e500v2       check_pow_hid0
-#define init_proc_e500v2       init_proc_e500v2
 
 /* e500mc core                                                               */
 #define POWERPC_INSNS_e500mc   (PPC_INSNS_BASE | PPC_ISEL |                 \
@@ -4446,8 +4588,6 @@  static void init_proc_e300 (CPUPPCState *env)
 #define POWERPC_BFDM_e500mc    (bfd_mach_ppc_e500)
 #define POWERPC_FLAG_e500mc    (POWERPC_FLAG_CE | POWERPC_FLAG_DE | \
                                 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_e500mc       check_pow_none
-#define init_proc_e500mc       init_proc_e500mc
 
 /* e5500 core                                                                 */
 #define POWERPC_INSNS_e5500    (PPC_INSNS_BASE | PPC_ISEL |                    \
@@ -4468,8 +4608,6 @@  static void init_proc_e300 (CPUPPCState *env)
 #define POWERPC_BFDM_e5500     (bfd_mach_ppc_e500)
 #define POWERPC_FLAG_e5500     (POWERPC_FLAG_CE | POWERPC_FLAG_DE | \
                                 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_e5500        check_pow_none
-#define init_proc_e5500        init_proc_e5500
 
 #if !defined(CONFIG_USER_ONLY)
 static void spr_write_mas73(void *opaque, int sprn, int gprn)
@@ -4685,21 +4823,53 @@  static void init_proc_e500v1(CPUPPCState *env)
     init_proc_e500(env, fsl_e500v1);
 }
 
+POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e500v1;
+    pcc->check_pow = check_pow_hid0;
+}
+
 static void init_proc_e500v2(CPUPPCState *env)
 {
     init_proc_e500(env, fsl_e500v2);
 }
 
+POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e500v2;
+    pcc->check_pow = check_pow_hid0;
+}
+
 static void init_proc_e500mc(CPUPPCState *env)
 {
     init_proc_e500(env, fsl_e500mc);
 }
 
+POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e500mc;
+    pcc->check_pow = check_pow_none;
+}
+
 #ifdef TARGET_PPC64
 static void init_proc_e5500(CPUPPCState *env)
 {
     init_proc_e500(env, fsl_e5500);
 }
+
+POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_e5500;
+    pcc->check_pow = check_pow_none;
+}
 #endif
 
 /* Non-embedded PowerPC                                                      */
@@ -4725,7 +4895,6 @@  static void init_proc_e5500(CPUPPCState *env)
 #define POWERPC_INPUT_601    (PPC_FLAGS_INPUT_6xx)
 #define POWERPC_BFDM_601     (bfd_mach_ppc_601)
 #define POWERPC_FLAG_601     (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
-#define check_pow_601        check_pow_none
 
 static void init_proc_601 (CPUPPCState *env)
 {
@@ -4764,6 +4933,14 @@  static void init_proc_601 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_601;
+    pcc->check_pow = check_pow_none;
+}
+
 /* PowerPC 601v                                                              */
 #define POWERPC_INSNS_601v   (PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |    \
                               PPC_FLOAT |                                     \
@@ -4778,7 +4955,6 @@  static void init_proc_601 (CPUPPCState *env)
 #define POWERPC_INPUT_601v   (PPC_FLAGS_INPUT_6xx)
 #define POWERPC_BFDM_601v    (bfd_mach_ppc_601)
 #define POWERPC_FLAG_601v    (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
-#define check_pow_601v       check_pow_none
 
 static void init_proc_601v (CPUPPCState *env)
 {
@@ -4790,6 +4966,14 @@  static void init_proc_601v (CPUPPCState *env)
                  0x00000000);
 }
 
+POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_601v;
+    pcc->check_pow = check_pow_none;
+}
+
 /* PowerPC 602                                                               */
 #define POWERPC_INSNS_602    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4807,7 +4991,6 @@  static void init_proc_601v (CPUPPCState *env)
 #define POWERPC_BFDM_602     (bfd_mach_ppc_602)
 #define POWERPC_FLAG_602     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_602        check_pow_hid0
 
 static void init_proc_602 (CPUPPCState *env)
 {
@@ -4836,6 +5019,14 @@  static void init_proc_602 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_602;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 603                                                               */
 #define POWERPC_INSNS_603    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4852,7 +5043,6 @@  static void init_proc_602 (CPUPPCState *env)
 #define POWERPC_BFDM_603     (bfd_mach_ppc_603)
 #define POWERPC_FLAG_603     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_603        check_pow_hid0
 
 static void init_proc_603 (CPUPPCState *env)
 {
@@ -4881,6 +5071,14 @@  static void init_proc_603 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_603;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 603e                                                              */
 #define POWERPC_INSNS_603E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4897,7 +5095,6 @@  static void init_proc_603 (CPUPPCState *env)
 #define POWERPC_BFDM_603E    (bfd_mach_ppc_ec603e)
 #define POWERPC_FLAG_603E    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
-#define check_pow_603E       check_pow_hid0
 
 static void init_proc_603E (CPUPPCState *env)
 {
@@ -4931,6 +5128,14 @@  static void init_proc_603E (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_603E;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 604                                                               */
 #define POWERPC_INSNS_604    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4947,7 +5152,6 @@  static void init_proc_603E (CPUPPCState *env)
 #define POWERPC_BFDM_604     (bfd_mach_ppc_604)
 #define POWERPC_FLAG_604     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_604        check_pow_nocheck
 
 static void init_proc_604 (CPUPPCState *env)
 {
@@ -4970,6 +5174,14 @@  static void init_proc_604 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_604;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 604E                                                              */
 #define POWERPC_INSNS_604E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -4986,7 +5198,6 @@  static void init_proc_604 (CPUPPCState *env)
 #define POWERPC_BFDM_604E    (bfd_mach_ppc_604)
 #define POWERPC_FLAG_604E    (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_604E       check_pow_nocheck
 
 static void init_proc_604E (CPUPPCState *env)
 {
@@ -5029,6 +5240,14 @@  static void init_proc_604E (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_604E;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 740                                                               */
 #define POWERPC_INSNS_740    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5045,7 +5264,6 @@  static void init_proc_604E (CPUPPCState *env)
 #define POWERPC_BFDM_740     (bfd_mach_ppc_750)
 #define POWERPC_FLAG_740     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_740        check_pow_hid0
 
 static void init_proc_740 (CPUPPCState *env)
 {
@@ -5075,6 +5293,14 @@  static void init_proc_740 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_740;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 750                                                               */
 #define POWERPC_INSNS_750    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5091,7 +5317,6 @@  static void init_proc_740 (CPUPPCState *env)
 #define POWERPC_BFDM_750     (bfd_mach_ppc_750)
 #define POWERPC_FLAG_750     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_750        check_pow_hid0
 
 static void init_proc_750 (CPUPPCState *env)
 {
@@ -5129,6 +5354,14 @@  static void init_proc_750 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_750;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 750 CL                                                            */
 /* XXX: not implemented:
  * cache lock instructions:
@@ -5183,7 +5416,6 @@  static void init_proc_750 (CPUPPCState *env)
 #define POWERPC_BFDM_750cl   (bfd_mach_ppc_750)
 #define POWERPC_FLAG_750cl   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_750cl      check_pow_hid0
 
 static void init_proc_750cl (CPUPPCState *env)
 {
@@ -5306,6 +5538,14 @@  static void init_proc_750cl (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_750cl;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 750CX                                                             */
 #define POWERPC_INSNS_750cx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5322,7 +5562,6 @@  static void init_proc_750cl (CPUPPCState *env)
 #define POWERPC_BFDM_750cx   (bfd_mach_ppc_750)
 #define POWERPC_FLAG_750cx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_750cx      check_pow_hid0
 
 static void init_proc_750cx (CPUPPCState *env)
 {
@@ -5364,6 +5603,14 @@  static void init_proc_750cx (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_750cx;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 750FX                                                             */
 #define POWERPC_INSNS_750fx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5380,7 +5627,6 @@  static void init_proc_750cx (CPUPPCState *env)
 #define POWERPC_BFDM_750fx   (bfd_mach_ppc_750)
 #define POWERPC_FLAG_750fx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_750fx      check_pow_hid0
 
 static void init_proc_750fx (CPUPPCState *env)
 {
@@ -5427,6 +5673,14 @@  static void init_proc_750fx (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_750fx;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 750GX                                                             */
 #define POWERPC_INSNS_750gx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5443,7 +5697,6 @@  static void init_proc_750fx (CPUPPCState *env)
 #define POWERPC_BFDM_750gx   (bfd_mach_ppc_750)
 #define POWERPC_FLAG_750gx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_750gx      check_pow_hid0
 
 static void init_proc_750gx (CPUPPCState *env)
 {
@@ -5490,6 +5743,14 @@  static void init_proc_750gx (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_750gx;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 745                                                               */
 #define POWERPC_INSNS_745    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5506,7 +5767,6 @@  static void init_proc_750gx (CPUPPCState *env)
 #define POWERPC_BFDM_745     (bfd_mach_ppc_750)
 #define POWERPC_FLAG_745     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_745        check_pow_hid0
 
 static void init_proc_745 (CPUPPCState *env)
 {
@@ -5544,6 +5804,14 @@  static void init_proc_745 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_745;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 755                                                               */
 #define POWERPC_INSNS_755    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5560,7 +5828,6 @@  static void init_proc_745 (CPUPPCState *env)
 #define POWERPC_BFDM_755     (bfd_mach_ppc_750)
 #define POWERPC_FLAG_755     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_755        check_pow_hid0
 
 static void init_proc_755 (CPUPPCState *env)
 {
@@ -5609,6 +5876,14 @@  static void init_proc_755 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_755;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 7400 (aka G4)                                                     */
 #define POWERPC_INSNS_7400   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5630,7 +5905,6 @@  static void init_proc_755 (CPUPPCState *env)
 #define POWERPC_FLAG_7400    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7400       check_pow_hid0
 
 static void init_proc_7400 (CPUPPCState *env)
 {
@@ -5662,6 +5936,14 @@  static void init_proc_7400 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7400;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 7410 (aka G4)                                                     */
 #define POWERPC_INSNS_7410   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5683,7 +5965,6 @@  static void init_proc_7400 (CPUPPCState *env)
 #define POWERPC_FLAG_7410    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7410       check_pow_hid0
 
 static void init_proc_7410 (CPUPPCState *env)
 {
@@ -5721,6 +6002,14 @@  static void init_proc_7410 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7410;
+    pcc->check_pow = check_pow_hid0;
+}
+
 /* PowerPC 7440 (aka G4)                                                     */
 #define POWERPC_INSNS_7440   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5742,9 +6031,7 @@  static void init_proc_7410 (CPUPPCState *env)
 #define POWERPC_FLAG_7440    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7440       check_pow_hid0_74xx
 
-__attribute__ (( unused ))
 static void init_proc_7440 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -5807,6 +6094,14 @@  static void init_proc_7440 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7440;
+    pcc->check_pow = check_pow_hid0_74xx;
+}
+
 /* PowerPC 7450 (aka G4)                                                     */
 #define POWERPC_INSNS_7450   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5828,9 +6123,7 @@  static void init_proc_7440 (CPUPPCState *env)
 #define POWERPC_FLAG_7450    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7450       check_pow_hid0_74xx
 
-__attribute__ (( unused ))
 static void init_proc_7450 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -5919,6 +6212,14 @@  static void init_proc_7450 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7450;
+    pcc->check_pow = check_pow_hid0_74xx;
+}
+
 /* PowerPC 7445 (aka G4)                                                     */
 #define POWERPC_INSNS_7445   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -5940,9 +6241,7 @@  static void init_proc_7450 (CPUPPCState *env)
 #define POWERPC_FLAG_7445    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7445       check_pow_hid0_74xx
 
-__attribute__ (( unused ))
 static void init_proc_7445 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -6034,6 +6333,14 @@  static void init_proc_7445 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7445;
+    pcc->check_pow = check_pow_hid0_74xx;
+}
+
 /* PowerPC 7455 (aka G4)                                                     */
 #define POWERPC_INSNS_7455   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6055,9 +6362,7 @@  static void init_proc_7445 (CPUPPCState *env)
 #define POWERPC_FLAG_7455    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7455       check_pow_hid0_74xx
 
-__attribute__ (( unused ))
 static void init_proc_7455 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -6151,6 +6456,14 @@  static void init_proc_7455 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7455;
+    pcc->check_pow = check_pow_hid0_74xx;
+}
+
 /* PowerPC 7457 (aka G4)                                                     */
 #define POWERPC_INSNS_7457   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6172,9 +6485,7 @@  static void init_proc_7455 (CPUPPCState *env)
 #define POWERPC_FLAG_7457    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK)
-#define check_pow_7457       check_pow_hid0_74xx
 
-__attribute__ (( unused ))
 static void init_proc_7457 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -6292,6 +6603,14 @@  static void init_proc_7457 (CPUPPCState *env)
     ppc6xx_irq_init(env);
 }
 
+POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_7457;
+    pcc->check_pow = check_pow_hid0_74xx;
+}
+
 #if defined (TARGET_PPC64)
 /* PowerPC 970                                                               */
 #define POWERPC_INSNS_970    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
@@ -6389,6 +6708,14 @@  static void init_proc_970 (CPUPPCState *env)
     vscr_init(env, 0x00010000);
 }
 
+POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_970;
+    pcc->check_pow = check_pow_970;
+}
+
 /* PowerPC 970FX (aka G5)                                                    */
 #define POWERPC_INSNS_970FX  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6491,6 +6818,14 @@  static void init_proc_970FX (CPUPPCState *env)
     vscr_init(env, 0x00010000);
 }
 
+POWERPC_FAMILY(970FX)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_970FX;
+    pcc->check_pow = check_pow_970FX;
+}
+
 /* PowerPC 970 GX                                                            */
 #define POWERPC_INSNS_970GX  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6581,6 +6916,14 @@  static void init_proc_970GX (CPUPPCState *env)
     vscr_init(env, 0x00010000);
 }
 
+POWERPC_FAMILY(970GX)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_970GX;
+    pcc->check_pow = check_pow_970GX;
+}
+
 /* PowerPC 970 MP                                                            */
 #define POWERPC_INSNS_970MP  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6671,6 +7014,14 @@  static void init_proc_970MP (CPUPPCState *env)
     vscr_init(env, 0x00010000);
 }
 
+POWERPC_FAMILY(970MP)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_970MP;
+    pcc->check_pow = check_pow_970MP;
+}
+
 /* POWER7 */
 #define POWERPC_INSNS_POWER7  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6691,7 +7042,6 @@  static void init_proc_970MP (CPUPPCState *env)
 #define POWERPC_FLAG_POWER7   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
                               POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR)
-#define check_pow_POWER7    check_pow_nocheck
 
 static void init_proc_POWER7 (CPUPPCState *env)
 {
@@ -6755,6 +7105,14 @@  static void init_proc_POWER7 (CPUPPCState *env)
     vscr_init(env, 0x00010000);
 }
 
+POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_POWER7;
+    pcc->check_pow = check_pow_nocheck;
+}
+
 /* PowerPC 620                                                               */
 #define POWERPC_INSNS_620    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
@@ -6773,9 +7131,7 @@  static void init_proc_POWER7 (CPUPPCState *env)
 #define POWERPC_BFDM_620     (bfd_mach_ppc64)
 #define POWERPC_FLAG_620     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |            \
                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
-#define check_pow_620        check_pow_nocheck /* Check this */
 
-__attribute__ (( unused ))
 static void init_proc_620 (CPUPPCState *env)
 {
     gen_spr_ne_601(env);
@@ -6796,6 +7152,15 @@  static void init_proc_620 (CPUPPCState *env)
     /* Allocate hardware IRQ controller */
     ppc6xx_irq_init(env);
 }
+
+POWERPC_FAMILY(620)(ObjectClass *oc, void *data)
+{
+    PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+
+    pcc->init_proc = init_proc_620;
+    pcc->check_pow = check_pow_nocheck; /* Check this */
+}
+
 #endif /* defined (TARGET_PPC64) */
 
 /*****************************************************************************/
@@ -7530,14 +7895,12 @@  enum {
         pcc->bus_model    = glue(POWERPC_INPUT_, _type);                    \
         pcc->bfd_mach     = glue(POWERPC_BFDM_, _type);                     \
         pcc->flags        = glue(POWERPC_FLAG_, _type);                     \
-        pcc->init_proc    = &glue(init_proc_, _type);                       \
-        pcc->check_pow    = &glue(check_pow_, _type);                       \
     }                                                                       \
                                                                             \
     static const TypeInfo                                                   \
     glue(POWERPC_DEF_PREFIX(_pvr, _svr, _type), _cpu_type_info) = {         \
         .name       = _name "-" TYPE_POWERPC_CPU,                           \
-        .parent     = TYPE_POWERPC_CPU,                                     \
+        .parent     = stringify(_type) "-family-" TYPE_POWERPC_CPU,         \
         .class_init =                                                       \
             glue(POWERPC_DEF_PREFIX(_pvr, _svr, _type), _cpu_class_init),   \
     };                                                                      \