2010-04-19 22:59:30 +04:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-01-29 20:50:05 +03:00
|
|
|
#include "qemu/osdep.h"
|
2011-06-20 00:38:22 +04:00
|
|
|
#include "cpu.h"
|
2012-12-17 21:20:04 +04:00
|
|
|
#include "sysemu/kvm.h"
|
2010-04-19 22:59:30 +04:00
|
|
|
|
2013-04-23 12:29:35 +04:00
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
|
|
#include "hw/pci/msi.h"
|
|
|
|
#endif
|
|
|
|
|
2012-05-17 17:32:33 +04:00
|
|
|
KVMState *kvm_state;
|
2012-05-17 17:32:37 +04:00
|
|
|
bool kvm_kernel_irqchip;
|
2012-07-26 18:35:11 +04:00
|
|
|
bool kvm_async_interrupts_allowed;
|
2014-05-27 16:03:35 +04:00
|
|
|
bool kvm_eventfds_allowed;
|
2012-07-26 18:35:14 +04:00
|
|
|
bool kvm_irqfds_allowed;
|
2015-07-06 21:15:14 +03:00
|
|
|
bool kvm_resamplefds_allowed;
|
2012-07-26 18:35:15 +04:00
|
|
|
bool kvm_msi_via_irqfd_allowed;
|
2012-07-26 18:35:16 +04:00
|
|
|
bool kvm_gsi_routing_allowed;
|
2013-09-03 12:08:25 +04:00
|
|
|
bool kvm_gsi_direct_mapping;
|
2013-04-23 12:29:36 +04:00
|
|
|
bool kvm_allowed;
|
2013-05-29 12:27:25 +04:00
|
|
|
bool kvm_readonly_mem_allowed;
|
2015-11-06 11:02:46 +03:00
|
|
|
bool kvm_ioeventfd_any_length_allowed;
|
2016-10-04 15:28:09 +03:00
|
|
|
bool kvm_msi_use_devid;
|
2012-05-17 17:32:33 +04:00
|
|
|
|
2010-04-19 22:59:30 +04:00
|
|
|
void kvm_flush_coalesced_mmio_buffer(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-01 15:45:44 +04:00
|
|
|
void kvm_cpu_synchronize_state(CPUState *cpu)
|
2010-04-19 22:59:30 +04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
kvm: check KVM_CAP_SYNC_MMU with kvm_vm_check_extension()
On a server-class ppc host, this capability depends on the KVM type,
ie, HV or PR. If both KVM are present in the kernel, we will always
get the HV specific value, even if we explicitely requested PR on
the command line.
This can have an impact if we're using hugepages or a balloon device.
Since we've already created the VM at the time any user calls
kvm_has_sync_mmu(), switching to kvm_vm_check_extension() is
enough to fix any potential issue.
It is okay for the other archs that also implement KVM_CAP_SYNC_MMU,
ie, mips, s390, x86 and arm, because they don't depend on the VM being
created or not.
While here, let's cache the state of this extension in a bool variable,
since it has several users in the code, as suggested by Thomas Huth.
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <150600965332.30533.14702405809647835716.stgit@bahia.lan>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-09-21 19:00:53 +03:00
|
|
|
bool kvm_has_sync_mmu(void)
|
2010-04-19 22:59:30 +04:00
|
|
|
{
|
kvm: check KVM_CAP_SYNC_MMU with kvm_vm_check_extension()
On a server-class ppc host, this capability depends on the KVM type,
ie, HV or PR. If both KVM are present in the kernel, we will always
get the HV specific value, even if we explicitely requested PR on
the command line.
This can have an impact if we're using hugepages or a balloon device.
Since we've already created the VM at the time any user calls
kvm_has_sync_mmu(), switching to kvm_vm_check_extension() is
enough to fix any potential issue.
It is okay for the other archs that also implement KVM_CAP_SYNC_MMU,
ie, mips, s390, x86 and arm, because they don't depend on the VM being
created or not.
While here, let's cache the state of this extension in a bool variable,
since it has several users in the code, as suggested by Thomas Huth.
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <150600965332.30533.14702405809647835716.stgit@bahia.lan>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-09-21 19:00:53 +03:00
|
|
|
return false;
|
2010-04-19 22:59:30 +04:00
|
|
|
}
|
|
|
|
|
2011-01-10 14:50:05 +03:00
|
|
|
int kvm_has_many_ioeventfds(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-07-25 22:50:21 +04:00
|
|
|
int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap)
|
2010-04-19 22:59:30 +04:00
|
|
|
{
|
2011-06-08 18:11:04 +04:00
|
|
|
return -ENOSYS;
|
2010-04-19 22:59:30 +04:00
|
|
|
}
|
|
|
|
|
2013-06-27 19:12:06 +04:00
|
|
|
int kvm_insert_breakpoint(CPUState *cpu, target_ulong addr,
|
2010-04-19 22:59:30 +04:00
|
|
|
target_ulong len, int type)
|
|
|
|
{
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
2013-06-27 19:12:06 +04:00
|
|
|
int kvm_remove_breakpoint(CPUState *cpu, target_ulong addr,
|
2010-04-19 22:59:30 +04:00
|
|
|
target_ulong len, int type)
|
|
|
|
{
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
2013-05-27 16:40:48 +04:00
|
|
|
void kvm_remove_all_breakpoints(CPUState *cpu)
|
2010-04-19 22:59:30 +04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-01-17 12:30:27 +04:00
|
|
|
int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
2011-02-02 00:15:51 +03:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-10-11 22:31:21 +04:00
|
|
|
int kvm_on_sigbus(int code, void *addr)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
2012-05-17 17:32:33 +04:00
|
|
|
|
2013-04-23 12:29:35 +04:00
|
|
|
#ifndef CONFIG_USER_ONLY
|
2016-07-14 08:56:30 +03:00
|
|
|
int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
|
2012-05-17 17:32:33 +04:00
|
|
|
{
|
|
|
|
return -ENOSYS;
|
|
|
|
}
|
2012-05-17 17:32:34 +04:00
|
|
|
|
2013-04-16 17:58:13 +04:00
|
|
|
void kvm_init_irq_routing(KVMState *s)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-05-17 17:32:34 +04:00
|
|
|
void kvm_irqchip_release_virq(KVMState *s, int virq)
|
|
|
|
{
|
|
|
|
}
|
2012-05-17 17:32:36 +04:00
|
|
|
|
2015-10-15 16:44:52 +03:00
|
|
|
int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
|
|
|
PCIDevice *dev)
|
2012-12-21 02:47:46 +04:00
|
|
|
{
|
|
|
|
return -ENOSYS;
|
|
|
|
}
|
|
|
|
|
2016-07-14 08:56:33 +03:00
|
|
|
void kvm_irqchip_commit_routes(KVMState *s)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-10-17 04:12:35 +03:00
|
|
|
void kvm_irqchip_add_change_notifier(Notifier *n)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void kvm_irqchip_remove_change_notifier(Notifier *n)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void kvm_irqchip_change_notify(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-07-15 19:45:03 +04:00
|
|
|
int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter)
|
|
|
|
{
|
|
|
|
return -ENOSYS;
|
|
|
|
}
|
|
|
|
|
2015-07-06 21:15:13 +03:00
|
|
|
int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
|
|
|
EventNotifier *rn, int virq)
|
2012-05-17 17:32:36 +04:00
|
|
|
{
|
|
|
|
return -ENOSYS;
|
|
|
|
}
|
|
|
|
|
2015-07-06 21:15:13 +03:00
|
|
|
int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
|
|
|
int virq)
|
2012-07-05 19:16:30 +04:00
|
|
|
{
|
|
|
|
return -ENOSYS;
|
|
|
|
}
|
2014-10-31 19:38:32 +03:00
|
|
|
|
|
|
|
bool kvm_has_free_slot(MachineState *ms)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2017-02-09 11:41:14 +03:00
|
|
|
|
|
|
|
void kvm_init_cpu_signals(CPUState *cpu)
|
|
|
|
{
|
|
|
|
abort();
|
|
|
|
}
|
2017-07-11 13:21:26 +03:00
|
|
|
|
|
|
|
bool kvm_arm_supports_user_irq(void)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2013-04-23 12:29:35 +04:00
|
|
|
#endif
|