All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@gmail.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: QEMU <qemu-devel@nongnu.org>, Igor Mammedov <imammedo@redhat.com>,
	Dave Anderson <anderson@redhat.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 6/7] scripts/dump-guest-memory.py: add vmcoreinfo
Date: Wed, 5 Jul 2017 11:58:33 +0200	[thread overview]
Message-ID: <CAJ+F1CJvcwE0ed9ui8Z09ia5h29BXVEjQ7vbiJhSjkR09Kn7DA@mail.gmail.com> (raw)
In-Reply-To: <bbc74cf4-4d61-8ad3-7a33-0e6c49490892@redhat.com>

Hi

On Wed, Jul 5, 2017 at 2:22 AM, Laszlo Ersek <lersek@redhat.com> wrote:
> On 06/29/17 15:23, Marc-André Lureau wrote:
>> Add vmcoreinfo ELF note if vmcoreinfo device is ready.
>>
>> To help the python script, add a little global vmcoreinfo_gdb
>> structure, that is populated with vmcoreinfo_gdb_update().
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> ---
>>  scripts/dump-guest-memory.py | 32 ++++++++++++++++++++++++++++++++
>>  include/hw/acpi/vmcoreinfo.h |  1 +
>>  hw/acpi/vmcoreinfo.c         | 16 ++++++++++++++++
>>  3 files changed, 49 insertions(+)
>>
>> diff --git a/scripts/dump-guest-memory.py b/scripts/dump-guest-memory.py
>> index f7c6635f15..16c3d7cb10 100644
>> --- a/scripts/dump-guest-memory.py
>> +++ b/scripts/dump-guest-memory.py
>> @@ -120,6 +120,20 @@ class ELF(object):
>>          self.segments[0].p_filesz += ctypes.sizeof(note)
>>          self.segments[0].p_memsz += ctypes.sizeof(note)
>>
>> +
>> +    def add_vmcoreinfo_note(self, vmcoreinfo):
>> +        """Adds a vmcoreinfo note to the ELF dump."""
>> +        chead = type(get_arch_note(self.endianness, 0, 0))
>> +        header = chead.from_buffer_copy(vmcoreinfo[0:ctypes.sizeof(chead)])
>> +        note = get_arch_note(self.endianness,
>> +                             header.n_namesz - 1, header.n_descsz)
>> +        ctypes.memmove(ctypes.pointer(note), vmcoreinfo, ctypes.sizeof(note))
>> +        header_size = ctypes.sizeof(note) - header.n_descsz
>> +
>> +        self.notes.append(note)
>> +        self.segments[0].p_filesz += ctypes.sizeof(note)
>> +        self.segments[0].p_memsz += ctypes.sizeof(note)
>> +
>>      def add_segment(self, p_type, p_paddr, p_size):
>>          """Adds a segment to the elf."""
>>
>> @@ -505,6 +519,23 @@ shape and this command should mostly work."""
>>                  cur += chunk_size
>>                  left -= chunk_size
>>
>> +    def add_vmcoreinfo(self):
>> +        qemu_core = gdb.inferiors()[0]
>> +
>> +        gdb.execute("call vmcoreinfo_gdb_update()")
>
> I think it's a bad idea to call a function from a process that's just
> crashed.

Yeah, if qemu crashed you can't use that script. But we are talking
about dump of guest kernel, so qemu didn't crash :)

>
> If this feature is so important, maybe we can simply set a global
> pointer variable at the end of vmcoreinfo_realize(); something like:
>
> static void vmcoreinfo_realize(DeviceState *dev, Error **errp)
> {
>     static VmcoreinfoState * volatile vmcoreinfo_gdb_helper;
>     [...]
>     vmcoreinfo_gdb_helper = VMCOREINFO(dev);
> }
>
> - vmcoreinfo_gdb_helper has function scope, so no other code can abuse
>   it
> - it has static storage duration so gdb can access it at any time
> - the pointer (not the pointed-to object) is qualified volatile, so gcc
>   cannot optimize out the pointer assignment (which it might be tempted
>   to do otherwise, due to the pointer never being read within QEMU)
>
> Then you can use "vmcoreinfo_gdb_helper->vmcoreinfo_addr_le" to
> implement all the logic in "dump-guest-memory.py".

If necessary, I can try that.

>
> Just my two cents, of course.
>
> Thanks
> Laszlo
>
>> +        avail = gdb.parse_and_eval("vmcoreinfo_gdb.available")
>> +        if not avail:
>> +            return;
>> +
>> +        addr = gdb.parse_and_eval("vmcoreinfo_gdb.paddr")
>> +        size = gdb.parse_and_eval("vmcoreinfo_gdb.size")
>> +        for block in self.guest_phys_blocks:
>> +            if block["target_start"] <= addr < block["target_end"]:
>> +                haddr = block["host_addr"] + (addr - block["target_start"])
>> +                vmcoreinfo = qemu_core.read_memory(haddr, size)
>> +                self.elf.add_vmcoreinfo_note(vmcoreinfo.tobytes())
>> +                return
>> +
>>      def invoke(self, args, from_tty):
>>          """Handles command invocation from gdb."""
>>
>> @@ -518,6 +549,7 @@ shape and this command should mostly work."""
>>
>>          self.elf = ELF(argv[1])
>>          self.guest_phys_blocks = get_guest_phys_blocks()
>> +        self.add_vmcoreinfo()
>>
>>          with open(argv[0], "wb") as vmcore:
>>              self.dump_init(vmcore)
>> diff --git a/include/hw/acpi/vmcoreinfo.h b/include/hw/acpi/vmcoreinfo.h
>> index 40fe99c3ed..4efa678237 100644
>> --- a/include/hw/acpi/vmcoreinfo.h
>> +++ b/include/hw/acpi/vmcoreinfo.h
>> @@ -32,5 +32,6 @@ void vmcoreinfo_build_acpi(VmcoreinfoState *vis, GArray *table_data,
>>  void vmcoreinfo_add_fw_cfg(VmcoreinfoState *vis, FWCfgState *s, GArray *vmci);
>>  bool vmcoreinfo_get(VmcoreinfoState *vis, uint64_t *paddr, uint64_t *size,
>>                      Error **errp);
>> +void vmcoreinfo_gdb_update(void);
>>
>>  #endif
>> diff --git a/hw/acpi/vmcoreinfo.c b/hw/acpi/vmcoreinfo.c
>> index 216e0bb83a..75e3330813 100644
>> --- a/hw/acpi/vmcoreinfo.c
>> +++ b/hw/acpi/vmcoreinfo.c
>> @@ -145,6 +145,22 @@ bool vmcoreinfo_get(VmcoreinfoState *vis,
>>      return true;
>>  }
>>
>> +struct vmcoreinfo_gdb {
>> +    bool available;
>> +    uint64_t paddr;
>> +    uint64_t size;
>> +} vmcoreinfo_gdb;
>> +
>> +void vmcoreinfo_gdb_update(void)
>> +{
>> +    Object *vmci = find_vmcoreinfo_dev();
>> +
>> +    vmcoreinfo_gdb.available = vmci ?
>> +        vmcoreinfo_get(VMCOREINFO(vmci),
>> +                       &vmcoreinfo_gdb.paddr, &vmcoreinfo_gdb.size, NULL)
>> +        : false;
>> +}
>> +
>>  static const VMStateDescription vmstate_vmcoreinfo = {
>>      .name = "vmcoreinfo",
>>      .version_id = 1,
>>
>
>



-- 
Marc-André Lureau

  reply	other threads:[~2017-07-05  9:58 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-29 13:23 [Qemu-devel] [PATCH 0/7] KASLR kernel dump support Marc-André Lureau
2017-06-29 13:23 ` [Qemu-devel] [PATCH 1/7] vmgenid: replace x-write-pointer-available hack Marc-André Lureau
2017-06-29 14:11   ` Michael S. Tsirkin
2017-07-02  3:09   ` Ben Warren
2017-07-03 14:48   ` Eduardo Habkost
2017-07-03 18:06   ` Laszlo Ersek
2017-07-03 18:27     ` Eduardo Habkost
2017-07-03 18:35       ` Laszlo Ersek
2017-07-03 18:21   ` Michael S. Tsirkin
2017-07-03 18:38   ` Michael S. Tsirkin
2017-07-03 18:50     ` Eduardo Habkost
2017-07-03 19:51       ` Michael S. Tsirkin
2017-06-29 13:23 ` [Qemu-devel] [PATCH 2/7] acpi: add vmcoreinfo device Marc-André Lureau
2017-07-04 22:07   ` Laszlo Ersek
2017-07-05 13:54     ` Marc-André Lureau
2017-06-29 13:23 ` [Qemu-devel] [PATCH 3/7] tests: add simple vmcoreinfo test Marc-André Lureau
2017-06-29 13:23 ` [Qemu-devel] [PATCH 4/7] dump: add vmcoreinfo ELF note Marc-André Lureau
2017-07-04 23:48   ` Laszlo Ersek
2017-07-05 21:52     ` Marc-André Lureau
2017-07-06 10:29       ` Laszlo Ersek
2017-06-29 13:23 ` [Qemu-devel] [PATCH 5/7] kdump: " Marc-André Lureau
2017-07-05  0:07   ` Laszlo Ersek
2017-07-06 10:05     ` Marc-André Lureau
2017-06-29 13:23 ` [Qemu-devel] [PATCH 6/7] scripts/dump-guest-memory.py: add vmcoreinfo Marc-André Lureau
2017-07-05  0:22   ` Laszlo Ersek
2017-07-05  9:58     ` Marc-André Lureau [this message]
2017-07-05 11:05       ` Laszlo Ersek
2017-06-29 13:23 ` [Qemu-devel] [PATCH 7/7] MAINTAINERS: add Dump maintainers Marc-André Lureau
2017-07-05  0:26   ` Laszlo Ersek
2017-07-06  9:54     ` Marc-André Lureau
2017-07-06 10:17       ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAJ+F1CJvcwE0ed9ui8Z09ia5h29BXVEjQ7vbiJhSjkR09Kn7DA@mail.gmail.com \
    --to=marcandre.lureau@gmail.com \
    --cc=anderson@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=lersek@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.