diff options
| author | Prashanth Mundkur | 2018-01-29 08:26:13 -0800 |
|---|---|---|
| committer | Prashanth Mundkur | 2018-01-29 08:26:50 -0800 |
| commit | 62af7ede74637199eadac4bfe19d414caca66d48 (patch) | |
| tree | 44f0d255411fa0a866f0329d4a2b33f81ac1664f /riscv | |
| parent | 8406a2ec3aeab4ad573a126adb3393e7033d749b (diff) | |
Add some initial exception handling to the riscv execution loop.
Diffstat (limited to 'riscv')
| -rw-r--r-- | riscv/main.sail | 17 | ||||
| -rw-r--r-- | riscv/prelude.sail | 1 |
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, |
