KVM: remove kvm_arch_on_sigbus
Build it on kvm_arch_on_sigbus_vcpu instead. They do the same for "action optional" SIGBUSes, and the main thread should never get "action required" SIGBUSes because it blocks the signal. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a16fc07ebd
commit
4d39892cca
|
@ -358,7 +358,6 @@ bool kvm_vcpu_id_is_valid(int vcpu_id);
|
||||||
unsigned long kvm_arch_vcpu_id(CPUState *cpu);
|
unsigned long kvm_arch_vcpu_id(CPUState *cpu);
|
||||||
|
|
||||||
int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
|
int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
|
||||||
int kvm_arch_on_sigbus(int code, void *addr);
|
|
||||||
|
|
||||||
void kvm_arch_init_irq_routing(KVMState *s);
|
void kvm_arch_init_irq_routing(KVMState *s);
|
||||||
|
|
||||||
|
|
|
@ -2391,6 +2391,7 @@ int kvm_set_signal_mask(CPUState *cpu, const sigset_t *sigset)
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
||||||
{
|
{
|
||||||
return kvm_arch_on_sigbus_vcpu(cpu, code, addr);
|
return kvm_arch_on_sigbus_vcpu(cpu, code, addr);
|
||||||
|
@ -2398,7 +2399,13 @@ int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
||||||
|
|
||||||
int kvm_on_sigbus(int code, void *addr)
|
int kvm_on_sigbus(int code, void *addr)
|
||||||
{
|
{
|
||||||
return kvm_arch_on_sigbus(code, addr);
|
/* Action required MCE kills the process if SIGBUS is blocked. Because
|
||||||
|
* that's what happens in the I/O thread, where we handle MCE via signalfd,
|
||||||
|
* we can only get action optional here.
|
||||||
|
*/
|
||||||
|
assert(code != BUS_MCEERR_AR);
|
||||||
|
kvm_arch_on_sigbus_vcpu(first_cpu, code, addr);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_create_device(KVMState *s, uint64_t type, bool test)
|
int kvm_create_device(KVMState *s, uint64_t type, bool test)
|
||||||
|
|
|
@ -565,11 +565,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *cs, int code, void *addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_on_sigbus(int code, void *addr)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The #ifdef protections are until 32bit headers are imported and can
|
/* The #ifdef protections are until 32bit headers are imported and can
|
||||||
* be removed once both 32 and 64 bit reach feature parity.
|
* be removed once both 32 and 64 bit reach feature parity.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -462,14 +462,13 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr)
|
||||||
ram_addr_t ram_addr;
|
ram_addr_t ram_addr;
|
||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
|
|
||||||
|
/* If we get an action required MCE, it has been injected by KVM
|
||||||
|
* while the VM was running. An action optional MCE instead should
|
||||||
|
* be coming from the main thread, which qemu_init_sigbus identifies
|
||||||
|
* as the "early kill" thread.
|
||||||
|
*/
|
||||||
assert(code == BUS_MCEERR_AR || code == BUS_MCEERR_AO);
|
assert(code == BUS_MCEERR_AR || code == BUS_MCEERR_AO);
|
||||||
|
|
||||||
/* Because the MCE happened while running the VCPU, KVM could have
|
|
||||||
* injected action required MCEs too. Action optional MCEs should
|
|
||||||
* be delivered to the main thread, which qemu_init_sigbus identifies
|
|
||||||
* as the "early kill" thread, but if we get one for whatever reason
|
|
||||||
* we just handle it just like the main thread would.
|
|
||||||
*/
|
|
||||||
if ((env->mcg_cap & MCG_SER_P) && addr) {
|
if ((env->mcg_cap & MCG_SER_P) && addr) {
|
||||||
ram_addr = qemu_ram_addr_from_host(addr);
|
ram_addr = qemu_ram_addr_from_host(addr);
|
||||||
if (ram_addr != RAM_ADDR_INVALID &&
|
if (ram_addr != RAM_ADDR_INVALID &&
|
||||||
|
@ -491,35 +490,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_on_sigbus(int code, void *addr)
|
|
||||||
{
|
|
||||||
X86CPU *cpu = X86_CPU(first_cpu);
|
|
||||||
|
|
||||||
assert(code == BUS_MCEERR_AR || code == BUS_MCEERR_AO);
|
|
||||||
|
|
||||||
if (code == BUS_MCEERR_AR) {
|
|
||||||
hardware_memory_error();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hope we are lucky for AO MCE */
|
|
||||||
if ((cpu->env.mcg_cap & MCG_SER_P) && addr) {
|
|
||||||
ram_addr_t ram_addr;
|
|
||||||
hwaddr paddr;
|
|
||||||
|
|
||||||
ram_addr = qemu_ram_addr_from_host(addr);
|
|
||||||
if (ram_addr != RAM_ADDR_INVALID &&
|
|
||||||
kvm_physical_memory_addr_from_host(first_cpu->kvm_state,
|
|
||||||
addr, &paddr)) {
|
|
||||||
kvm_hwpoison_page_add(ram_addr);
|
|
||||||
kvm_mce_inject(X86_CPU(first_cpu), paddr, code);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Hardware memory error for memory used by "
|
|
||||||
"QEMU itself instead of guest system!: %p\n", addr);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int kvm_inject_mce_oldstyle(X86CPU *cpu)
|
static int kvm_inject_mce_oldstyle(X86CPU *cpu)
|
||||||
{
|
{
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
|
|
|
@ -186,12 +186,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *cs, int code, void *addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_on_sigbus(int code, void *addr)
|
|
||||||
{
|
|
||||||
DPRINTF("%s\n", __func__);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_arch_init_irq_routing(KVMState *s)
|
void kvm_arch_init_irq_routing(KVMState *s)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -2587,11 +2587,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_on_sigbus(int code, void *addr)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_arch_init_irq_routing(KVMState *s)
|
void kvm_arch_init_irq_routing(KVMState *s)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -2145,11 +2145,6 @@ int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_on_sigbus(int code, void *addr)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_s390_io_interrupt(uint16_t subchannel_id,
|
void kvm_s390_io_interrupt(uint16_t subchannel_id,
|
||||||
uint16_t subchannel_nr, uint32_t io_int_parm,
|
uint16_t subchannel_nr, uint32_t io_int_parm,
|
||||||
uint32_t io_int_word)
|
uint32_t io_int_word)
|
||||||
|
|
Loading…
Reference in New Issue