+#include "sysctl.h"
+#include "debug.h"
+
+void startup();
+void intr_entry_nop();
+void intr_entry_irq();
+
+void intr_init(void)
+{
+ /* setup interrupt vectors */
+ setvect(INTR_RESET, (uint32_t)startup);
+ setvect(INTR_UNDEF, (uint32_t)intr_entry_nop);
+ setvect(INTR_SWI, (uint32_t)intr_entry_nop);
+ setvect(INTR_IABORT, (uint32_t)intr_entry_nop);
+ setvect(INTR_DABORT, (uint32_t)intr_entry_nop);
+ setvect(INTR_IRQ, (uint32_t)intr_entry_irq);
+ setvect(INTR_FIQ, (uint32_t)intr_entry_irq);
+
+ printf("Exception vectors:\n");
+ hexdump(0, 32);
+}
+
+void setvect(int idx, uint32_t addr)
+{
+ uint32_t *ivec = 0;
+ uint32_t pc = (idx << 2) + 8;
+
+ printf("setvect(%d, %lx)\n", idx, (unsigned long)addr);
+
+ /* construct branch instruction */
+ ivec[idx] = 0xea000000 | (addr - pc) >> 2;
+
+ /* we also probably need to invalidate the instr. cache */
+ sysctl_icache_inval(0, 32);
+}