@@ -246,7 +246,7 @@ def initializeRegisters (elf: ELF64File): SailM PUnit :=
246246 writeReg htif_payload_writes (← (undefined_bitvector 4 ))
247247 writeReg satp (← (undefined_bitvector ((2 ^i 2 ) *i 8 )))
248248
249- def my_main (elf: ELF64File) :=
249+ def my_main (elf: ELF64File) : SailM Int : =
250250 open LeanRV64DExecutable.Functions in
251251 open Sail in
252252 do
@@ -260,20 +260,32 @@ def my_main (elf: ELF64File) :=
260260 print_bits_effect "htif_tohost = " (← readReg htif_tohost)
261261 loop ()
262262 )
263- (λ the_exception ↦
263+ (λ the_exception ↦ do
264264 match the_exception with
265265 | .Error_not_implemented s => (pure (print_string "Error: Not implemented: " s))
266266 | .Error_internal_error () => (pure (print "Error: internal error" ))
267267 | .Error_reserved_behavior s => (pure (print_string "Error: Reserved behavior: " s))
268+ return 1
268269 )
269270
270271def runElf64 (elf : ELF64File) : IO UInt32 :=
271272 open Sail in
272273 open LeanRV64DExecutable.Functions in
273- let mem := initializeMemory MachineBits.B64 elf
274- let regs := Std.ExtDHashMap.emptyWithCapacity
275- let initialState := ⟨regs, (), mem, default, default, default⟩
276- main_of_sail_main initialState $ fun () => do
277- sail_model_init ()
278- initializeRegisters elf
279- my_main elf
274+ do
275+ let mem := initializeMemory MachineBits.B64 elf
276+ let regs := Std.ExtDHashMap.emptyWithCapacity
277+ let initialState := ⟨regs, (), mem, default, default, default⟩
278+ let main := do
279+ sail_model_init ()
280+ initializeRegisters elf
281+ my_main elf
282+ match main.run initialState with
283+ | .ok res s => do
284+ for m in s.sailOutput do
285+ IO.print m
286+ IO.Process.exit $ UInt8.ofInt res
287+ | .error e s => do
288+ for m in s.sailOutput do
289+ IO.print m
290+ IO.eprintln s! "Error while running the sail program!: { e.print} "
291+ IO.Process.exit 1
0 commit comments