The KVM stub variables and functions don't depend on target specific data
types, so it is possible to compile kvm-stub.c only once.

Integrating the target specific KVM stubs for ARM, I386 and PPC in the
common kvm-stub.c further simplifies the build environment and allows
removing CONFIG_NO_KVM.

Instead of 53 kvm-stub.o files, there is now only one file.

abort() is replaced by g_assert_not_reached() which gives better diagnostic
messages when it is called.

Signed-off-by: Stefan Weil <s...@weilnetz.de>
---

The resulting binary is slightly larger than before because it
includes more stub functions. It could be made smaller by adding
separate stubs/kvm-stub-arm.c, stubs/kvm-stub-i386.c and
stubs/kvm-stub-ppc.c files. Using alias symbols for the stub
functions would reduce the size further, but I don't think
the size is critical here.

Should we call g_assert_not_reached() in more (all?) stub functions?

If the patch is accepted, a similar modification could be done
for xen-stub.c.

Stefan

 

 Makefile.target                |    1 -
 stubs/Makefile.objs            |    1 +
 kvm-stub.c => stubs/kvm-stub.c |   70 ++++++++++++++++++++++++++++++++++++----
 target-arm/Makefile.objs       |    1 -
 target-arm/kvm-stub.c          |   23 -------------
 target-i386/Makefile.objs      |    1 -
 target-i386/kvm-stub.c         |   18 -----------
 target-ppc/Makefile.objs       |    1 -
 target-ppc/kvm-stub.c          |   18 -----------
 9 files changed, 64 insertions(+), 70 deletions(-)
 rename kvm-stub.c => stubs/kvm-stub.c (63%)
 delete mode 100644 target-arm/kvm-stub.c
 delete mode 100644 target-i386/kvm-stub.c
 delete mode 100644 target-ppc/kvm-stub.c

diff --git a/Makefile.target b/Makefile.target
index 9a49852..21a817f 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -84,7 +84,6 @@ obj-y += fpu/softfloat.o
 obj-y += target-$(TARGET_BASE_ARCH)/
 obj-y += disas.o
 obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
-obj-$(CONFIG_NO_KVM) += kvm-stub.o
 
 #########################################################
 # Linux user emulator target
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index 9b701b4..44bf573 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -10,6 +10,7 @@ stub-obj-y += fdset-remove-fd.o
 stub-obj-y += get-fd.o
 stub-obj-y += get-vm-name.o
 stub-obj-y += iothread-lock.o
+stub-obj-y += kvm-stub.o
 stub-obj-y += migr-blocker.o
 stub-obj-y += mon-is-qmp.o
 stub-obj-y += mon-printf.o
diff --git a/kvm-stub.c b/stubs/kvm-stub.c
similarity index 63%
rename from kvm-stub.c
rename to stubs/kvm-stub.c
index 370c837..cc0fd06 100644
--- a/kvm-stub.c
+++ b/stubs/kvm-stub.c
@@ -10,14 +10,33 @@
  *
  */
 
+/* We don't want to include exec/poison.h here. */
+#define HW_POISON_H
+
+/* Several data types are only used for unused function arguments
+   or in files which are included.
+   Define them here to avoid include dependencies. */
+
+typedef struct CPUArchState CPUArchState;
+typedef unsigned target_ulong;
+
+typedef struct ARMCPU ARMCPU;
+
+typedef struct CPUPPCState CPUPPCState;
+typedef struct PowerPCCPU PowerPCCPU;
+
+extern unsigned ram_size;
+
 #include "qemu-common.h"
 #include "hw/hw.h"
-#include "cpu.h"
-#include "sysemu/kvm.h"
 
-#ifndef CONFIG_USER_ONLY
+/* Pretend that cpu.h was included to get all prototypes. */
+#define NEED_CPU_H
+#include "sysemu/kvm.h"
+#include "hw/ppc/openpic.h"
 #include "hw/pci/msi.h"
-#endif
+#include "target-arm/kvm_arm.h"
+#include "target-ppc/kvm_ppc.h"
 
 KVMState *kvm_state;
 bool kvm_kernel_irqchip;
@@ -74,6 +93,11 @@ int kvm_has_pit_state2(void)
     return 0;
 }
 
+void *kvm_ram_alloc(ram_addr_t size)
+{
+    g_assert_not_reached();
+}
+
 void kvm_setup_guest_memory(void *start, size_t size)
 {
 }
@@ -102,7 +126,7 @@ void kvm_remove_all_breakpoints(CPUState *cpu)
 #ifndef _WIN32
 int kvm_set_signal_mask(CPUState *cpu, const sigset_t *sigset)
 {
-    abort();
+    g_assert_not_reached();
 }
 #endif
 
@@ -116,7 +140,8 @@ int kvm_on_sigbus(int code, void *addr)
     return 1;
 }
 
-#ifndef CONFIG_USER_ONLY
+/* Stubs for system emulation. */
+
 int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg)
 {
     return -ENOSYS;
@@ -144,4 +169,35 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, 
EventNotifier *n, int virq)
 {
     return -ENOSYS;
 }
-#endif
+
+/* Stubs for target-arm. */
+
+bool write_kvmstate_to_list(ARMCPU *cpu)
+{
+    g_assert_not_reached();
+}
+
+bool write_list_to_kvmstate(ARMCPU *cpu)
+{
+    g_assert_not_reached();
+}
+
+/* Stubs for target-i386. */
+
+uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
+                                      uint32_t index, int reg)
+{
+    g_assert_not_reached();
+}
+
+/* Stubs for target-ppc. */
+
+int kvm_openpic_connect_vcpu(DeviceState *d, CPUState *cs)
+{
+    return -EINVAL;
+}
+
+void kvmppc_init(void)
+{
+    g_assert_not_reached();
+}
diff --git a/target-arm/Makefile.objs b/target-arm/Makefile.objs
index 4a6e52e..d89b57c 100644
--- a/target-arm/Makefile.objs
+++ b/target-arm/Makefile.objs
@@ -1,6 +1,5 @@
 obj-y += arm-semi.o
 obj-$(CONFIG_SOFTMMU) += machine.o
 obj-$(CONFIG_KVM) += kvm.o
-obj-$(CONFIG_NO_KVM) += kvm-stub.o
 obj-y += translate.o op_helper.o helper.o cpu.o
 obj-y += neon_helper.o iwmmxt_helper.o
diff --git a/target-arm/kvm-stub.c b/target-arm/kvm-stub.c
deleted file mode 100644
index cd1849f..0000000
--- a/target-arm/kvm-stub.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * QEMU KVM ARM specific function stubs
- *
- * Copyright Linaro Limited 2013
- *
- * Author: Peter Maydell <peter.mayd...@linaro.org>
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- *
- */
-#include "qemu-common.h"
-#include "kvm_arm.h"
-
-bool write_kvmstate_to_list(ARMCPU *cpu)
-{
-    abort();
-}
-
-bool write_list_to_kvmstate(ARMCPU *cpu)
-{
-    abort();
-}
diff --git a/target-i386/Makefile.objs b/target-i386/Makefile.objs
index c1d4f05..963698a 100644
--- a/target-i386/Makefile.objs
+++ b/target-i386/Makefile.objs
@@ -3,6 +3,5 @@ obj-y += excp_helper.o fpu_helper.o cc_helper.o int_helper.o 
svm_helper.o
 obj-y += smm_helper.o misc_helper.o mem_helper.o seg_helper.o
 obj-$(CONFIG_SOFTMMU) += machine.o arch_memory_mapping.o arch_dump.o
 obj-$(CONFIG_KVM) += kvm.o hyperv.o
-obj-$(CONFIG_NO_KVM) += kvm-stub.o
 obj-$(CONFIG_LINUX_USER) += ioport-user.o
 obj-$(CONFIG_BSD_USER) += ioport-user.o
diff --git a/target-i386/kvm-stub.c b/target-i386/kvm-stub.c
deleted file mode 100644
index 11429c4..0000000
--- a/target-i386/kvm-stub.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * QEMU KVM x86 specific function stubs
- *
- * Copyright Linaro Limited 2012
- *
- * Author: Peter Maydell <peter.mayd...@linaro.org>
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- *
- */
-#include "qemu-common.h"
-#include "kvm_i386.h"
-
-bool kvm_allows_irq0_override(void)
-{
-    return 1;
-}
diff --git a/target-ppc/Makefile.objs b/target-ppc/Makefile.objs
index 6e78cb3..2c43c34 100644
--- a/target-ppc/Makefile.objs
+++ b/target-ppc/Makefile.objs
@@ -5,7 +5,6 @@ obj-y += machine.o mmu_helper.o mmu-hash32.o
 obj-$(TARGET_PPC64) += mmu-hash64.o
 endif
 obj-$(CONFIG_KVM) += kvm.o kvm_ppc.o
-obj-$(CONFIG_NO_KVM) += kvm-stub.o
 obj-y += excp_helper.o
 obj-y += fpu_helper.o
 obj-y += int_helper.o
diff --git a/target-ppc/kvm-stub.c b/target-ppc/kvm-stub.c
deleted file mode 100644
index ee3f5d2..0000000
--- a/target-ppc/kvm-stub.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * QEMU KVM PPC specific function stubs
- *
- * Copyright Freescale Inc. 2013
- *
- * Author: Alexander Graf <ag...@suse.de>
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- *
- */
-#include "qemu-common.h"
-#include "hw/ppc/openpic.h"
-
-int kvm_openpic_connect_vcpu(DeviceState *d, CPUState *cs)
-{
-    return -EINVAL;
-}
-- 
1.7.10.4


Reply via email to