about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/focaccia/tools/qemu/_qemu_tool.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/focaccia/tools/qemu/_qemu_tool.py b/src/focaccia/tools/qemu/_qemu_tool.py
index 3aa6c73..6735d9e 100644
--- a/src/focaccia/tools/qemu/_qemu_tool.py
+++ b/src/focaccia/tools/qemu/_qemu_tool.py
@@ -225,11 +225,34 @@ class GDBServerStateIterator:
         gdb.execute(f'set $pc = {hex(new_pc)}')
 
     def run_until(self, addr: int) -> GDBProgramState:
+        """Continues emulator execution until specified address reached.
+
+        :param addr: The address to stop at.
+        :returns: The emulator state at that point.
+        """
         breakpoint = gdb.Breakpoint(f'*{addr:#x}')
         gdb.execute('continue')
         breakpoint.delete()
         return GDBProgramState(self._process, gdb.selected_frame(), self.arch)
 
+    def run_until_any(self, addresses: Iterable) -> GDBProgramState:
+        """Continues emulator execution until any of the specified addresses are reached.
+
+        :param addresses: The addresses to stop at.
+        :returns: The emulator state at that point.
+        """
+        breakpoints = []
+
+        for addr in addresses:
+            breakpoints.append(gdb.Breakpoint(f'*{addr:#x}'))
+
+        gdb.execute('continue')
+
+        for br in breakpoints:
+            br.delete()
+
+        return GDBProgramState(self._process, gdb.selected_frame(), self.arch)
+
     def exited(self) -> bool:
         return not self._process.is_valid() or len(self._process.threads()) == 0