diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-04-09 01:32:52 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-04-09 01:32:52 +0000 |
commit | cdbdb648b7c2867f0bb7dce27efb1986f770dedb (patch) | |
tree | f838b39e8f30e4872a792638e532d8ac8db6fbfc /hw/arm_pic.c | |
parent | 95219897ff4e6d0502b920c521fccc612ad913dd (diff) |
ARM Versatile Platform Baseboard emulation.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1804 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/arm_pic.c')
-rw-r--r-- | hw/arm_pic.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/hw/arm_pic.c b/hw/arm_pic.c new file mode 100644 index 0000000000..fbc2d67d0a --- /dev/null +++ b/hw/arm_pic.c @@ -0,0 +1,73 @@ +/* + * Generic ARM Programmable Interrupt Controller support. + * + * Copyright (c) 2006 CodeSourcery. + * Written by Paul Brook + * + * This code is licenced under the LGPL + */ + +#include "vl.h" +#include "arm_pic.h" + +/* Stub functions for hardware that doesn't exist. */ +void pic_set_irq(int irq, int level) +{ + cpu_abort(cpu_single_env, "pic_set_irq"); +} + +void pic_info(void) +{ +} + +void irq_info(void) +{ +} + + +void pic_set_irq_new(void *opaque, int irq, int level) +{ + arm_pic_handler *p = (arm_pic_handler *)opaque; + /* Call the real handler. */ + (*p)(opaque, irq, level); +} + +/* Model the IRQ/FIQ CPU interrupt lines as a two input interrupt controller. + Input 0 is IRQ and input 1 is FIQ. */ +typedef struct +{ + arm_pic_handler handler; + CPUState *cpu_env; +} arm_pic_cpu_state; + +static void arm_pic_cpu_handler(void *opaque, int irq, int level) +{ + arm_pic_cpu_state *s = (arm_pic_cpu_state *)opaque; + switch (irq) { + case ARM_PIC_CPU_IRQ: + if (level) + cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); + else + cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); + break; + case ARM_PIC_CPU_FIQ: + if (level) + cpu_interrupt(s->cpu_env, CPU_INTERRUPT_FIQ); + else + cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_FIQ); + break; + default: + cpu_abort(s->cpu_env, "arm_pic_cpu_handler: Bad interrput line %d\n", + irq); + } +} + +void *arm_pic_init_cpu(CPUState *env) +{ + arm_pic_cpu_state *s; + + s = (arm_pic_cpu_state *)malloc(sizeof(arm_pic_cpu_state)); + s->handler = arm_pic_cpu_handler; + s->cpu_env = env; + return s; +} |