Patchwork [08/22] kvm: Provide sigbus services arch-independently

login
register
mail settings
Submitter Jan Kiszka
Date Jan. 27, 2011, 1:09 p.m.
Message ID <4601dba885dec631cadeb7ff5a191c05a70d90eb.1296133797.git.jan.kiszka@siemens.com>
Download mbox | patch
Permalink /patch/80691/
State New
Headers show

Comments

Jan Kiszka - Jan. 27, 2011, 1:09 p.m.
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>
CC: Paolo Bonzini <pbonzini@redhat.com>
---
 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. 27, 2011, 4:39 p.m.
On 01/27/2011 02:09 PM, Jan Kiszka wrote:
> 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>
> CC: Paolo Bonzini<pbonzini@redhat.com>
> ---
>   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(-)
>
> diff --git a/cpus.c b/cpus.c
> index f89826a..ce40e67 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -542,10 +542,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)
> @@ -578,10 +577,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 1a55a10..5bfa8c0 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -1362,3 +1362,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_arch_on_sigbus_vcpu(env, code, addr);
> +}
> +
> +int kvm_on_sigbus(int code, void *addr)
> +{
> +    return kvm_arch_on_sigbus(code, addr);
> +}
> diff --git a/kvm-stub.c b/kvm-stub.c
> index 88682f2..d6b6c8e 100644
> --- a/kvm-stub.c
> +++ b/kvm-stub.c
> @@ -147,6 +147,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 ca57517..b2fb5c6 100644
> --- a/kvm.h
> +++ b/kvm.h
> @@ -81,6 +81,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 */
>
>   struct KVMState;
> @@ -121,8 +124,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 8e8880a..dd2cadc 100644
> --- a/target-i386/kvm.c
> +++ b/target-i386/kvm.c
> @@ -1837,7 +1837,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;
> @@ -1887,7 +1887,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 710eca1..93ecc57 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 38823f5..1702c46 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -505,3 +505,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;
> +}

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo
Alexander Graf - Jan. 30, 2011, 2:51 p.m.
On 27.01.2011, at 14:09, Jan Kiszka wrote:

> 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>
> CC: Paolo Bonzini <pbonzini@redhat.com>

Acked-by: Alexander Graf <agraf@suse.de>


Alex

Patch

diff --git a/cpus.c b/cpus.c
index f89826a..ce40e67 100644
--- a/cpus.c
+++ b/cpus.c
@@ -542,10 +542,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)
@@ -578,10 +577,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 1a55a10..5bfa8c0 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1362,3 +1362,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_arch_on_sigbus_vcpu(env, code, addr);
+}
+
+int kvm_on_sigbus(int code, void *addr)
+{
+    return kvm_arch_on_sigbus(code, addr);
+}
diff --git a/kvm-stub.c b/kvm-stub.c
index 88682f2..d6b6c8e 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -147,6 +147,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 ca57517..b2fb5c6 100644
--- a/kvm.h
+++ b/kvm.h
@@ -81,6 +81,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 */
 
 struct KVMState;
@@ -121,8 +124,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 8e8880a..dd2cadc 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -1837,7 +1837,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;
@@ -1887,7 +1887,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 710eca1..93ecc57 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 38823f5..1702c46 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -505,3 +505,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;
+}