All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.