31 |
31 |
#include "hw/apic.h"
|
32 |
32 |
#include "ioport.h"
|
33 |
33 |
#include "hyperv.h"
|
|
34 |
#include "hw/pci.h"
|
34 |
35 |
|
35 |
36 |
//#define DEBUG_KVM
|
36 |
37 |
|
... | ... | |
2068 |
2069 |
kvm_msi_via_irqfd_allowed = true;
|
2069 |
2070 |
kvm_gsi_routing_allowed = true;
|
2070 |
2071 |
}
|
|
2072 |
|
|
2073 |
/* Classic KVM device assignment interface. Will remain x86 only. */
|
|
2074 |
int kvm_device_pci_assign(KVMState *s, PCIHostDeviceAddress *dev_addr,
|
|
2075 |
uint32_t flags, uint32_t *dev_id)
|
|
2076 |
{
|
|
2077 |
struct kvm_assigned_pci_dev dev_data = {
|
|
2078 |
.segnr = dev_addr->domain,
|
|
2079 |
.busnr = dev_addr->bus,
|
|
2080 |
.devfn = PCI_DEVFN(dev_addr->slot, dev_addr->function),
|
|
2081 |
.flags = flags,
|
|
2082 |
};
|
|
2083 |
int ret;
|
|
2084 |
|
|
2085 |
dev_data.assigned_dev_id =
|
|
2086 |
(dev_addr->domain << 16) | (dev_addr->bus << 8) | dev_data.devfn;
|
|
2087 |
|
|
2088 |
ret = kvm_vm_ioctl(s, KVM_ASSIGN_PCI_DEVICE, &dev_data);
|
|
2089 |
if (ret < 0) {
|
|
2090 |
return ret;
|
|
2091 |
}
|
|
2092 |
|
|
2093 |
*dev_id = dev_data.assigned_dev_id;
|
|
2094 |
|
|
2095 |
return 0;
|
|
2096 |
}
|
|
2097 |
|
|
2098 |
int kvm_device_pci_deassign(KVMState *s, uint32_t dev_id)
|
|
2099 |
{
|
|
2100 |
struct kvm_assigned_pci_dev dev_data = {
|
|
2101 |
.assigned_dev_id = dev_id,
|
|
2102 |
};
|
|
2103 |
|
|
2104 |
return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, &dev_data);
|
|
2105 |
}
|
|
2106 |
|
|
2107 |
static int kvm_assign_irq_internal(KVMState *s, uint32_t dev_id,
|
|
2108 |
uint32_t irq_type, uint32_t guest_irq)
|
|
2109 |
{
|
|
2110 |
struct kvm_assigned_irq assigned_irq = {
|
|
2111 |
.assigned_dev_id = dev_id,
|
|
2112 |
.guest_irq = guest_irq,
|
|
2113 |
.flags = irq_type,
|
|
2114 |
};
|
|
2115 |
|
|
2116 |
if (kvm_check_extension(s, KVM_CAP_ASSIGN_DEV_IRQ)) {
|
|
2117 |
return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, &assigned_irq);
|
|
2118 |
} else {
|
|
2119 |
return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, &assigned_irq);
|
|
2120 |
}
|
|
2121 |
}
|
|
2122 |
|
|
2123 |
int kvm_device_intx_assign(KVMState *s, uint32_t dev_id, bool use_host_msi,
|
|
2124 |
uint32_t guest_irq)
|
|
2125 |
{
|
|
2126 |
uint32_t irq_type = KVM_DEV_IRQ_GUEST_INTX |
|
|
2127 |
(use_host_msi ? KVM_DEV_IRQ_HOST_MSI : KVM_DEV_IRQ_HOST_INTX);
|
|
2128 |
|
|
2129 |
return kvm_assign_irq_internal(s, dev_id, irq_type, guest_irq);
|
|
2130 |
}
|
|
2131 |
|
|
2132 |
int kvm_device_intx_set_mask(KVMState *s, uint32_t dev_id, bool masked)
|
|
2133 |
{
|
|
2134 |
struct kvm_assigned_pci_dev dev_data = {
|
|
2135 |
.assigned_dev_id = dev_id,
|
|
2136 |
.flags = masked ? KVM_DEV_ASSIGN_MASK_INTX : 0,
|
|
2137 |
};
|
|
2138 |
|
|
2139 |
return kvm_vm_ioctl(s, KVM_ASSIGN_SET_INTX_MASK, &dev_data);
|
|
2140 |
}
|
|
2141 |
|
|
2142 |
static int kvm_deassign_irq_internal(KVMState *s, uint32_t dev_id,
|
|
2143 |
uint32_t type)
|
|
2144 |
{
|
|
2145 |
struct kvm_assigned_irq assigned_irq = {
|
|
2146 |
.assigned_dev_id = dev_id,
|
|
2147 |
.flags = type,
|
|
2148 |
};
|
|
2149 |
|
|
2150 |
return kvm_vm_ioctl(s, KVM_DEASSIGN_DEV_IRQ, &assigned_irq);
|
|
2151 |
}
|
|
2152 |
|
|
2153 |
int kvm_device_intx_deassign(KVMState *s, uint32_t dev_id, bool use_host_msi)
|
|
2154 |
{
|
|
2155 |
return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_INTX |
|
|
2156 |
(use_host_msi ? KVM_DEV_IRQ_HOST_MSI : KVM_DEV_IRQ_HOST_INTX));
|
|
2157 |
}
|
|
2158 |
|
|
2159 |
int kvm_device_msi_assign(KVMState *s, uint32_t dev_id, int virq)
|
|
2160 |
{
|
|
2161 |
return kvm_assign_irq_internal(s, dev_id, KVM_DEV_IRQ_HOST_MSI |
|
|
2162 |
KVM_DEV_IRQ_GUEST_MSI, virq);
|
|
2163 |
}
|
|
2164 |
|
|
2165 |
int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id)
|
|
2166 |
{
|
|
2167 |
return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_MSI |
|
|
2168 |
KVM_DEV_IRQ_HOST_MSI);
|
|
2169 |
}
|
|
2170 |
|
|
2171 |
bool kvm_device_msix_supported(KVMState *s)
|
|
2172 |
{
|
|
2173 |
/* The kernel lacks a corresponding KVM_CAP, so we probe by calling
|
|
2174 |
* KVM_ASSIGN_SET_MSIX_NR with an invalid parameter. */
|
|
2175 |
return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, NULL) == -EFAULT;
|
|
2176 |
}
|
|
2177 |
|
|
2178 |
int kvm_device_msix_init_vectors(KVMState *s, uint32_t dev_id,
|
|
2179 |
uint32_t nr_vectors)
|
|
2180 |
{
|
|
2181 |
struct kvm_assigned_msix_nr msix_nr = {
|
|
2182 |
.assigned_dev_id = dev_id,
|
|
2183 |
.entry_nr = nr_vectors,
|
|
2184 |
};
|
|
2185 |
|
|
2186 |
return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, &msix_nr);
|
|
2187 |
}
|
|
2188 |
|
|
2189 |
int kvm_device_msix_set_vector(KVMState *s, uint32_t dev_id, uint32_t vector,
|
|
2190 |
int virq)
|
|
2191 |
{
|
|
2192 |
struct kvm_assigned_msix_entry msix_entry = {
|
|
2193 |
.assigned_dev_id = dev_id,
|
|
2194 |
.gsi = virq,
|
|
2195 |
.entry = vector,
|
|
2196 |
};
|
|
2197 |
|
|
2198 |
return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_ENTRY, &msix_entry);
|
|
2199 |
}
|
|
2200 |
|
|
2201 |
int kvm_device_msix_assign(KVMState *s, uint32_t dev_id)
|
|
2202 |
{
|
|
2203 |
return kvm_assign_irq_internal(s, dev_id, KVM_DEV_IRQ_HOST_MSIX |
|
|
2204 |
KVM_DEV_IRQ_GUEST_MSIX, 0);
|
|
2205 |
}
|
|
2206 |
|
|
2207 |
int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id)
|
|
2208 |
{
|
|
2209 |
return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_MSIX |
|
|
2210 |
KVM_DEV_IRQ_HOST_MSIX);
|
|
2211 |
}
|