trap, main: implement trap handler
authorKit Rhett Aultman <kit@kitaultman.com>
Sat, 24 Aug 2024 15:30:25 +0000 (11:30 -0400)
committerKit Rhett Aultman <kit@kitaultman.com>
Sat, 24 Aug 2024 15:43:16 +0000 (11:43 -0400)
commit6c1ec60d62a8bf46c7435ee03b602d92789fd6cd
tree3baae2fc99eb09e62994685597c94ac5e731cf48
parent6a7b263f9530e3d640467ca76a719be9c38caf18
trap, main: implement trap handler

This commit implements a trap handler, which handles a number of basic
exception cases and sets the code up for handling interrupts, which will
be really useful for making a serial console properly without relying on
looping.

Changes:
* trap.rs implements a TrapFrame struct and declares one in memory.
  This will allow the code to preserve registers and context without
  using the stack.
* trap.S implements the low-level parts of the trap handler, copying the
  general-purpose and floating-point registers, plus the trap cause and
  other context info, into the TrapFrame, and calls the Rust function
  m_trap.
* trap.rs implements m_trap, which performs dispatch based on the
  exception code and, if the exception is non-fatal, returns the address
  of the PC that the trap returns to (typically PC+4).
* main.rs expands the panic handler to log panic information to serial
  out so that fatal exceptions are logged.  It also adds the trap vector
  init code.

This particular method of performing traps is heavily inspired from
Stephen Marz' blog on bare metal Rust for RISC-V:
http://osblog.stephenmarz.com/ch4.html
src/main.rs
src/trap.S [new file with mode: 0644]
src/trap.rs [new file with mode: 0644]