software/bios/isr: add support for cv32e40p

This commit is contained in:
Piotr Binkowski 2020-05-20 13:35:18 +02:00
parent 2903b1bf80
commit ca8cb83424
1 changed files with 35 additions and 0 deletions

View File

@ -62,6 +62,41 @@ void isr(void)
*((unsigned int *)PLIC_CLAIM) = claim; *((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 #else
void isr(void) void isr(void)
{ {