root / hw / openrisc / pic_cpu.c @ e3914e3a
History | View | Annotate | Download (1.7 kB)
1 | dd29c7fb | Jia Liu | /*
|
---|---|---|---|
2 | dd29c7fb | Jia Liu | * OpenRISC Programmable Interrupt Controller support.
|
3 | dd29c7fb | Jia Liu | *
|
4 | dd29c7fb | Jia Liu | * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
|
5 | dd29c7fb | Jia Liu | * Feng Gao <gf91597@gmail.com>
|
6 | dd29c7fb | Jia Liu | *
|
7 | dd29c7fb | Jia Liu | * This library is free software; you can redistribute it and/or
|
8 | dd29c7fb | Jia Liu | * modify it under the terms of the GNU Lesser General Public
|
9 | dd29c7fb | Jia Liu | * License as published by the Free Software Foundation; either
|
10 | dd29c7fb | Jia Liu | * version 2 of the License, or (at your option) any later version.
|
11 | dd29c7fb | Jia Liu | *
|
12 | dd29c7fb | Jia Liu | * This library is distributed in the hope that it will be useful,
|
13 | dd29c7fb | Jia Liu | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | dd29c7fb | Jia Liu | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | dd29c7fb | Jia Liu | * Lesser General Public License for more details.
|
16 | dd29c7fb | Jia Liu | *
|
17 | dd29c7fb | Jia Liu | * You should have received a copy of the GNU Lesser General Public
|
18 | dd29c7fb | Jia Liu | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | dd29c7fb | Jia Liu | */
|
20 | dd29c7fb | Jia Liu | |
21 | 83c9f4ca | Paolo Bonzini | #include "hw/hw.h" |
22 | dd29c7fb | Jia Liu | #include "cpu.h" |
23 | dd29c7fb | Jia Liu | |
24 | dd29c7fb | Jia Liu | /* OpenRISC pic handler */
|
25 | dd29c7fb | Jia Liu | static void openrisc_pic_cpu_handler(void *opaque, int irq, int level) |
26 | dd29c7fb | Jia Liu | { |
27 | dd29c7fb | Jia Liu | OpenRISCCPU *cpu = (OpenRISCCPU *)opaque; |
28 | d8ed887b | Andreas Färber | CPUState *cs = CPU(cpu); |
29 | dd29c7fb | Jia Liu | int i;
|
30 | dd29c7fb | Jia Liu | uint32_t irq_bit = 1 << irq;
|
31 | dd29c7fb | Jia Liu | |
32 | dd29c7fb | Jia Liu | if (irq > 31 || irq < 0) { |
33 | dd29c7fb | Jia Liu | return;
|
34 | dd29c7fb | Jia Liu | } |
35 | dd29c7fb | Jia Liu | |
36 | dd29c7fb | Jia Liu | if (level) {
|
37 | dd29c7fb | Jia Liu | cpu->env.picsr |= irq_bit; |
38 | dd29c7fb | Jia Liu | } else {
|
39 | dd29c7fb | Jia Liu | cpu->env.picsr &= ~irq_bit; |
40 | dd29c7fb | Jia Liu | } |
41 | dd29c7fb | Jia Liu | |
42 | dd29c7fb | Jia Liu | for (i = 0; i < 32; i++) { |
43 | dd29c7fb | Jia Liu | if ((cpu->env.picsr && (1 << i)) && (cpu->env.picmr && (1 << i))) { |
44 | c3affe56 | Andreas Färber | cpu_interrupt(cs, CPU_INTERRUPT_HARD); |
45 | dd29c7fb | Jia Liu | } else {
|
46 | d8ed887b | Andreas Färber | cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); |
47 | dd29c7fb | Jia Liu | cpu->env.picsr &= ~(1 << i);
|
48 | dd29c7fb | Jia Liu | } |
49 | dd29c7fb | Jia Liu | } |
50 | dd29c7fb | Jia Liu | } |
51 | dd29c7fb | Jia Liu | |
52 | dd29c7fb | Jia Liu | void cpu_openrisc_pic_init(OpenRISCCPU *cpu)
|
53 | dd29c7fb | Jia Liu | { |
54 | dd29c7fb | Jia Liu | int i;
|
55 | dd29c7fb | Jia Liu | qemu_irq *qi; |
56 | dd29c7fb | Jia Liu | qi = qemu_allocate_irqs(openrisc_pic_cpu_handler, cpu, NR_IRQS); |
57 | dd29c7fb | Jia Liu | |
58 | dd29c7fb | Jia Liu | for (i = 0; i < NR_IRQS; i++) { |
59 | dd29c7fb | Jia Liu | cpu->env.irq[i] = qi[i]; |
60 | dd29c7fb | Jia Liu | } |
61 | dd29c7fb | Jia Liu | } |