Revision b139bd30

b/target-i386/kvm.c
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
}
b/target-i386/kvm_i386.h
11 11
#ifndef QEMU_KVM_I386_H
12 12
#define QEMU_KVM_I386_H
13 13

  
14
#include "kvm.h"
15

  
14 16
bool kvm_allows_irq0_override(void);
15 17

  
18
int kvm_device_pci_assign(KVMState *s, PCIHostDeviceAddress *dev_addr,
19
                          uint32_t flags, uint32_t *dev_id);
20
int kvm_device_pci_deassign(KVMState *s, uint32_t dev_id);
21

  
22
int kvm_device_intx_assign(KVMState *s, uint32_t dev_id,
23
                           bool use_host_msi, uint32_t guest_irq);
24
int kvm_device_intx_set_mask(KVMState *s, uint32_t dev_id, bool masked);
25
int kvm_device_intx_deassign(KVMState *s, uint32_t dev_id, bool use_host_msi);
26

  
27
int kvm_device_msi_assign(KVMState *s, uint32_t dev_id, int virq);
28
int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id);
29

  
30
bool kvm_device_msix_supported(KVMState *s);
31
int kvm_device_msix_init_vectors(KVMState *s, uint32_t dev_id,
32
                                 uint32_t nr_vectors);
33
int kvm_device_msix_set_vector(KVMState *s, uint32_t dev_id, uint32_t vector,
34
                               int virq);
35
int kvm_device_msix_assign(KVMState *s, uint32_t dev_id);
36
int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id);
37

  
16 38
#endif

Also available in: Unified diff