about summary refs log tree commit diff stats
path: root/lldb_target.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lldb_target.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/lldb_target.py b/lldb_target.py
index 1ff9f53..93efb7d 100644
--- a/lldb_target.py
+++ b/lldb_target.py
@@ -72,14 +72,22 @@ class LLDBConcreteTarget(ConcreteTarget):
         self.debugger.Terminate()
         print(f'Program exited with status {self.process.GetState()}')
 
-    def read_register(self, regname: str) -> int:
+    def _get_register(self, regname: str) -> lldb.SBValue:
+        """Find a register by name.
+
+        :raise SimConcreteRegisterError: If no register with the specified name
+                                         can be found.
+        """
         frame = self.process.GetThreadAtIndex(0).GetFrameAtIndex(0)
         reg = frame.FindRegister(regname)
         if reg is None:
             raise SimConcreteRegisterError(
-                f'[In LLDBConcreteTarget.read_register]: Register {regname}'
+                f'[In LLDBConcreteTarget._get_register]: Register {regname}'
                 f' not found.')
+        return reg
 
+    def read_register(self, regname: str) -> int:
+        reg = self._get_register(regname)
         val = reg.GetValue()
         if val is None:
             raise SimConcreteRegisterError(
@@ -88,6 +96,15 @@ class LLDBConcreteTarget(ConcreteTarget):
 
         return int(val, 16)
 
+    def write_register(self, regname: str, value: int):
+        reg = self._get_register(regname)
+        error = lldb.SBError()
+        reg.SetValueFromCString(hex(value), error)
+        if not error.success:
+            raise SimConcreteRegisterError(
+                f'[In LLDBConcreteTarget.write_register]: Unable to set'
+                f' {regname} to value {hex(value)}!')
+
     def read_memory(self, addr, size):
         err = lldb.SBError()
         content = self.process.ReadMemory(addr, size, err)