OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [sw/] [lib/] [source/] [neorv32_rte.c] - Diff between revs 6 and 7

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 6 Rev 7
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));
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.