Line 155... |
Line 155... |
|
|
neorv32_uart_printf("\n\n<< NEORV32 Runtime Environment >>\n");
|
neorv32_uart_printf("\n\n<< NEORV32 Runtime Environment >>\n");
|
|
|
neorv32_uart_printf("System time: 0x%x_%x\n", neorv32_cpu_csr_read(CSR_TIMEH), neorv32_cpu_csr_read(CSR_TIME));
|
neorv32_uart_printf("System time: 0x%x_%x\n", neorv32_cpu_csr_read(CSR_TIMEH), neorv32_cpu_csr_read(CSR_TIME));
|
|
|
register uint32_t exc_cause = neorv32_cpu_csr_read(CSR_MCAUSE);
|
register uint32_t trap_cause = neorv32_cpu_csr_read(CSR_MCAUSE);
|
register uint32_t return_addr = neorv32_cpu_csr_read(CSR_MEPC);
|
register uint32_t trap_addr = neorv32_cpu_csr_read(CSR_MEPC);
|
register uint32_t trans_cmd = neorv32_cpu_csr_read(CSR_MTINST);
|
register uint32_t trap_inst;
|
|
|
if (exc_cause & 0x80000000) {
|
// get faulting instruction
|
|
asm volatile ("lh %[result], 0(%[input_i])" : [result] "=r" (trap_inst) : [input_i] "r" (trap_addr));
|
|
|
|
if (trap_cause & 0x80000000) {
|
neorv32_uart_printf("INTERRUPT");
|
neorv32_uart_printf("INTERRUPT");
|
}
|
}
|
else {
|
else {
|
neorv32_uart_printf("EXCEPTION");
|
neorv32_uart_printf("EXCEPTION");
|
if ((trans_cmd & (1 << 1)) == 0) {
|
if ((trap_inst & 3) == 3) {
|
return_addr -= 4;
|
trap_addr -= 4;
|
}
|
}
|
else {
|
else {
|
return_addr -= 2;
|
trap_addr -= 2;
|
}
|
}
|
}
|
}
|
neorv32_uart_printf(" at instruction address: 0x%x\n", return_addr);
|
neorv32_uart_printf(" at instruction address: 0x%x\n", trap_addr);
|
|
|
neorv32_uart_printf("Cause: ");
|
neorv32_uart_printf("Cause: ");
|
switch (exc_cause) {
|
switch (trap_cause) {
|
case 0x00000000: neorv32_uart_printf("Instruction address misaligned"); break;
|
case 0x00000000: neorv32_uart_printf("Instruction address misaligned"); break;
|
case 0x00000001: neorv32_uart_printf("Instruction access fault"); break;
|
case 0x00000001: neorv32_uart_printf("Instruction access fault"); break;
|
case 0x00000002: neorv32_uart_printf("Illegal instruction"); break;
|
case 0x00000002: neorv32_uart_printf("Illegal instruction"); break;
|
case 0x00000003: neorv32_uart_printf("Breakpoint (EBREAK)"); break;
|
case 0x00000003: neorv32_uart_printf("Breakpoint (EBREAK)"); break;
|
case 0x00000004: neorv32_uart_printf("Load address misaligned"); break;
|
case 0x00000004: neorv32_uart_printf("Load address misaligned"); break;
|
Line 187... |
Line 190... |
case 0x00000007: neorv32_uart_printf("Store access fault"); break;
|
case 0x00000007: neorv32_uart_printf("Store access fault"); break;
|
case 0x0000000B: neorv32_uart_printf("Environment call (ECALL)"); break;
|
case 0x0000000B: neorv32_uart_printf("Environment call (ECALL)"); break;
|
case 0x80000003: neorv32_uart_printf("Machine software interrupt"); break;
|
case 0x80000003: neorv32_uart_printf("Machine software interrupt"); break;
|
case 0x80000007: neorv32_uart_printf("Machine timer interrupt (via MTIME)"); break;
|
case 0x80000007: neorv32_uart_printf("Machine timer interrupt (via MTIME)"); break;
|
case 0x8000000B: neorv32_uart_printf("Machine external interrupt (via CLIC)"); break;
|
case 0x8000000B: neorv32_uart_printf("Machine external interrupt (via CLIC)"); break;
|
default: neorv32_uart_printf("Unknown (0x%x)", exc_cause); break;
|
default: neorv32_uart_printf("Unknown (0x%x)", trap_cause); break;
|
}
|
}
|
|
|
// fault address
|
// fault address
|
if (exc_cause == 0x00000002) {
|
neorv32_uart_printf("\nFaulting instruction: 0x%x\n", trap_inst);
|
neorv32_uart_printf("\nFaulting instruction");
|
neorv32_uart_printf("MTVAL: 0x%x\n", neorv32_cpu_csr_read(CSR_MTVAL));
|
}
|
|
else {
|
|
neorv32_uart_printf("\nFaulting address");
|
|
}
|
|
neorv32_uart_printf(": 0x%x\n", neorv32_cpu_csr_read(CSR_MTVAL));
|
|
neorv32_uart_printf("Transf. instruction: 0x%x ", trans_cmd);
|
|
|
|
if ((trans_cmd & (1 << 1)) == 0) {
|
if ((trap_inst & 3) != 3) {
|
neorv32_uart_printf("(decompressed)\n");
|
neorv32_uart_printf("(decompressed)\n");
|
}
|
}
|
|
|
neorv32_uart_printf("Trying to resume application @ 0x%x...", neorv32_cpu_csr_read(CSR_MEPC));
|
neorv32_uart_printf("Trying to resume application @ 0x%x...", neorv32_cpu_csr_read(CSR_MEPC));
|
|
|