[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v12 22/22] accel: introduce new accessor functions
From: |
Claudio Fontana |
Subject: |
[PATCH v12 22/22] accel: introduce new accessor functions |
Date: |
Tue, 12 Jan 2021 19:03:12 +0100 |
avoid open coding the accesses to cpu->accel_cpu interfaces,
and instead introduce:
accel_cpu_instance_init,
accel_cpu_realizefn
to be used by the targets/ initfn code,
and by cpu_exec_realizefn respectively.
Add warnings about the use of target-specific headers.
Signed-off-by: Claudio Fontana <cfontana@suse.de>
---
include/hw/core/accel-cpu.h | 11 +++++++----
include/qemu/accel.h | 13 +++++++++++++
accel/accel-common.c | 19 +++++++++++++++++++
cpu.c | 6 +-----
target/i386/cpu.c | 9 ++-------
5 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/include/hw/core/accel-cpu.h b/include/hw/core/accel-cpu.h
index 246b3e2fcb..2edecd026a 100644
--- a/include/hw/core/accel-cpu.h
+++ b/include/hw/core/accel-cpu.h
@@ -1,5 +1,6 @@
/*
* Accelerator interface, specializes CPUClass
+ * This header is used only by target-specific code.
*
* Copyright 2020 SUSE LLC
*
@@ -11,10 +12,12 @@
#define ACCEL_CPU_H
/*
- * these defines cannot be in cpu.h, because we are using
- * CPU_RESOLVING_TYPE here.
- * Use this header to define your accelerator-specific
- * cpu-specific accelerator interfaces.
+ * This header is used to define new accelerator-specific target-specific
+ * accelerator cpu subclasses.
+ * It uses CPU_RESOLVING_TYPE, so this is clearly target-specific.
+ *
+ * Do not try to use for any other purpose than the implementation of new
+ * subclasses in target/, or the accel implementation itself in accel/
*/
#define TYPE_ACCEL_CPU "accel-" CPU_RESOLVING_TYPE
diff --git a/include/qemu/accel.h b/include/qemu/accel.h
index b9d6d69eb8..da0c8ab523 100644
--- a/include/qemu/accel.h
+++ b/include/qemu/accel.h
@@ -78,4 +78,17 @@ int accel_init_machine(AccelState *accel, MachineState *ms);
void accel_setup_post(MachineState *ms);
#endif /* !CONFIG_USER_ONLY */
+/**
+ * accel_cpu_instance_init:
+ * @cpu: The CPU that needs to do accel-specific object initializations.
+ */
+void accel_cpu_instance_init(CPUState *cpu);
+
+/**
+ * accel_cpu_realizefn:
+ * @cpu: The CPU that needs to call accel-specific cpu realization.
+ * @errp: currently unused.
+ */
+void accel_cpu_realizefn(CPUState *cpu, Error **errp);
+
#endif /* QEMU_ACCEL_H */
diff --git a/accel/accel-common.c b/accel/accel-common.c
index 9901b0531c..0f6fb4fb66 100644
--- a/accel/accel-common.c
+++ b/accel/accel-common.c
@@ -89,6 +89,25 @@ void accel_init_interfaces(AccelClass *ac)
accel_init_cpu_interfaces(ac);
}
+void accel_cpu_instance_init(CPUState *cpu)
+{
+ CPUClass *cc = CPU_GET_CLASS(cpu);
+
+ if (cc->accel_cpu && cc->accel_cpu->cpu_instance_init) {
+ cc->accel_cpu->cpu_instance_init(cpu);
+ }
+}
+
+void accel_cpu_realizefn(CPUState *cpu, Error **errp)
+{
+ CPUClass *cc = CPU_GET_CLASS(cpu);
+
+ if (cc->accel_cpu && cc->accel_cpu->cpu_realizefn) {
+ /* NB: errp parameter is unused currently */
+ cc->accel_cpu->cpu_realizefn(cpu, errp);
+ }
+}
+
static const TypeInfo accel_cpu_type = {
.name = TYPE_ACCEL_CPU,
.parent = TYPE_OBJECT,
diff --git a/cpu.c b/cpu.c
index ba5d272c1e..25e6fbfa2c 100644
--- a/cpu.c
+++ b/cpu.c
@@ -130,11 +130,7 @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp)
CPUClass *cc = CPU_GET_CLASS(cpu);
cpu_list_add(cpu);
-
- if (cc->accel_cpu) {
- /* NB: errp parameter is unused currently */
- cc->accel_cpu->cpu_realizefn(cpu, errp);
- }
+ accel_cpu_realizefn(cpu, errp);
#ifdef CONFIG_TCG
/* NB: errp parameter is unused currently */
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 83c474e270..c79123811f 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -28,7 +28,6 @@
#include "sysemu/kvm.h"
#include "sysemu/reset.h"
#include "sysemu/hvf.h"
-#include "hw/core/accel-cpu.h"
#include "sysemu/xen.h"
#include "sysemu/whpx.h"
#include "kvm/kvm_i386.h"
@@ -6680,8 +6679,6 @@ static void x86_cpu_initfn(Object *obj)
{
X86CPU *cpu = X86_CPU(obj);
X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
- CPUClass *cc = CPU_CLASS(xcc);
-
CPUX86State *env = &cpu->env;
env->nr_dies = 1;
@@ -6730,10 +6727,8 @@ static void x86_cpu_initfn(Object *obj)
x86_cpu_load_model(cpu, xcc->model);
}
- /* if required, do the accelerator-specific cpu initialization */
- if (cc->accel_cpu) {
- cc->accel_cpu->cpu_instance_init(CPU(obj));
- }
+ /* if required, do accelerator-specific cpu initializations */
+ accel_cpu_instance_init(CPU(obj));
}
static int64_t x86_cpu_get_arch_id(CPUState *cs)
--
2.26.2
- [PATCH v12 10/22] cpu: move cc->transaction_failed to tcg_ops, (continued)
- [PATCH v12 10/22] cpu: move cc->transaction_failed to tcg_ops, Claudio Fontana, 2021/01/12
- [PATCH v12 13/22] cpu: move adjust_watchpoint_address to tcg_ops, Claudio Fontana, 2021/01/12
- [PATCH v12 12/22] physmem: make watchpoint checking code TCG-only, Claudio Fontana, 2021/01/12
- [PATCH v12 16/22] accel: extend AccelState and AccelClass to user-mode, Claudio Fontana, 2021/01/12
- [PATCH v12 14/22] cpu: move debug_check_watchpoint to tcg_ops, Claudio Fontana, 2021/01/12
- [PATCH v12 18/22] accel: introduce AccelCPUClass extending CPUClass, Claudio Fontana, 2021/01/12
- [PATCH v12 17/22] accel: replace struct CpusAccel with AccelOpsClass, Claudio Fontana, 2021/01/12
- [PATCH v12 20/22] cpu: call AccelCPUClass::cpu_realizefn in cpu_exec_realizefn, Claudio Fontana, 2021/01/12
- [PATCH v12 15/22] cpu: tcg_ops: move to tcg-cpu-ops.h, keep a pointer in CPUClass, Claudio Fontana, 2021/01/12
- [PATCH v12 19/22] i386: split cpu accelerators from cpu.c, using AccelCPUClass, Claudio Fontana, 2021/01/12
- [PATCH v12 22/22] accel: introduce new accessor functions,
Claudio Fontana <=
- [PATCH v12 21/22] hw/core/cpu: call qemu_init_vcpu in cpu_common_realizefn, Claudio Fontana, 2021/01/12