qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Claudio Fontana <cfontana@suse.de>
To: "Peter Maydell" <peter.maydell@linaro.org>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Alex Bennée" <alex.bennee@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Roman Bolshakov <r.bolshakov@yadro.com>,
	Claudio Fontana <cfontana@suse.de>,
	Eduardo Habkost <ehabkost@redhat.com>,
	qemu-devel@nongnu.org
Subject: [RFC v8 37/44] target/arm: create kvm cpu accel class
Date: Tue, 16 Mar 2021 19:36:55 +0100	[thread overview]
Message-ID: <20210316183702.10216-38-cfontana@suse.de> (raw)
In-Reply-To: <20210316183702.10216-1-cfontana@suse.de>

start by moving minimal init and realizefn code.

Signed-off-by: Claudio Fontana <cfontana@suse.de>
---
 target/arm/internals.h     |   1 -
 target/arm/cpu-sysemu.c    |  32 ----------
 target/arm/cpu.c           |  43 +++----------
 target/arm/kvm/kvm-cpu.c   | 122 +++++++++++++++++++++++++++++++++++++
 target/arm/kvm/meson.build |   3 +-
 5 files changed, 131 insertions(+), 70 deletions(-)
 create mode 100644 target/arm/kvm/kvm-cpu.c

diff --git a/target/arm/internals.h b/target/arm/internals.h
index 811e029f83..7a789db686 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -1168,7 +1168,6 @@ static inline uint64_t useronly_maybe_clean_ptr(uint32_t desc, uint64_t ptr)
 
 #ifndef CONFIG_USER_ONLY
 void arm_cpu_set_irq(void *opaque, int irq, int level);
-void arm_cpu_kvm_set_irq(void *opaque, int irq, int level);
 bool arm_cpu_virtio_is_big_endian(CPUState *cs);
 #endif /* !CONFIG_USER_ONLY */
 
diff --git a/target/arm/cpu-sysemu.c b/target/arm/cpu-sysemu.c
index cb4ae2263c..305057d35b 100644
--- a/target/arm/cpu-sysemu.c
+++ b/target/arm/cpu-sysemu.c
@@ -24,7 +24,6 @@
 #include "cpu.h"
 #include "internals.h"
 #include "sysemu/hw_accel.h"
-#include "kvm/kvm_arm.h"
 #include "sysemu/tcg.h"
 
 #ifdef CONFIG_TCG
@@ -71,37 +70,6 @@ void arm_cpu_set_irq(void *opaque, int irq, int level)
     }
 }
 
-void arm_cpu_kvm_set_irq(void *opaque, int irq, int level)
-{
-#ifdef CONFIG_KVM
-    ARMCPU *cpu = opaque;
-    CPUARMState *env = &cpu->env;
-    CPUState *cs = CPU(cpu);
-    uint32_t linestate_bit;
-    int irq_id;
-
-    switch (irq) {
-    case ARM_CPU_IRQ:
-        irq_id = KVM_ARM_IRQ_CPU_IRQ;
-        linestate_bit = CPU_INTERRUPT_HARD;
-        break;
-    case ARM_CPU_FIQ:
-        irq_id = KVM_ARM_IRQ_CPU_FIQ;
-        linestate_bit = CPU_INTERRUPT_FIQ;
-        break;
-    default:
-        g_assert_not_reached();
-    }
-
-    if (level) {
-        env->irq_line_state |= linestate_bit;
-    } else {
-        env->irq_line_state &= ~linestate_bit;
-    }
-    kvm_arm_set_irq(cs->cpu_index, KVM_ARM_IRQ_TYPE_CPU, irq_id, !!level);
-#endif
-}
-
 bool arm_cpu_virtio_is_big_endian(CPUState *cs)
 {
     ARMCPU *cpu = ARM_CPU(cs);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 353cd652bc..3d6501c2c5 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -42,6 +42,7 @@
 #include "disas/capstone.h"
 #include "fpu/softfloat.h"
 #include "cpu-mmu.h"
+#include "qemu/accel.h"
 
 static void arm_cpu_set_pc(CPUState *cs, vaddr value)
 {
@@ -560,12 +561,6 @@ static void arm_cpu_initfn(Object *obj)
 
 #ifndef CONFIG_USER_ONLY
     /* Our inbound IRQ and FIQ lines */
-    if (kvm_enabled()) {
-        /* VIRQ and VFIQ are unused with KVM but we add them to maintain
-         * the same interface as non-KVM CPUs.
-         */
-        qdev_init_gpio_in(DEVICE(cpu), arm_cpu_kvm_set_irq, 4);
-    }
     if (tcg_enabled() || qtest_enabled()) {
         qdev_init_gpio_in(DEVICE(cpu), arm_cpu_set_irq, 4);
     }
@@ -590,6 +585,9 @@ static void arm_cpu_initfn(Object *obj)
     if (tcg_enabled()) {
         cpu->psci_version = 2; /* TCG implements PSCI 0.2 */
     }
+
+    /* if required, do accelerator-specific cpu initializations */
+    accel_cpu_instance_init(CPU(obj));
 }
 
 static Property arm_cpu_gt_cntfrq_property =
@@ -879,16 +877,13 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
     Error *local_err = NULL;
     bool no_aa32 = false;
 
-    /* If we needed to query the host kernel for the CPU features
+    /*
+     * If we needed to query the host kernel for the CPU features
      * then it's possible that might have failed in the initfn, but
      * this is the first point where we can report it.
      */
     if (cpu->host_cpu_probe_failed) {
-        if (!kvm_enabled()) {
-            error_setg(errp, "The 'host' CPU type can only be used with KVM");
-        } else {
-            error_setg(errp, "Failed to retrieve host CPU features");
-        }
+        error_setg(errp, "The 'host' CPU type can only be used with KVM");
         return;
     }
 
@@ -1478,26 +1473,6 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
     arm32_cpu_class_init(oc, data);
 }
 
-#ifdef CONFIG_KVM
-static void arm_host_initfn(Object *obj)
-{
-    ARMCPU *cpu = ARM_CPU(obj);
-
-    kvm_arm_set_cpu_features_from_host(cpu);
-    if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
-        aarch64_add_sve_properties(obj);
-    }
-    arm_cpu_post_init(obj);
-}
-
-static const TypeInfo host_arm_cpu_type_info = {
-    .name = TYPE_ARM_HOST_CPU,
-    .parent = TYPE_AARCH64_CPU,
-    .instance_init = arm_host_initfn,
-};
-
-#endif
-
 static const TypeInfo arm_cpu_type_info = {
     .name = TYPE_ARM_CPU,
     .parent = TYPE_CPU,
@@ -1520,10 +1495,6 @@ static void arm_cpu_register_types(void)
 {
     type_register_static(&arm_cpu_type_info);
     type_register_static(&idau_interface_type_info);
-
-#ifdef CONFIG_KVM
-    type_register_static(&host_arm_cpu_type_info);
-#endif
 }
 
 type_init(arm_cpu_register_types)
diff --git a/target/arm/kvm/kvm-cpu.c b/target/arm/kvm/kvm-cpu.c
new file mode 100644
index 0000000000..b3e97080cc
--- /dev/null
+++ b/target/arm/kvm/kvm-cpu.c
@@ -0,0 +1,122 @@
+/*
+ * QEMU ARM CPU
+ *
+ * Copyright (c) 2012 SUSE LINUX Products GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see
+ * <http://www.gnu.org/licenses/gpl-2.0.html>
+ */
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
+#include "hw/core/accel-cpu.h"
+#include "qapi/error.h"
+
+#include "kvm/kvm_arm.h"
+#include "internals.h"
+
+static void arm_cpu_kvm_set_irq(void *opaque, int irq, int level)
+{
+    ARMCPU *cpu = opaque;
+    CPUARMState *env = &cpu->env;
+    CPUState *cs = CPU(cpu);
+    uint32_t linestate_bit;
+    int irq_id;
+
+    switch (irq) {
+    case ARM_CPU_IRQ:
+        irq_id = KVM_ARM_IRQ_CPU_IRQ;
+        linestate_bit = CPU_INTERRUPT_HARD;
+        break;
+    case ARM_CPU_FIQ:
+        irq_id = KVM_ARM_IRQ_CPU_FIQ;
+        linestate_bit = CPU_INTERRUPT_FIQ;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    if (level) {
+        env->irq_line_state |= linestate_bit;
+    } else {
+        env->irq_line_state &= ~linestate_bit;
+    }
+    kvm_arm_set_irq(cs->cpu_index, KVM_ARM_IRQ_TYPE_CPU, irq_id, !!level);
+}
+
+static void kvm_cpu_instance_init(CPUState *cs)
+{
+    /*
+     * VIRQ and VFIQ are unused with KVM but we add them to maintain
+     * the same interface as non-KVM CPUs.
+     */
+    qdev_init_gpio_in(DEVICE(cs), arm_cpu_kvm_set_irq, 4);
+}
+
+static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
+{
+    /*
+     * If we needed to query the host kernel for the CPU features
+     * then it's possible that might have failed in the initfn, but
+     * this is the first point where we can report it.
+     */
+    ARMCPU *cpu = ARM_CPU(cs);
+
+    if (cpu->host_cpu_probe_failed) {
+        error_setg(errp, "Failed to retrieve host CPU features");
+        return false;
+    }
+    return true;
+}
+
+static void host_cpu_instance_init(Object *obj)
+{
+    ARMCPU *cpu = ARM_CPU(obj);
+
+    kvm_arm_set_cpu_features_from_host(cpu);
+    if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
+        aarch64_add_sve_properties(obj);
+    }
+    arm_cpu_post_init(obj);
+}
+
+static const TypeInfo host_cpu_type_info = {
+    .name = ARM_CPU_TYPE_NAME("host"),
+    .parent = TYPE_AARCH64_CPU,
+    .instance_init = host_cpu_instance_init,
+};
+
+static void kvm_cpu_accel_class_init(ObjectClass *oc, void *data)
+{
+    AccelCPUClass *acc = ACCEL_CPU_CLASS(oc);
+
+    acc->cpu_realizefn = kvm_cpu_realizefn;
+    acc->cpu_instance_init = kvm_cpu_instance_init;
+}
+
+static const TypeInfo kvm_cpu_accel_type_info = {
+    .name = ACCEL_CPU_NAME("kvm"),
+    .parent = TYPE_ACCEL_CPU,
+    .class_init = kvm_cpu_accel_class_init,
+    .abstract = true,
+};
+
+static void kvm_cpu_accel_register_types(void)
+{
+    type_register_static(&host_cpu_type_info);
+    type_register_static(&kvm_cpu_accel_type_info);
+}
+
+type_init(kvm_cpu_accel_register_types);
diff --git a/target/arm/kvm/meson.build b/target/arm/kvm/meson.build
index ba02e96e76..22ea27ba0f 100644
--- a/target/arm/kvm/meson.build
+++ b/target/arm/kvm/meson.build
@@ -5,4 +5,5 @@ arm_ss.add(when: 'CONFIG_TCG', if_false: files(
 arm_ss.add(when: 'CONFIG_KVM', if_true: files(
   'kvm.c',
   'kvm64.c',
-))
\ No newline at end of file
+  'kvm-cpu.c',
+))
-- 
2.26.2



  parent reply	other threads:[~2021-03-16 19:27 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-16 18:36 [RFC v8 00/44] arm cleanup experiment for kvm-only build Claudio Fontana
2021-03-16 18:36 ` [RFC v8 01/44] target/arm: move translate modules to tcg/ Claudio Fontana
2021-03-16 18:36 ` [RFC v8 02/44] target/arm: move helpers " Claudio Fontana
2021-03-16 18:36 ` [RFC v8 03/44] arm: tcg: only build under CONFIG_TCG Claudio Fontana
2021-03-16 18:36 ` [RFC v8 04/44] target/arm: tcg: add sysemu and user subsirs Claudio Fontana
2021-03-16 18:36 ` [RFC v8 05/44] target/arm: only build psci for TCG Claudio Fontana
2021-03-16 18:36 ` [RFC v8 06/44] target/arm: split off cpu-sysemu.c Claudio Fontana
2021-03-16 18:36 ` [RFC v8 07/44] target/arm: move physical address translation to cpu-mmu Claudio Fontana
2021-03-16 18:36 ` [RFC v8 08/44] target/arm: cpu-mmu: fix comment style Claudio Fontana
2021-03-16 18:36 ` [RFC v8 09/44] target/arm: split cpregs from tcg/helper.c Claudio Fontana
2021-03-16 18:36 ` [RFC v8 10/44] target/arm: cpregs: fix style (mostly just comments) Claudio Fontana
2021-03-16 18:36 ` [RFC v8 11/44] target/arm: move cpu definitions to common cpu module Claudio Fontana
2021-03-16 18:36 ` [RFC v8 12/44] target/arm: only perform TCG cpu and machine inits if TCG enabled Claudio Fontana
2021-03-16 18:36 ` [RFC v8 13/44] target/arm: kvm: add stubs for some helpers Claudio Fontana
2021-03-16 18:36 ` [RFC v8 14/44] target/arm: move cpsr_read, cpsr_write to cpu_common Claudio Fontana
2021-03-16 18:36 ` [RFC v8 15/44] target/arm: add temporary stub for arm_rebuild_hflags Claudio Fontana
2021-03-16 18:36 ` [RFC v8 16/44] target/arm: split vfp state setting from tcg helpers Claudio Fontana
2021-03-16 18:36 ` [RFC v8 17/44] target/arm: move arm_mmu_idx* to cpu-mmu Claudio Fontana
2021-03-16 18:36 ` [RFC v8 18/44] target/arm: move sve_zcr_len_for_el to common_cpu Claudio Fontana
2021-03-16 18:36 ` [RFC v8 19/44] target/arm: move arm_sctlr away from tcg helpers Claudio Fontana
2021-03-16 18:36 ` [RFC v8 20/44] target/arm: move arm_cpu_list to common_cpu Claudio Fontana
2021-03-16 18:36 ` [RFC v8 21/44] target/arm: move aarch64_sync_32_to_64 (and vv) to cpu code Claudio Fontana
2021-03-16 18:36 ` [RFC v8 22/44] target/arm: split a15 cpu model and 32bit class functions to cpu32.c Claudio Fontana
2021-03-16 18:36 ` [RFC v8 23/44] target/arm: move sve_exception_el out of TCG helpers Claudio Fontana
2021-03-16 18:36 ` [RFC v8 24/44] target/arm: refactor exception and cpu code Claudio Fontana
2021-03-16 18:36 ` [RFC v8 25/44] target/arm: cpu: fix style Claudio Fontana
2021-03-16 18:36 ` [RFC v8 26/44] target/arm: wrap call to aarch64_sve_change_el in tcg_enabled() Claudio Fontana
2021-03-16 18:36 ` [RFC v8 27/44] target/arm: remove kvm include file for PSCI and arm-powerctl Claudio Fontana
2021-03-16 18:36 ` [RFC v8 28/44] target/arm: move kvm-const.h, kvm.c, kvm64.c, kvm_arm.h to kvm/ Claudio Fontana
2021-03-16 18:36 ` [RFC v8 29/44] target/arm: cleanup cpu includes Claudio Fontana
2021-03-16 18:36 ` [RFC v8 30/44] target/arm: remove broad "else" statements when checking accels Claudio Fontana
2021-03-16 18:36 ` [RFC v8 31/44] tests/qtest: skip bios-tables-test test_acpi_oem_fields_virt for KVM Claudio Fontana
2021-03-16 18:36 ` [RFC v8 32/44] tests: restrict TCG-only arm-cpu-features tests to TCG builds Claudio Fontana
2021-03-16 18:36 ` [RFC v8 33/44] tests: do not run test-hmp on all machines for ARM KVM-only Claudio Fontana
2021-03-16 18:36 ` [RFC v8 34/44] tests: device-introspect-test: cope with ARM TCG-only devices Claudio Fontana
2021-03-16 18:36 ` [RFC v8 35/44] tests: do not run qom-test on all machines for ARM KVM-only Claudio Fontana
2021-03-16 18:36 ` [RFC v8 36/44] Revert "target/arm: Restrict v8M IDAU to TCG" Claudio Fontana
2021-03-16 18:36 ` Claudio Fontana [this message]
2021-03-16 18:36 ` [RFC v8 38/44] target/arm: move kvm cpu properties setting to kvm-cpu Claudio Fontana
2021-03-16 18:36 ` [RFC v8 39/44] accel: move call to accel_init_interfaces Claudio Fontana
2021-03-16 18:36 ` [RFC v8 40/44] accel: add double dispatch mechanism for class initialization Claudio Fontana
2021-03-16 18:36 ` [RFC v8 41/44] target/arm: add tcg cpu accel class Claudio Fontana
2021-03-16 18:37 ` [RFC v8 42/44] target/arm: move TCG gt timer creation code in tcg/ Claudio Fontana
2021-03-16 18:37 ` [RFC v8 43/44] target/arm: cpu-sve: new module Claudio Fontana
2021-03-16 18:37 ` [RFC v8 44/44] target/arm: cpu-sve: split TCG and KVM functionality Claudio Fontana

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210316183702.10216-38-cfontana@suse.de \
    --to=cfontana@suse.de \
    --cc=alex.bennee@linaro.org \
    --cc=ehabkost@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=r.bolshakov@yadro.com \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).