Skip to content

Commit

Permalink
Variable length instructions for single faults
Browse files Browse the repository at this point in the history
  • Loading branch information
berkayurun committed Mar 17, 2024
1 parent 5f03011 commit c11a32a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
3 changes: 0 additions & 3 deletions controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,6 @@ def build_fault_list(conf_list, combined_faults, ret_faults):
for tcounter in build_ranges(faultdev["trigger_counter"]):
for numbytes in build_ranges(faultdev["num_bytes"]):
if isinstance(fmask, dict):
assert (
wildcard_fault
), "only wildcard faults can be evaluated, if fault.mask is a dict"
assert ftype == detect_type(
"instruction"
), "fault.type has to be 'instruction', if fault.mask is a dict"
Expand Down
42 changes: 42 additions & 0 deletions goldenrun.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ def run_goldenrun(
tbexec = pd.DataFrame(experiment["data"]["tbexec"])
tbinfo = pd.DataFrame(experiment["data"]["tbinfo"])
process_wildcard_faults(faultconfig, tbexec, tbinfo)
process_single_faults(faultconfig, tbexec, tbinfo)
calculate_trigger_addresses(faultconfig, tbexec, tbinfo)
faultconfig = checktriggers_in_tb(faultconfig, experiment["data"])

Expand Down Expand Up @@ -418,3 +419,44 @@ def process_wildcard_faults(faultconfig, tbexec, tbinfo):
new_fault_entry["faultlist"] = [wildcard_faults[i]]
new_fault_entry["delete"] = False
faultconfig.append(new_fault_entry)


def process_single_faults(faultconfig, tbexec, tbinfo):
remove_list = []
for faultentry in faultconfig:
for fault in faultentry["faultlist"]:
if not isinstance(fault.mask, dict):
continue

tbinfo_tb_indexed = tbinfo.set_index("id")
for tb in tqdm(tbexec["tb"], leave=False):
tb_info_asm = tbinfo_tb_indexed.at[tb, "assembler"]
tb_info_total_size = tbinfo_tb_indexed.at[tb, "size"]

tb_info_asm = [
int(instr.split("]")[0], 16)
for instr in tb_info_asm.split("[ ")[1:]
]
tb_info_size = list(numpy.diff(tb_info_asm))
tb_info_size.append(
tb_info_total_size - sum(tb_info_size)
) # calculate the last instr size

if fault.address not in tb_info_asm:
continue

fault_idx = tb_info_asm.index(fault.address)

try:
fault.mask = fault.mask[str(tb_info_size[fault_idx])]
fault.num_bytes = tb_info_size[fault_idx]
except (ValueError, KeyError):
logger.info(f"No matching fault mask could be found for fault entry {faultentry['index']}, "
f"removing the fault entry...")
remove_list.append(faultentry)

break

for faultentry in remove_list:
faultconfig.remove(faultentry)

0 comments on commit c11a32a

Please sign in to comment.