about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorChristian Krinitsin <mail@krinitsin.com>2025-10-21 11:55:41 +0200
committerChristian Krinitsin <mail@krinitsin.com>2025-10-23 09:50:52 +0200
commitcaecb1c385766ee0cf790d8ad6b657a94220761c (patch)
tree0f669d7935ce78a5b074020d2879ec7cbe33c138
parent98e576f08212d89598494cb105f5b79315025332 (diff)
downloadfocaccia-caecb1c385766ee0cf790d8ad6b657a94220761c.tar.gz
focaccia-caecb1c385766ee0cf790d8ad6b657a94220761c.zip
Add Box64 parser
-rwxr-xr-xsrc/focaccia/cli.py1
-rw-r--r--src/focaccia/parser.py31
2 files changed, 32 insertions, 0 deletions
diff --git a/src/focaccia/cli.py b/src/focaccia/cli.py
index f0c6efe..88c6313 100755
--- a/src/focaccia/cli.py
+++ b/src/focaccia/cli.py
@@ -26,6 +26,7 @@ concrete_trace_parsers = {
     'focaccia': lambda f, _: parser.parse_snapshots(f),
     'qemu':     parser.parse_qemu,
     'arancini': parser.parse_arancini,
+    'box64': parser.parse_box64,
 }
 
 _MatchingAlgorithm = Callable[
diff --git a/src/focaccia/parser.py b/src/focaccia/parser.py
index 0963b3e..e9e5e0c 100644
--- a/src/focaccia/parser.py
+++ b/src/focaccia/parser.py
@@ -170,3 +170,34 @@ def parse_arancini(stream: TextIO, arch: Arch) -> Trace[ProgramState]:
                 states[-1].set_register(regname, int(value, 16))
 
     return Trace(states, _make_unknown_env())
+
+def parse_box64(stream: TextIO, arch: Arch) -> Trace[ProgramState]:
+    def parse_box64_flags(state: ProgramState, flags_dump: str):
+        flags = ['O', 'D', 'S', 'Z', 'A', 'P', 'C']
+        for i, flag in enumerate(flags):
+            if flag == flags_dump[i]: # Flag is set
+                state.set_register(arch.to_regname(flag + 'F'), 1)
+            elif '-' == flags_dump[i]: # Flag is not set
+                state.set_register(arch.to_regname(flag + 'F'), 0)
+
+    trace_string = stream.read()
+
+    blocks = re.split(r'(?=\nES=)', trace_string.strip())[1:]
+    blocks = [block.strip() for block in blocks if block.strip()]
+
+    states = []
+    pattern = r'([A-Z0-9]{2,3}|flags|FLAGS)=([0-9a-fxODSZAPC?\-]+)'
+    for block in blocks:
+        states.append(ProgramState(arch))
+        matches = re.findall(pattern, block)
+
+        for regname, value in matches:
+            if regname.lower() == "flags":
+                parse_box64_flags(states[-1], value)
+                continue
+
+            regname = arch.to_regname(regname)
+            if regname is not None:
+                states[-1].set_register(regname, int(value, 16))
+
+    return Trace(states, _make_unknown_env())