qemu-patch-raspberry4/kvm-stub.c
Marcelo Tosatti c0532a76b4 MCE: Relay UCR MCE to guest
Port qemu-kvm's

commit 4b62fff1101a7ad77553147717a8bd3bf79df7ef
Author: Huang Ying <ying.huang@intel.com>
Date:   Mon Sep 21 10:43:25 2009 +0800

    MCE: Relay UCR MCE to guest

    UCR (uncorrected recovery) MCE is supported in recent Intel CPUs,
    where some hardware error such as some memory error can be reported
    without PCC (processor context corrupted). To recover from such MCE,
    the corresponding memory will be unmapped, and all processes accessing
    the memory will be killed via SIGBUS.

    For KVM, if QEMU/KVM is killed, all guest processes will be killed
    too. So we relay SIGBUS from host OS to guest system via a UCR MCE
    injection. Then guest OS can isolate corresponding memory and kill
    necessary guest processes only. SIGBUS sent to main thread (not VCPU
    threads) will be broadcast to all VCPU threads as UCR MCE.

aliguori: fix build

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2010-10-20 16:15:04 -05:00

149 lines
2.3 KiB
C

/*
* QEMU KVM stub
*
* Copyright Red Hat, Inc. 2010
*
* Author: Paolo Bonzini <pbonzini@redhat.com>
*
* 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 "sysemu.h"
#include "hw/hw.h"
#include "exec-all.h"
#include "gdbstub.h"
#include "kvm.h"
int kvm_irqchip_in_kernel(void)
{
return 0;
}
int kvm_pit_in_kernel(void)
{
return 0;
}
int kvm_init_vcpu(CPUState *env)
{
return -ENOSYS;
}
int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size)
{
return -ENOSYS;
}
int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size)
{
return -ENOSYS;
}
int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
{
return -ENOSYS;
}
int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
{
return -ENOSYS;
}
int kvm_check_extension(KVMState *s, unsigned int extension)
{
return 0;
}
int kvm_init(int smp_cpus)
{
return -ENOSYS;
}
void kvm_flush_coalesced_mmio_buffer(void)
{
}
void kvm_cpu_synchronize_state(CPUState *env)
{
}
void kvm_cpu_synchronize_post_reset(CPUState *env)
{
}
void kvm_cpu_synchronize_post_init(CPUState *env)
{
}
int kvm_cpu_exec(CPUState *env)
{
abort ();
}
int kvm_has_sync_mmu(void)
{
return 0;
}
int kvm_has_vcpu_events(void)
{
return 0;
}
int kvm_has_robust_singlestep(void)
{
return 0;
}
void kvm_setup_guest_memory(void *start, size_t size)
{
}
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
{
tb_flush(env);
return 0;
}
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
target_ulong len, int type)
{
return -EINVAL;
}
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
target_ulong len, int type)
{
return -EINVAL;
}
void kvm_remove_all_breakpoints(CPUState *current_env)
{
}
#ifndef _WIN32
int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset)
{
abort();
}
#endif
int kvm_set_ioeventfd_pio_word(int fd, uint16_t addr, uint16_t val, bool assign)
{
return -ENOSYS;
}
int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, bool assign)
{
return -ENOSYS;
}
int kvm_on_sigbus(int code, void *addr)
{
return 1;
}