@@ -126,21 +126,12 @@ static const TypeInfo accel_types[] = {
.instance_size = sizeof(AccelState),
.abstract = true,
},
+ {
+ .name = TYPE_ACCEL_CPU,
+ .parent = TYPE_OBJECT,
+ .abstract = true,
+ .class_size = sizeof(AccelCPUClass),
+ },
};
DEFINE_TYPES(accel_types)
-
-static void register_accel_target_type(void)
-{
- g_autofree char *name = g_strconcat("accel-", target_cpu_type(), NULL);
- const TypeInfo accel_cpu_type = {
- .name = name,
- .parent = TYPE_OBJECT,
- .abstract = true,
- .class_size = sizeof(AccelCPUClass),
- };
-
- type_register_static(&accel_cpu_type);
-}
-
-type_init(register_accel_target_type);
@@ -24,8 +24,7 @@
#include "accel/accel-cpu.h"
#include "cpu.h"
-#define TYPE_ACCEL_CPU "accel-" CPU_RESOLVING_TYPE
-#define ACCEL_CPU_NAME(name) (name "-" TYPE_ACCEL_CPU)
+#define ACCEL_CPU_NAME(name) (name "-accel-" CPU_RESOLVING_TYPE)
DECLARE_CLASS_CHECKERS(AccelCPUClass, ACCEL_CPU, TYPE_ACCEL_CPU)
#endif /* ACCEL_CPU_H */
@@ -12,6 +12,8 @@
#include "qom/object.h"
#include "hw/core/cpu.h"
+#define TYPE_ACCEL_CPU "accel-cpu"
+
typedef struct AccelCPUClass {
ObjectClass parent_class;
- TYPE_ACCEL_CPU was "accel-" CPU_RESOLVING_TYPE, so each arch compiled a different parent (accel-arm-cpu, accel-riscv-cpu, ...). Common code registered only one of those names from target_cpu_type() at MODULE_INIT_QOM. - A combined binary still registers every linked AccelCPU subclass. RISC-V tcg-accel-riscv-cpu has parent accel-riscv-cpu even when the selected target is ARM, so the old one-parent type_init does not cover the other family. Creating the parent in the subclass register path would hide that, but it keeps per-arch parents that AccelCPUClass does not need. - AccelCPUClass is arch-independent. The parent only supplies class_size and ACCEL_CPU_CLASS(). Make TYPE_ACCEL_CPU the fixed abstract type accel-cpu and register it once next to TYPE_ACCEL. - Leaf names still encode the CPU type so accel_init_cpu_interfaces() can look up "<accel>-accel-" CPU_RESOLVING_TYPE (for example tcg-accel-arm-cpu). ACCEL_CPU_NAME() keeps that string; it is no longer derived from the parent type name. - Drop register_accel_target_type(). Subclasses keep type_register_static() with .parent = TYPE_ACCEL_CPU. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> --- accel/accel-common.c | 21 ++++++--------------- include/accel/accel-cpu-target.h | 3 +-- include/accel/accel-cpu.h | 2 ++ 3 files changed, 9 insertions(+), 17 deletions(-)