Patchwork [03/18] kvm: Provide sigbus services arch-independently

login
register
mail settings
Submitter Jan Kiszka
Date Jan. 10, 2011, 8:31 a.m.
Message ID <8c5ca1e9b8c65904d661e8c34a4c332cafe4d7b4.1294648329.git.jan.kiszka@web.de>
Download mbox | patch
Permalink /patch/78089/
State New
Headers show

Comments

Jan Kiszka - Jan. 10, 2011, 8:31 a.m.
From: Jan Kiszka <jan.kiszka@siemens.com>

Provide arch-independent kvm_on_sigbus* stubs to remove the #ifdef'ery
from cpus.c. This patch also fixes --disable-kvm build by providing the
missing kvm_on_sigbus_vcpu kvm-stub.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
CC: Huang Ying <ying.huang@intel.com>
CC: Alexander Graf <agraf@suse.de>
---
 cpus.c             |   10 ++++------
 kvm-all.c          |   10 ++++++++++
 kvm-stub.c         |    5 +++++
 kvm.h              |    7 +++++--
 target-i386/kvm.c  |    4 ++--
 target-ppc/kvm.c   |   10 ++++++++++
 target-s390x/kvm.c |   10 ++++++++++
 7 files changed, 46 insertions(+), 10 deletions(-)
Paolo Bonzini - Jan. 10, 2011, 10:13 a.m.
On 01/10/2011 09:31 AM, Jan Kiszka wrote:
> +int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
> +{
> +    return kvm_on_sigbus_vcpu(env, code, addr);
> +}
> +
> +int kvm_on_sigbus(int code, void *addr)
> +{
> +    return kvm_on_sigbus(code, addr);
> +}

Missing arch_ here?

Paolo
Jan Kiszka - Jan. 10, 2011, 10:30 a.m.
Am 10.01.2011 11:13, Paolo Bonzini wrote:
> On 01/10/2011 09:31 AM, Jan Kiszka wrote:
>> +int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
>> +{
>> +    return kvm_on_sigbus_vcpu(env, code, addr);
>> +}
>> +
>> +int kvm_on_sigbus(int code, void *addr)
>> +{
>> +    return kvm_on_sigbus(code, addr);
>> +}
> 
> Missing arch_ here?

Well, I said that I didn't test those bits... :)

Thanks, will fix.

Jan

Patch

diff --git a/cpus.c b/cpus.c
index 8af53a9..081ac30 100644
--- a/cpus.c
+++ b/cpus.c
@@ -527,10 +527,9 @@  static void sigbus_reraise(void)
 static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
                            void *ctx)
 {
-#if defined(TARGET_I386)
-    if (kvm_on_sigbus(siginfo->ssi_code, (void *)(intptr_t)siginfo->ssi_addr))
-#endif
+    if (kvm_on_sigbus(siginfo->ssi_code, (void *)(intptr_t)siginfo->ssi_addr)) {
         sigbus_reraise();
+    }
 }
 
 static void qemu_kvm_eat_signal(CPUState *env, int timeout)
@@ -563,10 +562,9 @@  static void qemu_kvm_eat_signal(CPUState *env, int timeout)
 
         switch (r) {
         case SIGBUS:
-#ifdef TARGET_I386
-            if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr))
-#endif
+            if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
                 sigbus_reraise();
+            }
             break;
         default:
             break;
diff --git a/kvm-all.c b/kvm-all.c
index 4ab5f5c..a8e9f2c 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1284,3 +1284,13 @@  int kvm_set_ioeventfd_pio_word(int fd, uint16_t addr, uint16_t val, bool assign)
     return -ENOSYS;
 #endif
 }
+
+int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
+{
+    return kvm_on_sigbus_vcpu(env, code, addr);
+}
+
+int kvm_on_sigbus(int code, void *addr)
+{
+    return kvm_on_sigbus(code, addr);
+}
diff --git a/kvm-stub.c b/kvm-stub.c
index 1fcfc1e..572380c 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -142,6 +142,11 @@  int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, bool assign)
     return -ENOSYS;
 }
 
+int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
+{
+    return 1;
+}
+
 int kvm_on_sigbus(int code, void *addr)
 {
     return 1;
diff --git a/kvm.h b/kvm.h
index 7bf9cc8..0a4db28 100644
--- a/kvm.h
+++ b/kvm.h
@@ -80,6 +80,9 @@  int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset);
 int kvm_pit_in_kernel(void);
 int kvm_irqchip_in_kernel(void);
 
+int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr);
+int kvm_on_sigbus(int code, void *addr);
+
 /* internal API */
 
 int kvm_ioctl(int type, ...);
@@ -117,8 +120,8 @@  int kvm_arch_init_vcpu(CPUState *env);
 
 void kvm_arch_reset_vcpu(CPUState *env);
 
-int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr);
-int kvm_on_sigbus(int code, void *addr);
+int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr);
+int kvm_arch_on_sigbus(int code, void *addr);
 
 struct kvm_guest_debug;
 struct kvm_debug_exit_arch;
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index af79526..a7acd53 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -1918,7 +1918,7 @@  static void kvm_mce_inj_srao_memscrub2(CPUState *env, target_phys_addr_t paddr)
 
 #endif
 
-int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
+int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
 {
 #if defined(KVM_CAP_MCE)
     void *vaddr;
@@ -1968,7 +1968,7 @@  int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr)
     return 0;
 }
 
-int kvm_on_sigbus(int code, void *addr)
+int kvm_arch_on_sigbus(int code, void *addr)
 {
 #if defined(KVM_CAP_MCE)
     if ((first_cpu->mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 7918426..8349045 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -404,3 +404,13 @@  bool kvm_arch_stop_on_emulation_error(CPUState *env)
 {
     return true;
 }
+
+int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
+{
+    return 1;
+}
+
+int kvm_arch_on_sigbus(int code, void *addr)
+{
+    return 1;
+}
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 29fcd46..b7f644b 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -501,3 +501,13 @@  bool kvm_arch_stop_on_emulation_error(CPUState *env)
 {
     return true;
 }
+
+int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
+{
+    return 1;
+}
+
+int kvm_arch_on_sigbus(int code, void *addr)
+{
+    return 1;
+}