diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-10-21 11:55:41 +0200 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-10-23 09:50:52 +0200 |
| commit | caecb1c385766ee0cf790d8ad6b657a94220761c (patch) | |
| tree | 0f669d7935ce78a5b074020d2879ec7cbe33c138 | |
| parent | 98e576f08212d89598494cb105f5b79315025332 (diff) | |
| download | focaccia-caecb1c385766ee0cf790d8ad6b657a94220761c.tar.gz focaccia-caecb1c385766ee0cf790d8ad6b657a94220761c.zip | |
Add Box64 parser
| -rwxr-xr-x | src/focaccia/cli.py | 1 | ||||
| -rw-r--r-- | src/focaccia/parser.py | 31 |
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()) |