40 lines
1.0 KiB
Python
40 lines
1.0 KiB
Python
|
|
from QMP import QEMUMonitorProtocol
|
||
|
|
import re
|
||
|
|
|
||
|
|
|
||
|
|
class QConn:
|
||
|
|
def __init__(self, path):
|
||
|
|
self.qconn = QEMUMonitorProtocol(path)
|
||
|
|
self.qconn.connect()
|
||
|
|
self.runs = True
|
||
|
|
self.regs_cache = ""
|
||
|
|
|
||
|
|
def drop_cache(self):
|
||
|
|
self.regs_cache = ""
|
||
|
|
|
||
|
|
def stop(self):
|
||
|
|
self.human_cmd("stop")
|
||
|
|
self.runs = False
|
||
|
|
self.drop_cache()
|
||
|
|
|
||
|
|
def cont(self):
|
||
|
|
self.human_cmd("cont")
|
||
|
|
self.runs = True
|
||
|
|
|
||
|
|
def gpreg(self, name):
|
||
|
|
if self.runs or self.regs_cache == "":
|
||
|
|
self.regs_cache, err = self.human_cmd("info registers")
|
||
|
|
name = name.upper()
|
||
|
|
fd = re.search("{}=([\w]+)".format(name), self.regs_cache)
|
||
|
|
if fd is None:
|
||
|
|
return ""
|
||
|
|
return fd.group(1)
|
||
|
|
|
||
|
|
def human_cmd(self, line):
|
||
|
|
args = {}
|
||
|
|
args["command-line"] = line
|
||
|
|
resp = self.qconn.cmd("human-monitor-command", args)
|
||
|
|
if "error" in resp:
|
||
|
|
return (resp["error"]["desc"], 1)
|
||
|
|
return (resp["return"], 0)
|