1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$include <elf.sail>
// Simple top level fetch and execute loop.
val fetch_and_execute : unit -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
function fetch_and_execute () =
while true do {
try {
let instr = aget_Mem(_PC, 4, AccType_IFETCH);
decode(instr);
} catch {
Error_See(h) if h == "HINT" => (),
_ => exit(())
};
if __BranchTaken then __BranchTaken = false else _PC = _PC + 4
}
val main : unit -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
function main () = {
_PC = __GetSlice_int(64, elf_entry(), 0);
SP_EL0 = ZeroExtend(0x3C00, 64);
PSTATE.D = 0b1;
PSTATE.A = 0b1;
PSTATE.I = 0b1;
PSTATE.F = 0b1;
OSLSR_EL1 = ZeroExtend(0b10, 32);
__BranchTaken = false;
fetch_and_execute()
}
|