diff options
| author | Alastair Reid | 2018-06-26 18:05:19 +0100 |
|---|---|---|
| committer | Alastair Reid | 2018-06-26 18:05:19 +0100 |
| commit | e65b6b3cd2a3259f1d709fc8a0fb11fdbf667a39 (patch) | |
| tree | 7ab6e4b3eeb0ce92a6e0f6b420b3968ff2822fc8 | |
| parent | fd673a2af31e37fc2ed3da736682a7a378557023 (diff) | |
Main: further refinement of execution cycle
Mostly improving error messages
| -rw-r--r-- | aarch64/elfmain.sail | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/aarch64/elfmain.sail b/aarch64/elfmain.sail index 7be920c3..24eb1f86 100644 --- a/aarch64/elfmain.sail +++ b/aarch64/elfmain.sail @@ -81,53 +81,55 @@ function fetch_and_execute () = { var prevCNTHCTL_EL2 = CNTHCTL_EL2; if ~(__Sleeping()) then { - var ok = false; // Check for pending interrupts var interrupt_req : InterruptReq = undefined; interrupt_req.take_SE = true; interrupt_req.take_vSE = true; interrupt_req.take_IRQ = true; interrupt_req.take_vIRQ = true; interrupt_req.take_FIQ = true; interrupt_req.take_vFIQ = true; - ok = ~(TakePendingInterrupts(interrupt_req)); - - try { - __currentInstr = __fetchA64(); - ok = true; - } catch { - Error_ExceptionTaken() => { - print("Exception taken during IFetch\n") - }, - _ => { - print("Exiting due to unhandled exception during fetch\n"); - exit() - } - }; - if ok then { + if TakePendingInterrupts(interrupt_req) then { + print("Pending interrupt taken\n"); + } else { + var ok = false; try { - ok = false; - __PC_changed = false; - ShouldAdvanceIT = (PSTATE.nRW == [bitone]) & (PSTATE.T == [bitone]); - decode(__currentInstr); - if ~(__PC_changed) then _PC = _PC + 4 else (); - if ShouldAdvanceIT then AArch32_ITAdvance() else (); - SSAdvance(); - __UpdateSystemCounter(); // should this happen even if sleeping? + __currentInstr = __fetchA64(); ok = true; } catch { - Error_See(_) => UndefinedFault(), - Error_ReservedEncoding(_) => UndefinedFault(), - Error_Undefined() => UndefinedFault(), Error_ExceptionTaken() => { - print("Exception taken during IFetch\n") + print(concat_str("Exception taken during IFetch from PC=", concat_str(HexStr(UInt(aget_PC())), "\n"))); }, _ => { - print("Exiting due to unhandled exception during decode/execute\n"); + print("Exiting due to unhandled exception during fetch\n"); exit() } + }; + if ok then { + try { + ok = false; + __PC_changed = false; + ShouldAdvanceIT = (PSTATE.nRW == [bitone]) & (PSTATE.T == [bitone]); + decode(__currentInstr); + if ~(__PC_changed) then _PC = _PC + 4 else (); + if ShouldAdvanceIT then AArch32_ITAdvance() else (); + SSAdvance(); + __UpdateSystemCounter(); // should this happen even if sleeping? + ok = true; + } catch { + Error_See(_) => UndefinedFault(), + Error_ReservedEncoding(_) => UndefinedFault(), + Error_Undefined() => UndefinedFault(), + Error_ExceptionTaken() => { + print(concat_str("Exception taken during Decode/Execute from PC=", concat_str(HexStr(UInt(aget_PC())), "\n"))); + }, + _ => { + print("Exiting due to unhandled exception during decode/execute\n"); + exit() + } + } + }; + if ~(ok) then { + print(concat_str("Yoiks: something went wrong at ", concat_str(DecStr(cycle_counter), "\n"))); } - }; - if ~(ok) then { - print(concat_str("Yoiks: something went wrong at ", concat_str(DecStr(cycle_counter), "\n"))); } }; |
