accel_cpu_instance_init() currently dispatch via target specific AccelCPUClass which we want to remove. Introduce a similar hook in the generic AccelOpsClass structure. We will convert implementations from one struct to the other, so add an assertion to be sure only one implementation at a time.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- include/accel/accel-cpu-ops.h | 1 + accel/accel-common.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/accel/accel-cpu-ops.h b/include/accel/accel-cpu-ops.h index fd1307dad6d..9810cc27cd2 100644 --- a/include/accel/accel-cpu-ops.h +++ b/include/accel/accel-cpu-ops.h @@ -34,6 +34,7 @@ struct AccelOpsClass { /* initialization function called when accel is chosen */ void (*ops_init)(AccelClass *ac); + void (*cpu_instance_init)(CPUState *cpu); bool (*cpu_realize)(CPUState *cpu, Error **errp); bool (*cpus_are_resettable)(void); void (*cpu_reset_hold)(CPUState *cpu); diff --git a/accel/accel-common.c b/accel/accel-common.c index 176b03e0e90..b3bcd53a4c6 100644 --- a/accel/accel-common.c +++ b/accel/accel-common.c @@ -39,7 +39,15 @@ void accel_init_interfaces(AccelClass *ac) void accel_cpu_instance_init(CPUState *cpu) { - if (cpu->cc->accel_cpu && cpu->cc->accel_cpu->cpu_instance_init) { + AccelState *accel = current_accel(); + AccelClass *acc = ACCEL_GET_CLASS(accel); + + if (acc->ops && acc->ops->cpu_instance_init) { + if (cpu->cc->accel_cpu) { + assert(!cpu->cc->accel_cpu->cpu_instance_init); + } + acc->ops->cpu_instance_init(cpu); + } else if (cpu->cc->accel_cpu && cpu->cc->accel_cpu->cpu_instance_init) { cpu->cc->accel_cpu->cpu_instance_init(cpu); } } -- 2.53.0
