39,7 → 39,7 |
#include <interrupt.h> |
#include <arch/mm/page_fault.h> |
#include <arch/barrier.h> |
#include <arch/drivers/gxemul.h> |
#include <arch/machine.h> |
#include <print.h> |
#include <syscall/syscall.h> |
|
100,7 → 100,7 |
"mov r2, lr\n" |
"stmfd r13!, {r4-r12}\n" |
"mov r1, r13\n" |
|
|
/* the following two lines are for debugging */ |
"mov sp, #0\n" |
"mov lr, #0\n" |
152,7 → 152,7 |
|
/* actual return */ |
"2:\n" |
"ldmfd r13, {r0-r12, pc}^\n" |
"ldmfd r13!, {r0-r12, pc}^\n" |
); |
} |
|
307,37 → 307,6 |
istate->r3, istate->r4, istate->r5, istate->r6); |
} |
|
/** Returns the mask of active interrupts. */ |
static inline uint32_t gxemul_irqc_get_sources(void) |
{ |
return *((uint32_t *) gxemul_irqc); |
} |
|
/** Interrupt Exception handler. |
* |
* Determines the sources of interrupt and calls their handlers. |
*/ |
static void irq_exception(int exc_no, istate_t *istate) |
{ |
uint32_t sources = gxemul_irqc_get_sources(); |
unsigned int i; |
|
for (i = 0; i < GXEMUL_IRQC_MAX_IRQ; i++) { |
if (sources & (1 << i)) { |
irq_t *irq = irq_dispatch_and_lock(i); |
if (irq) { |
/* The IRQ handler was found. */ |
irq->handler(irq); |
spinlock_unlock(&irq->lock); |
} else { |
/* Spurious interrupt.*/ |
printf("cpu%d: spurious interrupt (inum=%d)\n", |
CPU->id, i); |
} |
} |
} |
} |
|
/** Fills exception vectors with appropriate exception handlers. */ |
void install_exception_handlers(void) |
{ |
384,6 → 353,15 |
} |
#endif |
|
/** Interrupt Exception handler. |
* |
* Determines the sources of interrupt and calls their handlers. |
*/ |
static void irq_exception(int exc_no, istate_t *istate) |
{ |
machine_irq_exception(exc_no, istate); |
} |
|
/** Initializes exception handling. |
* |
* Installs low-level exception handlers and then registers |