]>
Commit | Line | Data |
---|---|---|
cdbdb648 PB |
1 | /* |
2 | * Generic ARM Programmable Interrupt Controller support. | |
3 | * | |
4 | * Copyright (c) 2006 CodeSourcery. | |
5 | * Written by Paul Brook | |
6 | * | |
7 | * This code is licenced under the LGPL | |
8 | */ | |
9 | ||
10 | #include "vl.h" | |
11 | #include "arm_pic.h" | |
12 | ||
13 | /* Stub functions for hardware that doesn't exist. */ | |
14 | void pic_set_irq(int irq, int level) | |
15 | { | |
16 | cpu_abort(cpu_single_env, "pic_set_irq"); | |
17 | } | |
18 | ||
19 | void pic_info(void) | |
20 | { | |
21 | } | |
22 | ||
23 | void irq_info(void) | |
24 | { | |
25 | } | |
26 | ||
27 | ||
28 | void pic_set_irq_new(void *opaque, int irq, int level) | |
29 | { | |
30 | arm_pic_handler *p = (arm_pic_handler *)opaque; | |
31 | /* Call the real handler. */ | |
32 | (*p)(opaque, irq, level); | |
33 | } | |
34 | ||
35 | /* Model the IRQ/FIQ CPU interrupt lines as a two input interrupt controller. | |
36 | Input 0 is IRQ and input 1 is FIQ. */ | |
37 | typedef struct | |
38 | { | |
39 | arm_pic_handler handler; | |
40 | CPUState *cpu_env; | |
41 | } arm_pic_cpu_state; | |
42 | ||
43 | static void arm_pic_cpu_handler(void *opaque, int irq, int level) | |
44 | { | |
45 | arm_pic_cpu_state *s = (arm_pic_cpu_state *)opaque; | |
46 | switch (irq) { | |
47 | case ARM_PIC_CPU_IRQ: | |
48 | if (level) | |
49 | cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); | |
50 | else | |
51 | cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); | |
52 | break; | |
53 | case ARM_PIC_CPU_FIQ: | |
54 | if (level) | |
55 | cpu_interrupt(s->cpu_env, CPU_INTERRUPT_FIQ); | |
56 | else | |
57 | cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_FIQ); | |
58 | break; | |
59 | default: | |
60 | cpu_abort(s->cpu_env, "arm_pic_cpu_handler: Bad interrput line %d\n", | |
61 | irq); | |
62 | } | |
63 | } | |
64 | ||
65 | void *arm_pic_init_cpu(CPUState *env) | |
66 | { | |
67 | arm_pic_cpu_state *s; | |
68 | ||
69 | s = (arm_pic_cpu_state *)malloc(sizeof(arm_pic_cpu_state)); | |
70 | s->handler = arm_pic_cpu_handler; | |
71 | s->cpu_env = env; | |
72 | return s; | |
73 | } |