Skip to content

File trap.h

File List > bindings > cp > rv64 > trap.h

Go to the documentation of this file

#pragma once

#include <cstdint>

namespace rv64 {

enum ExceptionCode {
  // interrupt exception codes (mcause)
  EXC_U_SOFTWARE_INTERRUPT = 0,
  EXC_S_SOFTWARE_INTERRUPT = 1,
  EXC_M_SOFTWARE_INTERRUPT = 3,

  EXC_U_TIMER_INTERRUPT = 4,
  EXC_S_TIMER_INTERRUPT = 5,
  EXC_M_TIMER_INTERRUPT = 7,

  EXC_U_EXTERNAL_INTERRUPT = 8,
  EXC_S_EXTERNAL_INTERRUPT = 9,
  EXC_M_EXTERNAL_INTERRUPT = 11,

  // non-interrupt exception codes (mcause)
  EXC_INSTR_ADDR_MISALIGNED = 0,
  EXC_INSTR_ACCESS_FAULT = 1,
  EXC_ILLEGAL_INSTR = 2,
  EXC_BREAKPOINT = 3,
  EXC_LOAD_ADDR_MISALIGNED = 4,
  EXC_LOAD_ACCESS_FAULT = 5,
  EXC_STORE_AMO_ADDR_MISALIGNED = 6,
  EXC_STORE_AMO_ACCESS_FAULT = 7,

  EXC_ECALL_U_MODE = 8,
  EXC_ECALL_S_MODE = 9,
  EXC_ECALL_M_MODE = 11,

  EXC_INSTR_PAGE_FAULT = 12,
  EXC_LOAD_PAGE_FAULT = 13,
  EXC_STORE_AMO_PAGE_FAULT = 15,
};

struct SimulationTrap {
  ExceptionCode reason;
  uint64_t mtval;
};

inline void raise_trap(ExceptionCode exc, uint64_t mtval) {
  throw SimulationTrap({exc, mtval});
}

}  // namespace rv64