X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/c3b1642b9b6b3ba4314d6be3be509d396372cfd5..bc7f3b0b0d33fb58272a98c862dc9a1fa913fcd3:/scripts/dump-guest-memory.py diff --git a/scripts/dump-guest-memory.py b/scripts/dump-guest-memory.py index 09bec92b50..9371e45813 100644 --- a/scripts/dump-guest-memory.py +++ b/scripts/dump-guest-memory.py @@ -12,11 +12,17 @@ Authors: This work is licensed under the terms of the GNU GPL, version 2 or later. See the COPYING file in the top-level directory. """ +from __future__ import print_function import ctypes import struct -UINTPTR_T = gdb.lookup_type("uintptr_t") +try: + UINTPTR_T = gdb.lookup_type("uintptr_t") +except Exception as inst: + raise gdb.GdbError("Symbols must be loaded prior to sourcing dump-guest-memory.\n" + "Symbols may be loaded by 'attach'ing a QEMU process id or by " + "'load'ing a QEMU binary.") TARGET_PAGE_SIZE = 0x1000 TARGET_PAGE_MASK = 0xFFFFFFFFFFFFF000 @@ -157,13 +163,14 @@ class ELF(object): phdr = get_arch_phdr(self.endianness, self.elfclass) phdr.p_type = p_type phdr.p_paddr = p_paddr + phdr.p_vaddr = p_paddr phdr.p_filesz = p_size phdr.p_memsz = p_size self.segments.append(phdr) self.ehdr.e_phnum += 1 def to_file(self, elf_file): - """Writes all ELF structures to the the passed file. + """Writes all ELF structures to the passed file. Structure: Ehdr @@ -411,7 +418,9 @@ def get_guest_phys_blocks(): memory_region = flat_range["mr"].dereference() # we only care about RAM - if not memory_region["ram"]: + if (not memory_region["ram"] or + memory_region["ram_device"] or + memory_region["nonvolatile"]): continue section_size = int128_get64(flat_range["addr"]["size"]) @@ -546,6 +555,8 @@ shape and this command should mostly work.""" return None def add_vmcoreinfo(self): + if gdb.lookup_symbol("vmcoreinfo_realize")[0] is None: + return vmci = 'vmcoreinfo_realize::vmcoreinfo_state' if not gdb.parse_and_eval("%s" % vmci) \ or not gdb.parse_and_eval("(%s)->has_vmcoreinfo" % vmci): @@ -564,7 +575,7 @@ shape and this command should mostly work.""" vmcoreinfo = self.phys_memory_read(addr, size) if vmcoreinfo: - self.elf.add_vmcoreinfo_note(vmcoreinfo.tobytes()) + self.elf.add_vmcoreinfo_note(bytes(vmcoreinfo)) def invoke(self, args, from_tty): """Handles command invocation from gdb."""