3607715a30
Awareness of an in kernel irqchip is usually local to the machine and its top-level interrupt controller. However, in a few cases other things need to know about it. In particular vfio devices need this in order to accelerate interrupt delivery. If interrupt routing is changed, such devices may need to readjust their connection to the KVM irqchip. pci_bus_fire_intx_routing_notifier() exists to do just this. However, for the pseries machine type we have a situation where the routing remains constant but the top-level irq chip itself is changed. This occurs because of PAPR feature negotiation which allows the guest to decide between the older XICS and newer XIVE irq chip models (both of which are paravirtualized). To allow devices like vfio to adjust to this change, introduce a new notifier for the purpose kvm_irqchip_change_notify(). Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Tested-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: Greg Kurz <groug@kaod.org> Acked-by: Alex Williamson <alex.williamson@redhat.com>
185 lines
3.0 KiB
C
185 lines
3.0 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/osdep.h"
|
|
#include "cpu.h"
|
|
#include "sysemu/kvm.h"
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
#include "hw/pci/msi.h"
|
|
#endif
|
|
|
|
KVMState *kvm_state;
|
|
bool kvm_kernel_irqchip;
|
|
bool kvm_async_interrupts_allowed;
|
|
bool kvm_eventfds_allowed;
|
|
bool kvm_irqfds_allowed;
|
|
bool kvm_resamplefds_allowed;
|
|
bool kvm_msi_via_irqfd_allowed;
|
|
bool kvm_gsi_routing_allowed;
|
|
bool kvm_gsi_direct_mapping;
|
|
bool kvm_allowed;
|
|
bool kvm_readonly_mem_allowed;
|
|
bool kvm_ioeventfd_any_length_allowed;
|
|
bool kvm_msi_use_devid;
|
|
|
|
int kvm_destroy_vcpu(CPUState *cpu)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int kvm_init_vcpu(CPUState *cpu)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
void kvm_flush_coalesced_mmio_buffer(void)
|
|
{
|
|
}
|
|
|
|
void kvm_cpu_synchronize_state(CPUState *cpu)
|
|
{
|
|
}
|
|
|
|
void kvm_cpu_synchronize_post_reset(CPUState *cpu)
|
|
{
|
|
}
|
|
|
|
void kvm_cpu_synchronize_post_init(CPUState *cpu)
|
|
{
|
|
}
|
|
|
|
int kvm_cpu_exec(CPUState *cpu)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
bool kvm_has_sync_mmu(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
int kvm_has_many_ioeventfds(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int kvm_insert_breakpoint(CPUState *cpu, target_ulong addr,
|
|
target_ulong len, int type)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
int kvm_remove_breakpoint(CPUState *cpu, target_ulong addr,
|
|
target_ulong len, int type)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
void kvm_remove_all_breakpoints(CPUState *cpu)
|
|
{
|
|
}
|
|
|
|
int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
int kvm_on_sigbus(int code, void *addr)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
bool kvm_memcrypt_enabled(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
int kvm_memcrypt_encrypt_data(uint8_t *ptr, uint64_t len)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
void kvm_init_irq_routing(KVMState *s)
|
|
{
|
|
}
|
|
|
|
void kvm_irqchip_release_virq(KVMState *s, int virq)
|
|
{
|
|
}
|
|
|
|
int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
|
PCIDevice *dev)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
void kvm_irqchip_commit_routes(KVMState *s)
|
|
{
|
|
}
|
|
|
|
void kvm_irqchip_add_change_notifier(Notifier *n)
|
|
{
|
|
}
|
|
|
|
void kvm_irqchip_remove_change_notifier(Notifier *n)
|
|
{
|
|
}
|
|
|
|
void kvm_irqchip_change_notify(void)
|
|
{
|
|
}
|
|
|
|
int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
|
EventNotifier *rn, int virq)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
|
int virq)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
bool kvm_has_free_slot(MachineState *ms)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void kvm_init_cpu_signals(CPUState *cpu)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
bool kvm_arm_supports_user_irq(void)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|