summaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorPrashanth Mundkur2018-01-29 08:26:13 -0800
committerPrashanth Mundkur2018-01-29 08:26:50 -0800
commit62af7ede74637199eadac4bfe19d414caca66d48 (patch)
tree44f0d255411fa0a866f0329d4a2b33f81ac1664f /riscv
parent8406a2ec3aeab4ad573a126adb3393e7033d749b (diff)
Add some initial exception handling to the riscv execution loop.
Diffstat (limited to 'riscv')
-rw-r--r--riscv/main.sail17
-rw-r--r--riscv/prelude.sail1
2 files changed, 17 insertions, 1 deletions
diff --git a/riscv/main.sail b/riscv/main.sail
index 8c93afdc..cc6bb90c 100644
--- a/riscv/main.sail
+++ b/riscv/main.sail
@@ -29,7 +29,22 @@ val elf_entry = "Elf_loader.elf_entry" : unit -> int
val main : unit -> unit effect {barr, eamem, escape, exmem, rmem, rreg, wmv, wreg}
+function dump_state () : unit -> unit = {
+ print("Dumping state");
+ print_bits(" PC: ", PC);
+ let instr = __RISCV_read(PC, 4);
+ print_bits(" instr: ", instr)
+}
+
function main () = {
PC = __GetSlice_int(64, elf_entry(), 0);
- fetch_and_execute()
+ try {
+ fetch_and_execute()
+ } catch {
+ Error_not_implemented(s) => print_string("Error: Not implemented: ", s),
+ Error_misaligned_access => print("Error: misaligned_access"),
+ Error_EBREAK => print("EBREAK"),
+ Error_internal_error => print("Error: internal error")
+ };
+ dump_state ()
}
diff --git a/riscv/prelude.sail b/riscv/prelude.sail
index 6ddd56ab..f77994d6 100644
--- a/riscv/prelude.sail
+++ b/riscv/prelude.sail
@@ -326,6 +326,7 @@ val pow2 = "pow2" : forall 'n. atom('n) -> atom(2 ^ 'n)
val print_int = "print_int" : (string, int) -> unit
val print_bits = "print_bits" : forall 'n. (string, bits('n)) -> unit
+val print_string = "print_string" : (string, string) -> unit
union exception = {
Error_not_implemented : string,