ASM->C for interrupt masking
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sat, 1 Apr 2017 21:42:06 +0000 (14:42 -0700)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sat, 1 Apr 2017 21:42:06 +0000 (14:42 -0700)
romstage.c
start.s

index 151a0a0..211e462 100644 (file)
@@ -112,12 +112,14 @@ void switch_vpu_to_pllc() {
        CM_TIMERCTL = CM_PASSWORD | CM_SRC_OSC | 0x10;\r
 }\r
 \r
        CM_TIMERCTL = CM_PASSWORD | CM_SRC_OSC | 0x10;\r
 }\r
 \r
-void set_interrupt(int intno, bool enable) {\r
+void set_interrupt(int intno, bool enable, int core) {\r
+    int base = (core == 0) ? : IC0_BASE : IC1_Base;\r
+\r
     int offset = 0x10 + ((intno >> 3) << 2);\r
     uint32_t slot = 0xF << ((intno & 7) << 2);\r
 \r
     int offset = 0x10 + ((intno >> 3) << 2);\r
     uint32_t slot = 0xF << ((intno & 7) << 2);\r
 \r
-    uint32_t v = mmio_read32(IC0_BASE + offset) & ~slot;\r
-    mmio_write32(IC0_BASE + offset, enable ? v | slot : v);\r
+    uint32_t v = mmio_read32(base + offset) & ~slot;\r
+    mmio_write32(base + offset, enable ? v | slot : v);\r
 }\r
 \r
 extern void sdram_init();\r
 }\r
 \r
 extern void sdram_init();\r
@@ -131,9 +133,15 @@ int _main(unsigned int cpuid, unsigned int load_address) {
        uart_init();\r
 \r
        for(int i = 0; i < 64; ++i) {\r
        uart_init();\r
 \r
        for(int i = 0; i < 64; ++i) {\r
-           set_interrupt(i, (i != (125 - 64)) && (i != (121 - 64)) && (i != (120 - 64)) && (i != (73 - 64)) && (i != (96 - 64)));\r
+           set_interrupt(i, (i != (125 - 64)) && (i != (121 - 64)) && (i != (120 - 64)) && (i != (73 - 64)) && (i != (96 - 64)), 0);\r
+           set_interrupt(i, 0, 1);\r
        }\r
 \r
        }\r
 \r
+       IC0_VADDR = 0x1B000;\r
+       IC1_VADDR = 0x1B000;\r
+\r
+       __asm__ volatile("ei");\r
+\r
        printf(\r
            "==================================================================\n"\r
            "::\n"\r
        printf(\r
            "==================================================================\n"\r
            "::\n"\r
diff --git a/start.s b/start.s
index 57ab6fa..7802834 100644 (file)
--- a/start.s
+++ b/start.s
@@ -110,29 +110,6 @@ L_setup_hw_irq:
        mov r28, #0x1D000 
        mov sp, #0x1C000
 
        mov r28, #0x1D000 
        mov sp, #0x1C000
 
-       /* mask interrupts */
-       mov r0, #(IC0_BASE + 0x10)
-       mov r1, #(IC1_BASE + 0x10)
-       mov r2, 0x00000000
-       mov r3, #(IC0_BASE + 0x10 + 0x20)
-
-mask_all:
-       st r2, (r0)
-       st r2, (r1)
-       add r0, 4
-       add r1, 4
-       ble r0, r3, mask_all
-       /* set interrupt vector bases */
-       mov r3, #0x1B000
-       mov r0, #IC0_VADDR
-       st r3, (r0)
-       mov r0, #IC1_VADDR
-       st r3, (r0)
-
-       /* enable interrupts */
-       ei
-
        /* jump to C code */
        mov r0, r5
        lea r1, _start
        /* jump to C code */
        mov r0, r5
        lea r1, _start
This page took 0.029876 seconds and 4 git commands to generate.