diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-11-25 16:37:20 +0000 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-11-25 16:37:20 +0000 |
| commit | d4bef7c39abfed385e472bc8e14bc459ce6ea982 (patch) | |
| tree | 04f5aba9b79abc18f23a3561b5652747d1701cf3 /src | |
| parent | ede3d0c1b980f8527a45ae5b513bbcc3099818e2 (diff) | |
| download | focaccia-d4bef7c39abfed385e472bc8e14bc459ce6ea982.tar.gz focaccia-d4bef7c39abfed385e472bc8e14bc459ce6ea982.zip | |
Improve QEMU trace collection performance
Diffstat (limited to 'src')
| -rw-r--r-- | src/focaccia/qemu/_qemu_tool.py | 5 | ||||
| -rw-r--r-- | src/focaccia/qemu/target.py | 3 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/focaccia/qemu/_qemu_tool.py b/src/focaccia/qemu/_qemu_tool.py index 984de08..5a59e15 100644 --- a/src/focaccia/qemu/_qemu_tool.py +++ b/src/focaccia/qemu/_qemu_tool.py @@ -164,6 +164,7 @@ def collect_conc_trace(gdb: GDBServerStateIterator, strace: Trace) \ # An online trace matching algorithm. info(f'Tracing QEMU between {hex(start_addr)}:{hex(strace.env.stop_address) if strace.env.stop_address else "end"}') + traced_address_set = frozenset(strace.addresses) transform: Optional[SymbolicTransform] = None while True: @@ -181,7 +182,9 @@ def collect_conc_trace(gdb: GDBServerStateIterator, strace: Trace) \ while pc != transform.addr: warn(f'PC {hex(pc)} does not match next symbolic reference {hex(transform.addr)}') - next_i = find_index(strace.addresses[symb_i:], pc) + next_i = None + if pc in traced_address_set: + next_i = find_index(strace.addresses[symb_i:], pc) # Drop the concrete state if no address in the symbolic trace # matches diff --git a/src/focaccia/qemu/target.py b/src/focaccia/qemu/target.py index f324cdf..28fe805 100644 --- a/src/focaccia/qemu/target.py +++ b/src/focaccia/qemu/target.py @@ -279,7 +279,8 @@ class GDBServerStateIterator(GDBServerConnector): for mem in post_event.mem_writes: addr, data = mem.address, mem.data - for reg, value in post_event.registers.items(): + for reg in syscall.patchup_address_registers: + value = post_event.registers[reg] if value == addr: addr = next_state.read_register(reg) break |