diff options
Diffstat (limited to 'scripts/gdb/linux/utils.py')
| -rw-r--r-- | scripts/gdb/linux/utils.py | 35 | 
1 files changed, 35 insertions, 0 deletions
| diff --git a/scripts/gdb/linux/utils.py b/scripts/gdb/linux/utils.py index 245ab297ea84..03ebdccf5f69 100644 --- a/scripts/gdb/linux/utils.py +++ b/scripts/gdb/linux/utils.py @@ -11,6 +11,11 @@  # This work is licensed under the terms of the GNU GPL version 2.  # +import contextlib +import dataclasses +import re +import typing +  import gdb @@ -216,3 +221,33 @@ def gdb_eval_or_none(expresssion):          return gdb.parse_and_eval(expresssion)      except gdb.error:          return None + + +@contextlib.contextmanager +def qemu_phy_mem_mode(): +    connection = gdb.selected_inferior().connection +    orig = connection.send_packet("qqemu.PhyMemMode") +    if orig not in b"01": +        raise gdb.error("Unexpected qemu.PhyMemMode") +    orig = orig.decode() +    if connection.send_packet("Qqemu.PhyMemMode:1") != b"OK": +        raise gdb.error("Failed to set qemu.PhyMemMode") +    try: +        yield +    finally: +        if connection.send_packet("Qqemu.PhyMemMode:" + orig) != b"OK": +            raise gdb.error("Failed to restore qemu.PhyMemMode") + + +@dataclasses.dataclass +class VmCore: +    kerneloffset: typing.Optional[int] + + +def parse_vmcore(s): +    match = re.search(r"KERNELOFFSET=([0-9a-f]+)", s) +    if match is None: +        kerneloffset = None +    else: +        kerneloffset = int(match.group(1), 16) +    return VmCore(kerneloffset=kerneloffset) | 
