Revision d8ee0384

b/hw/kvm/ioapic.c
15 15
#include "hw/apic_internal.h"
16 16
#include "kvm.h"
17 17

  
18
/* PC Utility function */
19
void kvm_pc_setup_irq_routing(bool pci_enabled)
20
{
21
    KVMState *s = kvm_state;
22
    int i;
23

  
24
    if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
25
        for (i = 0; i < 8; ++i) {
26
            if (i == 2) {
27
                continue;
28
            }
29
            kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_PIC_MASTER, i);
30
        }
31
        for (i = 8; i < 16; ++i) {
32
            kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_PIC_SLAVE, i - 8);
33
        }
34
        if (pci_enabled) {
35
            for (i = 0; i < 24; ++i) {
36
                if (i == 0) {
37
                    kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_IOAPIC, 2);
38
                } else if (i != 2) {
39
                    kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_IOAPIC, i);
40
                }
41
            }
42
        }
43
    }
44
}
45

  
46
void kvm_pc_gsi_handler(void *opaque, int n, int level)
47
{
48
    GSIState *s = opaque;
49

  
50
    if (n < ISA_NUM_IRQS) {
51
        /* Kernel will forward to both PIC and IOAPIC */
52
        qemu_set_irq(s->i8259_irq[n], level);
53
    } else {
54
        qemu_set_irq(s->ioapic_irq[n], level);
55
    }
56
}
57

  
18 58
typedef struct KVMIOAPICState KVMIOAPICState;
19 59

  
20 60
struct KVMIOAPICState {
b/hw/pc_piix.c
54 54
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
55 55
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
56 56

  
57
static void kvm_piix3_setup_irq_routing(bool pci_enabled)
58
{
59
#ifdef CONFIG_KVM
60
    KVMState *s = kvm_state;
61
    int i;
62

  
63
    if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
64
        for (i = 0; i < 8; ++i) {
65
            if (i == 2) {
66
                continue;
67
            }
68
            kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_PIC_MASTER, i);
69
        }
70
        for (i = 8; i < 16; ++i) {
71
            kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_PIC_SLAVE, i - 8);
72
        }
73
        if (pci_enabled) {
74
            for (i = 0; i < 24; ++i) {
75
                if (i == 0) {
76
                    kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_IOAPIC, 2);
77
                } else if (i != 2) {
78
                    kvm_irqchip_add_irq_route(s, i, KVM_IRQCHIP_IOAPIC, i);
79
                }
80
            }
81
        }
82
    }
83
#endif /* CONFIG_KVM */
84
}
85

  
86
static void kvm_piix3_gsi_handler(void *opaque, int n, int level)
87
{
88
    GSIState *s = opaque;
89

  
90
    if (n < ISA_NUM_IRQS) {
91
        /* Kernel will forward to both PIC and IOAPIC */
92
        qemu_set_irq(s->i8259_irq[n], level);
93
    } else {
94
        qemu_set_irq(s->ioapic_irq[n], level);
95
    }
96
}
97

  
98 57
/* PC hardware initialisation */
99 58
static void pc_init1(MemoryRegion *system_memory,
100 59
                     MemoryRegion *system_io,
......
160 119

  
161 120
    gsi_state = g_malloc0(sizeof(*gsi_state));
162 121
    if (kvm_irqchip_in_kernel()) {
163
        kvm_piix3_setup_irq_routing(pci_enabled);
164
        gsi = qemu_allocate_irqs(kvm_piix3_gsi_handler, gsi_state,
122
        kvm_pc_setup_irq_routing(pci_enabled);
123
        gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
165 124
                                 GSI_NUM_PINS);
166 125
    } else {
167 126
        gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
b/kvm.h
275 275

  
276 276
int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
277 277
int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
278
void kvm_pc_gsi_handler(void *opaque, int n, int level);
279
void kvm_pc_setup_irq_routing(bool pci_enabled);
278 280
#endif

Also available in: Unified diff