Skip to content

Commit 0291bd7

Browse files
committed
CHB:MIPS: add error handling
1 parent 99b6c45 commit 0291bd7

File tree

6 files changed

+234
-141
lines changed

6 files changed

+234
-141
lines changed

CodeHawk/CHB/bchlibmips32/bCHDisassembleMIPS.ml

Lines changed: 73 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,14 @@ let disassemble_mips_sections () =
243243
STR "disassemble section:"; NL; h#toPretty; NL; NL] in
244244
let displacement =
245245
TR.tget_ok (h#get_addr#subtract_to_int startOfCode) in
246+
let _ =
247+
chlog#add
248+
"disassembly"
249+
(LBLOCK [
250+
STR "disassemble section: ";
251+
h#toPretty;
252+
STR " with displacement: ";
253+
INT displacement]) in
246254
let _ =
247255
pverbose [
248256
STR "disassemble section at displacement: ";
@@ -582,23 +590,32 @@ let get_successors (faddr:doubleword_int) (iaddr:doubleword_int) =
582590
(get_mips_assembly_instruction iaddr)
583591

584592

585-
let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
593+
let trace_block
594+
(faddr:doubleword_int)
595+
(baddr:doubleword_int):
596+
(mips_assembly_block_int list * mips_assembly_block_int) TR.traceresult =
586597

587598
let set_block_entry (va: doubleword_int) =
588599
TR.titer
589600
~ok:(fun instr -> instr#set_block_entry)
590601
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
591602
(get_mips_assembly_instruction va) in
592603

593-
let get_instr iaddr = get_mips_assembly_instruction iaddr in
604+
let get_instr (iaddr: doubleword_int): mips_assembly_instruction_result =
605+
get_mips_assembly_instruction iaddr in
594606

595607
let get_next_instr_addr a = a#add_int 4 in
596608

597609
let mk_ci_succ l =
598610
List.map
599611
(fun va -> (make_location {loc_faddr = faddr ; loc_iaddr = va})#ci) l in
600612

601-
let rec find_last_instr (va: doubleword_int) (prev: doubleword_int) =
613+
let rec find_last_instr
614+
(va: doubleword_int)
615+
(prev: doubleword_int):
616+
(ctxt_iaddress_t list option
617+
* doubleword_int
618+
* mips_assembly_block_int list) TR.traceresult =
602619
let instr =
603620
fail_tvalue
604621
(trerror_record
@@ -610,24 +627,24 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
610627

611628
if va#equal wordzero
612629
|| not (!mips_assembly_instructions#is_code_address va) then
613-
(Some [],prev,[])
630+
Ok (Some [], prev, [])
614631
else if is_return_instruction instr#get_opcode then
615-
(Some [],va#add_int 4,[])
632+
Ok (Some [], va#add_int 4, [])
616633
else if instr#is_block_entry then
617-
(None,prev,[])
634+
Ok (None, prev, [])
618635
else if is_nr_call_instruction instr then
619-
(Some [],va#add_int 4,[])
636+
Ok (Some [], va#add_int 4, [])
620637
else if is_conditional_jump_instruction instr#get_opcode
621638
|| is_fp_conditional_jump_instruction instr#get_opcode then
622639
let nextblock = va#add_int 8 in
623640
let tgtblock = get_direct_jump_target_address instr#get_opcode in
624-
(Some (mk_ci_succ [ nextblock ; tgtblock ]),va#add_int 4,[])
641+
Ok (Some (mk_ci_succ [nextblock; tgtblock]), va#add_int 4, [])
625642
else if is_direct_jump_instruction instr#get_opcode then
626643
let tgtblock = get_direct_jump_target_address instr#get_opcode in
627644
if functions_data#is_function_entry_point tgtblock then
628-
(Some [], va#add_int 4, []) (* function chaining *)
645+
Ok (Some [], va#add_int 4, []) (* function chaining *)
629646
else
630-
(Some (mk_ci_succ [tgtblock]), va#add_int 4, [])
647+
Ok (Some (mk_ci_succ [tgtblock]), va#add_int 4, [])
631648
else if is_indirect_jump_instruction instr#get_opcode then
632649
if system_info#has_jump_table_target faddr va then
633650
let loc = make_location { loc_faddr = faddr ; loc_iaddr = va } in
@@ -638,16 +655,16 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
638655
let reg =
639656
MIPSRegister (get_indirect_jump_instruction_register instr#get_opcode) in
640657
let _ = finfo#set_jumptable_target ctxtiaddr jt#get_start_address jt reg in
641-
(Some (mk_ci_succ targets), va#add_int 4, [])
658+
Ok (Some (mk_ci_succ targets), va#add_int 4, [])
642659
else if system_info#has_indirect_jump_targets faddr va then
643660
let targets = system_info#get_indirect_jump_targets faddr va in
644-
(Some (mk_ci_succ targets), va#add_int 4, [])
661+
Ok (Some (mk_ci_succ targets), va#add_int 4, [])
645662
else
646-
(Some [], va#add_int 4, [])
663+
Ok (Some [], va#add_int 4, [])
647664
else if instr#is_delay_slot then
648-
(None, va, [])
665+
Ok (None, va, [])
649666
else if is_halt_instruction instr#get_opcode then
650-
(Some [], va, [])
667+
Ok (Some [], va, [])
651668
else if instr#is_inlined_call then
652669
let a = match instr#get_opcode with
653670
| BranchLTZeroLink (_,tgt)
@@ -677,44 +694,53 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
677694
[(make_location {loc_faddr = faddr; loc_iaddr = returnsite})#ci]
678695
| l -> List.map (fun s -> add_ctxt_to_ctxt_string faddr s ctxt) l in
679696
make_ctxt_mips_assembly_block ctxt b succ) fn#get_blocks in
680-
(Some [ callsucc ],va,inlinedblocks)
697+
Ok (Some [callsucc], va, inlinedblocks)
681698
else
682699
find_last_instr (nextva ()) va in
683700

684-
let (succ, lastaddr, inlinedblocks) =
701+
let result_r:
702+
(ctxt_iaddress_t list option
703+
* doubleword_int
704+
* mips_assembly_block_int list) TR.traceresult =
705+
(* let (succ, lastaddr, inlinedblocks) = *)
685706
let instr =
686707
fail_tvalue
687708
(trerror_record
688709
(LBLOCK [STR "find_last_instr: "; baddr#toPretty]))
689710
(get_instr baddr) in
690711
let opcode = instr#get_opcode in
691712
if is_return_instruction opcode then
692-
(Some [],baddr#add_int 4,[])
713+
Ok (Some [], baddr#add_int 4, [])
693714
else if system_info#is_nonreturning_call faddr baddr then
694-
(Some [], baddr#add_int 4, [])
715+
Ok (Some [], baddr#add_int 4, [])
695716
else if is_indirect_jump_instruction opcode then
696717
if system_info#has_jump_table_target faddr baddr then
697718
let (jt,_,lb,ub) = system_info#get_jump_table_target faddr baddr in
698719
let targets = jt#get_targets jt#get_start_address lb ub in
699-
(Some (mk_ci_succ targets), baddr#add_int 4, [])
720+
Ok (Some (mk_ci_succ targets), baddr#add_int 4, [])
700721
else
701-
(Some [], baddr#add_int 4, [])
722+
Ok (Some [], baddr#add_int 4, [])
702723
else if is_conditional_jump_instruction opcode then
703724
let nextblock = baddr#add_int 8 in
704725
let tgtblock = get_direct_jump_target_address opcode in
705-
(Some (mk_ci_succ [ nextblock ; tgtblock ]),baddr#add_int 4,[])
726+
Ok (Some (mk_ci_succ [nextblock; tgtblock]), baddr#add_int 4, [])
706727
else if is_direct_jump_instruction opcode then
707728
let tgtblock = get_direct_jump_target_address opcode in
708-
(Some (mk_ci_succ [ tgtblock ]),baddr#add_int 4,[])
729+
Ok (Some (mk_ci_succ [tgtblock ]), baddr#add_int 4, [])
709730
else
710731
find_last_instr (get_next_instr_addr baddr) baddr in
711732

712-
let successors =
713-
match succ with Some s -> s | _ -> get_successors faddr lastaddr in
714-
(inlinedblocks, make_mips_assembly_block faddr baddr lastaddr successors)
733+
TR.tmap
734+
(fun (succ, lastaddr, inlinedblocks) ->
735+
let successors =
736+
match succ with
737+
| Some s -> s
738+
| _ -> get_successors faddr lastaddr in
739+
(inlinedblocks, make_mips_assembly_block faddr baddr lastaddr successors))
740+
result_r
715741

716742

717-
let trace_function (faddr:doubleword_int) =
743+
let trace_function (faddr:doubleword_int): mips_assembly_function_int =
718744
let workSet = new DoublewordCollections.set_t in
719745
let doneSet = new DoublewordCollections.set_t in
720746
let set_block_entry (baddr: doubleword_int) =
@@ -726,17 +752,26 @@ let trace_function (faddr:doubleword_int) =
726752
let add_to_workset l =
727753
List.iter (fun a -> if doneSet#has a then () else workSet#add a) l in
728754
let blocks = ref [] in
729-
let rec add_block (entry:doubleword_int) =
730-
let (inlinedblocks,block) = trace_block faddr entry in
731-
let blocksuccessors = block#get_successors in
732-
begin
733-
set_block_entry entry ;
734-
workSet#remove entry ;
735-
doneSet#add entry ;
736-
blocks := (block :: inlinedblocks) @ !blocks ;
737-
add_to_workset (List.map get_iaddr blocksuccessors) ;
738-
match workSet#choose with Some a -> add_block a | _ -> ()
739-
end in
755+
let rec add_block (entry: doubleword_int) =
756+
let result_r: (mips_assembly_block_int list
757+
* mips_assembly_block_int) TR.traceresult =
758+
trace_block faddr entry in
759+
TR.titer
760+
~ok:(fun (inlinedblocks, block) ->
761+
let blocksuccessors = block#get_successors in
762+
begin
763+
set_block_entry entry;
764+
workSet#remove entry;
765+
doneSet#add entry;
766+
blocks := (block :: inlinedblocks) @ !blocks;
767+
add_to_workset (List.map get_iaddr blocksuccessors);
768+
match workSet#choose with Some a -> add_block a | _ -> ()
769+
end)
770+
~error:(fun e ->
771+
log_error_result
772+
~tag:"trace_function:add block" __FILE__ __LINE__
773+
(("faddr: " ^ faddr#to_hex_string) :: e))
774+
result_r in
740775
let _ = add_block faddr in
741776
let blocklist =
742777
List.sort (fun b1 b2 ->
@@ -750,9 +785,7 @@ let trace_function (faddr:doubleword_int) =
750785

751786
let construct_mips_assembly_function (_count: int) (faddr: doubleword_int) =
752787
try
753-
let _ = pverbose [STR " trace function "; faddr#toPretty; NL] in
754788
let fn = trace_function faddr in
755-
let _ = pverbose [STR " add function "; faddr#toPretty; NL] in
756789
mips_assembly_functions#add_function fn
757790
with
758791
| BCH_failure p ->
@@ -875,7 +908,6 @@ let record_call_targets () =
875908
(LBLOCK [STR "function "; faddr#toPretty; STR ": "; p]))
876909

877910

878-
879911
let decorate_functions () =
880912
begin
881913
record_call_targets ()

CodeHawk/CHB/bchlibmips32/bCHMIPSAssemblyFunction.ml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
Copyright (c) 2005-2020 Kestrel Technology LLC
88
Copyright (c) 2020 Henny Sipma
9-
Copyright (c) 2021-2024 Aarno Labs LLC
9+
Copyright (c) 2021-2025 Aarno Labs LLC
1010
1111
Permission is hereby granted, free of charge, to any person obtaining a copy
1212
of this software and associated documentation files (the "Software"), to deal
@@ -78,6 +78,7 @@ object (self)
7878
raise
7979
(BCH_failure
8080
(LBLOCK [
81+
STR __FILE__; STR ":"; INT __LINE__; STR ": ";
8182
STR "No assembly block found at ";
8283
STR bctxt;
8384
STR " in function ";
@@ -92,7 +93,12 @@ object (self)
9293
with
9394
| Not_found ->
9495
let msg =
95-
LBLOCK [STR "assembly_function#get_instruction: "; iaddr#toPretty] in
96+
LBLOCK [
97+
STR __FILE__; STR ":"; INT __LINE__; STR ": ";
98+
STR "assembly_function#get_instruction: ";
99+
iaddr#toPretty;
100+
STR " in function ";
101+
faddr#toPretty] in
96102
begin
97103
ch_error_log#add "invocation error" msg;
98104
raise (BCH_failure msg)

0 commit comments

Comments
 (0)