]>
Commit | Line | Data |
---|---|---|
5fafdf24 | 1 | /* |
cdbdb648 PB |
2 | * Generic ARM Programmable Interrupt Controller support. |
3 | * | |
4 | * Copyright (c) 2006 CodeSourcery. | |
5 | * Written by Paul Brook | |
6 | * | |
8e31bf38 | 7 | * This code is licensed under the LGPL |
cdbdb648 PB |
8 | */ |
9 | ||
83c9f4ca | 10 | #include "hw/hw.h" |
bd2be150 | 11 | #include "hw/arm/arm.h" |
494b00c7 | 12 | #include "sysemu/kvm.h" |
cdbdb648 | 13 | |
d537cf6c | 14 | /* Input 0 is IRQ and input 1 is FIQ. */ |
cdbdb648 PB |
15 | static void arm_pic_cpu_handler(void *opaque, int irq, int level) |
16 | { | |
4bd74661 | 17 | ARMCPU *cpu = opaque; |
d8ed887b | 18 | CPUState *cs = CPU(cpu); |
4bd74661 | 19 | |
cdbdb648 PB |
20 | switch (irq) { |
21 | case ARM_PIC_CPU_IRQ: | |
d8ed887b | 22 | if (level) { |
c3affe56 | 23 | cpu_interrupt(cs, CPU_INTERRUPT_HARD); |
d8ed887b AF |
24 | } else { |
25 | cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); | |
26 | } | |
cdbdb648 PB |
27 | break; |
28 | case ARM_PIC_CPU_FIQ: | |
d8ed887b | 29 | if (level) { |
c3affe56 | 30 | cpu_interrupt(cs, CPU_INTERRUPT_FIQ); |
d8ed887b AF |
31 | } else { |
32 | cpu_reset_interrupt(cs, CPU_INTERRUPT_FIQ); | |
33 | } | |
cdbdb648 PB |
34 | break; |
35 | default: | |
47601f22 | 36 | hw_error("arm_pic_cpu_handler: Bad interrupt line %d\n", irq); |
cdbdb648 PB |
37 | } |
38 | } | |
39 | ||
494b00c7 CD |
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 | ||
4bd74661 | 62 | qemu_irq *arm_pic_init_cpu(ARMCPU *cpu) |
cdbdb648 | 63 | { |
494b00c7 CD |
64 | if (kvm_enabled()) { |
65 | return qemu_allocate_irqs(kvm_arm_pic_cpu_handler, cpu, 2); | |
66 | } | |
4bd74661 | 67 | return qemu_allocate_irqs(arm_pic_cpu_handler, cpu, 2); |
cdbdb648 | 68 | } |