software/bios/isr: add support for cv32e40p
authorPiotr Binkowski <pbinkowski@antmicro.com>
Wed, 20 May 2020 11:35:18 +0000 (13:35 +0200)
committerPiotr Binkowski <pbinkowski@antmicro.com>
Wed, 20 May 2020 11:46:37 +0000 (13:46 +0200)
litex/soc/software/bios/isr.c

index 0044f3d162c5099ffd4e1f4b0b9fd13900018bcf..dafa2c1844c9d309e01687eee9dc2db39f61acfe 100644 (file)
@@ -62,6 +62,41 @@ void isr(void)
                *((unsigned int *)PLIC_CLAIM) = claim;
        }
 }
+#elif defined(__cv32e40p__)
+
+#define FIRQ_OFFSET 16
+#define IRQ_MASK 0x7FFFFFFF
+#define INVINST 2
+#define ECALL 11
+#define RISCV_TEST
+
+void isr(void)
+{
+    unsigned int cause = csrr(mcause) & IRQ_MASK;
+
+    if (csrr(mcause) & 0x80000000) {
+#ifndef UART_POLLING
+        if (cause == (UART_INTERRUPT+FIRQ_OFFSET)){
+            uart_isr();
+        }
+#endif
+    } else {
+#ifdef RISCV_TEST
+        int gp;
+        asm volatile ("mv %0, gp" : "=r"(gp));
+        printf("E %d\n", cause);
+        if (cause == INVINST) {
+            printf("Inv Instr\n");
+            for(;;);
+        }
+        if (cause == ECALL) {
+            printf("Ecall (gp: %d)\n", gp);
+            csrw(mepc, csrr(mepc)+4);
+        }
+#endif
+    }
+}
+
 #else
 void isr(void)
 {