Revision 7c1840b6 hw/arm/pic_cpu.c

b/hw/arm/pic_cpu.c
9 9

  
10 10
#include "hw/hw.h"
11 11
#include "hw/arm/arm.h"
12
#include "sysemu/kvm.h"
13

  
14
/* Input 0 is IRQ and input 1 is FIQ.  */
15
static void arm_pic_cpu_handler(void *opaque, int irq, int level)
16
{
17
    ARMCPU *cpu = opaque;
18
    CPUState *cs = CPU(cpu);
19

  
20
    switch (irq) {
21
    case ARM_PIC_CPU_IRQ:
22
        if (level) {
23
            cpu_interrupt(cs, CPU_INTERRUPT_HARD);
24
        } else {
25
            cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
26
        }
27
        break;
28
    case ARM_PIC_CPU_FIQ:
29
        if (level) {
30
            cpu_interrupt(cs, CPU_INTERRUPT_FIQ);
31
        } else {
32
            cpu_reset_interrupt(cs, CPU_INTERRUPT_FIQ);
33
        }
34
        break;
35
    default:
36
        hw_error("arm_pic_cpu_handler: Bad interrupt line %d\n", irq);
37
    }
38
}
39

  
40
static void kvm_arm_pic_cpu_handler(void *opaque, int irq, int level)
41
{
42
#ifdef CONFIG_KVM
43
    ARMCPU *cpu = opaque;
44
    CPUState *cs = CPU(cpu);
45
    int kvm_irq = KVM_ARM_IRQ_TYPE_CPU << KVM_ARM_IRQ_TYPE_SHIFT;
46

  
47
    switch (irq) {
48
    case ARM_PIC_CPU_IRQ:
49
        kvm_irq |= KVM_ARM_IRQ_CPU_IRQ;
50
        break;
51
    case ARM_PIC_CPU_FIQ:
52
        kvm_irq |= KVM_ARM_IRQ_CPU_FIQ;
53
        break;
54
    default:
55
        hw_error("kvm_arm_pic_cpu_handler: Bad interrupt line %d\n", irq);
56
    }
57
    kvm_irq |= cs->cpu_index << KVM_ARM_IRQ_VCPU_SHIFT;
58
    kvm_set_irq(kvm_state, kvm_irq, level ? 1 : 0);
59
#endif
60
}
61 12

  
13
/* Backwards compatibility shim; this can disappear when all
14
 * board models have been updated to get IRQ and FIQ lines directly
15
 * from the ARMCPU object rather than by calling this function.
16
 */
62 17
qemu_irq *arm_pic_init_cpu(ARMCPU *cpu)
63 18
{
64
    if (kvm_enabled()) {
65
        return qemu_allocate_irqs(kvm_arm_pic_cpu_handler, cpu, 2);
66
    }
67
    return qemu_allocate_irqs(arm_pic_cpu_handler, cpu, 2);
19
    DeviceState *dev = DEVICE(cpu);
20
    qemu_irq *irqs = g_new(qemu_irq, 2);
21

  
22
    irqs[0] = qdev_get_gpio_in(dev, ARM_CPU_IRQ);
23
    irqs[1] = qdev_get_gpio_in(dev, ARM_CPU_FIQ);
24
    return irqs;
68 25
}

Also available in: Unified diff