mirror of https://gitee.com/openkylin/qemu.git
kvm: Provide sigbus services arch-independently
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> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
84b4915dd2
commit
a1b87fe046
10
cpus.c
10
cpus.c
|
@ -539,10 +539,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)
|
||||
|
@ -575,10 +574,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;
|
||||
|
|
10
kvm-all.c
10
kvm-all.c
|
@ -1366,3 +1366,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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
7
kvm.h
7
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;
|
||||
|
|
|
@ -1839,7 +1839,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;
|
||||
|
@ -1889,7 +1889,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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue