]> Chaos Git - corbenik/corbenik.git/commitdiff
Add interrupt handler ctr9io
authorchaoskagami <chaos.kagami@gmail.com>
Fri, 15 Jul 2016 07:48:04 +0000 (03:48 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Fri, 15 Jul 2016 07:48:04 +0000 (03:48 -0400)
source/interrupt.c [new file with mode: 0644]
source/interrupt.h [new file with mode: 0644]
source/main.c

diff --git a/source/interrupt.c b/source/interrupt.c
new file mode 100644 (file)
index 0000000..49f0847
--- /dev/null
@@ -0,0 +1,62 @@
+#include "common.h"
+#include <ctr9/ctr_interrupt.h>
+
+void dump_state_printf(uint32_t* regs) {
+       fprintf(stderr, "  cpsr:%x sp:%x lr:%x\n"
+                    "  r0:%x r1:%x r2:%x r3:%x\n"
+                    "  r4:%x r5:%x r6:%x r7:%x\n"
+                    "  r8:%x r9:%x r10:%x r11:%x\n"
+                    "  r12:%x\n",
+                    (unsigned int)regs[0], (unsigned int)regs[1], (unsigned int)regs[2],
+                    (unsigned int)regs[3], (unsigned int)regs[4], (unsigned int)regs[5], (unsigned int)regs[6],
+                    (unsigned int)regs[7], (unsigned int)regs[8], (unsigned int)regs[9], (unsigned int)regs[10],
+                    (unsigned int)regs[11], (unsigned int)regs[12], (unsigned int)regs[13], (unsigned int)regs[14],
+                    (unsigned int)regs[15]);
+}
+
+void reset_INT(_UNUSED uint32_t* regs) {
+       fprintf(stderr, "Reset called.\n");
+}
+
+void undef_INT(uint32_t* regs) {
+       fprintf(stderr, "Undefined instruction.\n");
+       dump_state_printf(regs);
+       abort("Cannot continue. Halting.\n");
+}
+
+void swi_INT(_UNUSED uint32_t* regs) {
+       fprintf(stderr, "SWI called. Returning.\n");
+}
+
+void preabrt_INT(uint32_t* regs) {
+       fprintf(stderr, "Prefetch Abort.\n");
+       dump_state_printf(regs);
+       abort("Cannot continue. Halting.\n");
+}
+
+void databrt_INT(uint32_t* regs) {
+       fprintf(stderr, "Data abort.\n");
+       dump_state_printf(regs);
+       abort("Cannot continue. Halting.\n");
+}
+
+void irq_INT(_UNUSED uint32_t* regs) {
+       fprintf(stderr, "IRQ called. Returning.\n");
+}
+
+void fiq_INT(_UNUSED uint32_t* regs) {
+       fprintf(stderr, "FIQ called. Returning.\n");
+}
+
+
+void install_interrupts() {
+       ctr_interrupt_prepare();
+
+    ctr_interrupt_set(CTR_INTERRUPT_RESET,   reset_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_UNDEF,   undef_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_SWI,     swi_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_PREABRT, preabrt_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_DATABRT, databrt_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_IRQ,     irq_INT);
+    ctr_interrupt_set(CTR_INTERRUPT_FIQ,     fiq_INT);
+}
diff --git a/source/interrupt.h b/source/interrupt.h
new file mode 100644 (file)
index 0000000..9c48a72
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __INTERRUPT_H
+#define __INTERRUPT_H
+
+void install_interrupts();
+
+#endif
index 63572fbe5eb9bcdfbcc7b217c3e367fd9bd147f0..994ab2db236fab7ceb7b3a76c2169c9d0898385a 100644 (file)
@@ -6,6 +6,7 @@
 #include "config.h"
 #include "screeninit.h"
 #include "std/abort.h"
+#include "interrupt.h"
 
 int is_n3ds = 0;
 int doing_autoboot = 0;
@@ -31,6 +32,8 @@ main(int argc, char** argv)
 
     set_font(PATH_BITS "/termfont.bin");
 
+    install_interrupts(); // Get some free debug info.
+
     if (c) {
         // Failed to mount SD. Bomb out.
         abort("Failed to mount SD card.\n");