From nobody Fri Apr 19 02:49:59 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496322683869638.6230352292234; Thu, 1 Jun 2017 06:11:23 -0700 (PDT) Received: from localhost ([::1]:44303 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPsl-0003p1-Ex for importer@patchew.org; Thu, 01 Jun 2017 09:11:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38389) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPlQ-00060N-Mc for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGPlM-0004EH-Ue for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45138) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGPlM-0004E2-OQ for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:40 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C299F8047B; Thu, 1 Jun 2017 13:03:39 +0000 (UTC) Received: from localhost (ovpn-112-37.ams2.redhat.com [10.36.112.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8871A87E42; Thu, 1 Jun 2017 13:03:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C299F8047B Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=marcandre.lureau@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com C299F8047B From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 1 Jun 2017 17:03:22 +0400 Message-Id: <20170601130325.6433-2-marcandre.lureau@redhat.com> In-Reply-To: <20170601130325.6433-1-marcandre.lureau@redhat.com> References: <20170601130325.6433-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 01 Jun 2017 13:03:39 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 1/4] dump: add DumpInfo structure X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: anderson@redhat.com, qiaonuohan@cn.fujitsu.com, lersek@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" One way or another, the guest could communicate various dump info (via guest agent or vmcoreinfo device) and populate that structure. It can then be used to augment the dump with various details, as done in the following patch. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/sysemu/dump-info.h | 18 ++++++++++++++++++ dump.c | 3 +++ 2 files changed, 21 insertions(+) create mode 100644 include/sysemu/dump-info.h diff --git a/include/sysemu/dump-info.h b/include/sysemu/dump-info.h new file mode 100644 index 0000000000..d2378e15e2 --- /dev/null +++ b/include/sysemu/dump-info.h @@ -0,0 +1,18 @@ +#ifndef DUMP_INFO_H +#define DUMP_INFO_H + +typedef struct DumpInfo { + bool received; + /* kernel base address */ + bool has_phys_base; + uint64_t phys_base; + /* "_text" symbol location */ + bool has_text; + uint64_t text; + /* the content of /sys/kernel/vmcoreinfo on Linux */ + char *vmcoreinfo; +} DumpInfo; + +extern DumpInfo dump_info; + +#endif /* DUMP_INFO_H */ diff --git a/dump.c b/dump.c index d9090a24cc..bdf3270f02 100644 --- a/dump.c +++ b/dump.c @@ -20,6 +20,7 @@ #include "monitor/monitor.h" #include "sysemu/kvm.h" #include "sysemu/dump.h" +#include "sysemu/dump-info.h" #include "sysemu/sysemu.h" #include "sysemu/memory_mapping.h" #include "sysemu/cpus.h" @@ -38,6 +39,8 @@ #define ELF_MACHINE_UNAME "Unknown" #endif =20 +DumpInfo dump_info =3D { 0, }; + uint16_t cpu_to_dump16(DumpState *s, uint16_t val) { if (s->dump_info.d_endian =3D=3D ELFDATA2LSB) { --=20 2.13.0.91.g00982b8dd From nobody Fri Apr 19 02:49:59 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496322900291747.3799668613383; Thu, 1 Jun 2017 06:15:00 -0700 (PDT) Received: from localhost ([::1]:44323 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPwH-000744-Nh for importer@patchew.org; Thu, 01 Jun 2017 09:14:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38419) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPlb-00068D-HU for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGPlV-0004Gz-7X for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:2388) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGPlU-0004Gp-Vt for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:49 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 05F67C059735; Thu, 1 Jun 2017 13:03:48 +0000 (UTC) Received: from localhost (ovpn-112-37.ams2.redhat.com [10.36.112.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id C614517533; Thu, 1 Jun 2017 13:03:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 05F67C059735 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=marcandre.lureau@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 05F67C059735 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 1 Jun 2017 17:03:23 +0400 Message-Id: <20170601130325.6433-3-marcandre.lureau@redhat.com> In-Reply-To: <20170601130325.6433-1-marcandre.lureau@redhat.com> References: <20170601130325.6433-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 01 Jun 2017 13:03:48 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 2/4] dump: add vmcoreinfo ELF note X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: anderson@redhat.com, qiaonuohan@cn.fujitsu.com, lersek@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Read vmcoreinfo note from guest memory when dump_info provides the address, and write it as an ELF note in the dump. NUMBER(phys_base) in vmcoreinfo has only been recently introduced in Linux 4.10 ("kexec: export the value of phys_base instead of symbol address"). To accomadate for older kernels, modify the vmcoreinfo to add the new fields and help newer crash that will use it. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/sysemu/dump.h | 2 + dump.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 135 insertions(+) diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index 2672a15f8b..b8a7a1e41d 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -192,6 +192,8 @@ typedef struct DumpState { * this could be used to calculate * how much work we have * finished. */ + uint8_t *vmcoreinfo; + size_t vmcoreinfo_size; } DumpState; =20 uint16_t cpu_to_dump16(DumpState *s, uint16_t val); diff --git a/dump.c b/dump.c index bdf3270f02..6911ffad8b 100644 --- a/dump.c +++ b/dump.c @@ -27,6 +27,7 @@ #include "qapi/qmp/qerror.h" #include "qmp-commands.h" #include "qapi-event.h" +#include "qemu/error-report.h" =20 #include #ifdef CONFIG_LZO @@ -88,6 +89,8 @@ static int dump_cleanup(DumpState *s) qemu_mutex_unlock_iothread(); } } + g_free(s->vmcoreinfo); + s->vmcoreinfo =3D NULL; =20 return 0; } @@ -238,6 +241,19 @@ static inline int cpu_index(CPUState *cpu) return cpu->cpu_index + 1; } =20 +static void write_vmcoreinfo_note(WriteCoreDumpFunction f, DumpState *s, + Error **errp) +{ + int ret; + + if (s->vmcoreinfo) { + ret =3D f(s->vmcoreinfo, s->vmcoreinfo_size, s); + if (ret < 0) { + error_setg(errp, "dump: failed to write vmcoreinfo"); + } + } +} + static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s, Error **errp) { @@ -261,6 +277,8 @@ static void write_elf64_notes(WriteCoreDumpFunction f, = DumpState *s, return; } } + + write_vmcoreinfo_note(f, s, errp); } =20 static void write_elf32_note(DumpState *s, Error **errp) @@ -306,6 +324,8 @@ static void write_elf32_notes(WriteCoreDumpFunction f, = DumpState *s, return; } } + + write_vmcoreinfo_note(f, s, errp); } =20 static void write_elf_section(DumpState *s, int type, Error **errp) @@ -717,6 +737,50 @@ static int buf_write_note(const void *buf, size_t size= , void *opaque) return 0; } =20 +static void get_note_sizes(DumpState *s, const void *note, + uint64_t *note_head_size, + uint64_t *name_size, + uint64_t *desc_size) +{ + uint64_t note_head_sz; + uint64_t name_sz; + uint64_t desc_sz; + + if (s->dump_info.d_class =3D=3D ELFCLASS64) { + const Elf64_Nhdr *hdr =3D note; + note_head_sz =3D sizeof(Elf64_Nhdr); + name_sz =3D hdr->n_namesz; + desc_sz =3D hdr->n_descsz; + } else { + const Elf32_Nhdr *hdr =3D note; + note_head_sz =3D sizeof(Elf32_Nhdr); + name_sz =3D hdr->n_namesz; + desc_sz =3D hdr->n_descsz; + } + + if (note_head_size) { + *note_head_size =3D note_head_sz; + } + if (name_size) { + *name_size =3D name_sz; + } + if (desc_size) { + *desc_size =3D desc_sz; + } +} + +static void set_note_desc_size(DumpState *s, void *note, + uint64_t desc_size) +{ + if (s->dump_info.d_class =3D=3D ELFCLASS64) { + Elf64_Nhdr *hdr =3D note; + hdr->n_descsz =3D desc_size; + } else { + Elf32_Nhdr *hdr =3D note; + hdr->n_descsz =3D desc_size; + } +} + /* write common header, sub header and elf note to vmcore */ static void create_header32(DumpState *s, Error **errp) { @@ -1491,6 +1555,42 @@ static int64_t dump_calculate_size(DumpState *s) return total; } =20 +static void vmcoreinfo_add_phys_base(DumpState *s) +{ + uint64_t size, note_head_size, name_size; + char **lines, *physbase =3D NULL; + uint8_t *newvmci, *vmci; + size_t i; + + get_note_sizes(s, s->vmcoreinfo, ¬e_head_size, &name_size, &size); + note_head_size =3D ((note_head_size + 3) / 4) * 4; + name_size =3D ((name_size + 3) / 4) * 4; + vmci =3D s->vmcoreinfo + note_head_size + name_size; + *(vmci + size) =3D '\0'; + lines =3D g_strsplit((char *)vmci, "\n", -1); + for (i =3D 0; lines[i]; i++) { + if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=3D")) { + goto end; + } + } + + physbase =3D g_strdup_printf("\nNUMBER(phys_base)=3D%ld", + s->dump_info.phys_base); + s->vmcoreinfo_size =3D + ((note_head_size + name_size + size + strlen(physbase) + 3) / 4) *= 4; + + newvmci =3D g_malloc(s->vmcoreinfo_size); + memcpy(newvmci, s->vmcoreinfo, note_head_size + name_size + size - 1); + memcpy(newvmci + note_head_size + name_size + size - 1, physbase, + strlen(physbase) + 1); + g_free(s->vmcoreinfo); + s->vmcoreinfo =3D newvmci; + set_note_desc_size(s, s->vmcoreinfo, size + strlen(physbase)); + +end: + g_strfreev(lines); +} + static void dump_init(DumpState *s, int fd, bool has_format, DumpGuestMemoryFormat format, bool paging, bool has_= filter, int64_t begin, int64_t length, Error **errp) @@ -1566,6 +1666,39 @@ static void dump_init(DumpState *s, int fd, bool has= _format, goto cleanup; } =20 + if (dump_info.has_phys_base) { + s->dump_info.phys_base =3D dump_info.phys_base; + } + if (dump_info.vmcoreinfo) { + uint64_t addr, size, note_head_size, name_size, desc_size; + int count =3D sscanf(dump_info.vmcoreinfo, "%" PRIx64 " %" PRIx64, + &addr, &size); + if (count !=3D 2) { + /* non fatal error */ + error_report("Failed to parse vmcoreinfo"); + } else { + assert(!s->vmcoreinfo); + s->vmcoreinfo =3D g_malloc(size); + cpu_physical_memory_read(addr, s->vmcoreinfo, size); + + get_note_sizes(s, s->vmcoreinfo, + ¬e_head_size, &name_size, &desc_size); + s->vmcoreinfo_size =3D ((note_head_size + 3) / 4 + + (name_size + 3) / 4 + + (desc_size + 3) / 4) * 4; + if (s->vmcoreinfo_size > size) { + error_report("Invalid vmcoreinfo header, size mismatch"); + g_free(s->vmcoreinfo); + s->vmcoreinfo =3D NULL; + } else { + if (dump_info.has_phys_base) { + vmcoreinfo_add_phys_base(s); + } + s->note_size +=3D s->vmcoreinfo_size; + } + } + } + /* get memory mapping */ if (paging) { qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &er= r); --=20 2.13.0.91.g00982b8dd From nobody Fri Apr 19 02:49:59 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496322670774595.4967348159358; Thu, 1 Jun 2017 06:11:10 -0700 (PDT) Received: from localhost ([::1]:44301 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPsZ-0003eD-Lb for importer@patchew.org; Thu, 01 Jun 2017 09:11:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38433) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPle-0006Al-Qy for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:04:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGPlc-0004Hq-Q3 for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36474) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGPlc-0004Hi-I8 for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:03:56 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9179419C655; Thu, 1 Jun 2017 13:03:55 +0000 (UTC) Received: from localhost (ovpn-112-37.ams2.redhat.com [10.36.112.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7D7CF53C23; Thu, 1 Jun 2017 13:03:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9179419C655 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=marcandre.lureau@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9179419C655 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 1 Jun 2017 17:03:24 +0400 Message-Id: <20170601130325.6433-4-marcandre.lureau@redhat.com> In-Reply-To: <20170601130325.6433-1-marcandre.lureau@redhat.com> References: <20170601130325.6433-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 01 Jun 2017 13:03:55 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 3/4] kdump: add vmcoreinfo X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: anderson@redhat.com, qiaonuohan@cn.fujitsu.com, lersek@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" kdump header provides offset and size of the vmcoreinfo note, append it if available. Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Andrew Jones --- dump.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/dump.c b/dump.c index 6911ffad8b..ba7676a514 100644 --- a/dump.c +++ b/dump.c @@ -791,8 +791,9 @@ static void create_header32(DumpState *s, Error **errp) uint32_t sub_hdr_size; uint32_t bitmap_blocks; uint32_t status =3D 0; - uint64_t offset_note; + uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo =3D 0; Error *local_err =3D NULL; + uint8_t *vmcoreinfo =3D NULL; =20 /* write common header, the version of kdump-compressed format is 6th = */ size =3D sizeof(DiskDumpHeader32); @@ -841,7 +842,18 @@ static void create_header32(DumpState *s, Error **errp) kh->phys_base =3D cpu_to_dump32(s, s->dump_info.phys_base); kh->dump_level =3D cpu_to_dump32(s, DUMP_LEVEL); =20 - offset_note =3D DISKDUMP_HEADER_BLOCKS * block_size + size; + offset_vmcoreinfo =3D DISKDUMP_HEADER_BLOCKS * block_size + size; + if (s->vmcoreinfo) { + uint64_t hsize, name_size; + + get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcorei= nfo); + vmcoreinfo =3D + s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4; + kh->offset_vmcoreinfo =3D cpu_to_dump64(s, offset_vmcoreinfo); + kh->size_vmcoreinfo =3D cpu_to_dump32(s, size_vmcoreinfo); + } + + offset_note =3D offset_vmcoreinfo + size_vmcoreinfo; kh->offset_note =3D cpu_to_dump64(s, offset_note); kh->note_size =3D cpu_to_dump32(s, s->note_size); =20 @@ -851,6 +863,14 @@ static void create_header32(DumpState *s, Error **errp) goto out; } =20 + if (vmcoreinfo) { + if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo, + size_vmcoreinfo) < 0) { + error_setg(errp, "dump: failed to vmcoreinfo"); + goto out; + } + } + /* write note */ s->note_buf =3D g_malloc0(s->note_size); s->note_buf_offset =3D 0; @@ -891,8 +911,9 @@ static void create_header64(DumpState *s, Error **errp) uint32_t sub_hdr_size; uint32_t bitmap_blocks; uint32_t status =3D 0; - uint64_t offset_note; + uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo =3D 0; Error *local_err =3D NULL; + uint8_t *vmcoreinfo =3D NULL; =20 /* write common header, the version of kdump-compressed format is 6th = */ size =3D sizeof(DiskDumpHeader64); @@ -941,7 +962,18 @@ static void create_header64(DumpState *s, Error **errp) kh->phys_base =3D cpu_to_dump64(s, s->dump_info.phys_base); kh->dump_level =3D cpu_to_dump32(s, DUMP_LEVEL); =20 - offset_note =3D DISKDUMP_HEADER_BLOCKS * block_size + size; + offset_vmcoreinfo =3D DISKDUMP_HEADER_BLOCKS * block_size + size; + if (s->vmcoreinfo) { + uint64_t hsize, name_size; + + get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcorei= nfo); + vmcoreinfo =3D + s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4; + kh->offset_vmcoreinfo =3D cpu_to_dump64(s, offset_vmcoreinfo); + kh->size_vmcoreinfo =3D cpu_to_dump64(s, size_vmcoreinfo); + } + + offset_note =3D offset_vmcoreinfo + size_vmcoreinfo; kh->offset_note =3D cpu_to_dump64(s, offset_note); kh->note_size =3D cpu_to_dump64(s, s->note_size); =20 @@ -951,6 +983,14 @@ static void create_header64(DumpState *s, Error **errp) goto out; } =20 + if (vmcoreinfo) { + if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo, + size_vmcoreinfo) < 0) { + error_setg(errp, "dump: failed to vmcoreinfo"); + goto out; + } + } + /* write note */ s->note_buf =3D g_malloc0(s->note_size); s->note_buf_offset =3D 0; --=20 2.13.0.91.g00982b8dd From nobody Fri Apr 19 02:49:59 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149632280180278.47094035657597; Thu, 1 Jun 2017 06:13:21 -0700 (PDT) Received: from localhost ([::1]:44310 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPuh-0005ZK-Eb for importer@patchew.org; Thu, 01 Jun 2017 09:13:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38482) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGPlp-0006Hd-5n for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:04:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGPlk-0004Ip-96 for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:04:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39724) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGPlk-0004Id-2N for qemu-devel@nongnu.org; Thu, 01 Jun 2017 09:04:04 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 125751A673B; Thu, 1 Jun 2017 13:04:03 +0000 (UTC) Received: from localhost (ovpn-112-37.ams2.redhat.com [10.36.112.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id 484B97F6C3; Thu, 1 Jun 2017 13:03:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 125751A673B Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=marcandre.lureau@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 125751A673B From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 1 Jun 2017 17:03:25 +0400 Message-Id: <20170601130325.6433-5-marcandre.lureau@redhat.com> In-Reply-To: <20170601130325.6433-1-marcandre.lureau@redhat.com> References: <20170601130325.6433-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 01 Jun 2017 13:04:03 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 4/4] scripts/dump-guest-memory.py: add vmcoreinfo X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: anderson@redhat.com, qiaonuohan@cn.fujitsu.com, lersek@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add vmcoreinfo ELF note if qemu dump_info has been populated. Also modify it with NUMBER(phys_base)=3D.. if the guest doesn't provide it (on older kernel). Signed-off-by: Marc-Andr=C3=A9 Lureau --- scripts/dump-guest-memory.py | 52 ++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 52 insertions(+) diff --git a/scripts/dump-guest-memory.py b/scripts/dump-guest-memory.py index f7c6635f15..a13f5d8b24 100644 --- a/scripts/dump-guest-memory.py +++ b/scripts/dump-guest-memory.py @@ -120,6 +120,33 @@ class ELF(object): self.segments[0].p_filesz +=3D ctypes.sizeof(note) self.segments[0].p_memsz +=3D ctypes.sizeof(note) =20 + + def add_vmcoreinfo_note(self, vmcoreinfo, phys_base=3DNone): + """Adds a vmcoreinfo note to the ELF.""" + chead =3D type(get_arch_note(self.endianness, 0, 0)) + header =3D chead.from_buffer_copy(vmcoreinfo[0:ctypes.sizeof(chead= )]) + note =3D get_arch_note(self.endianness, + header.n_namesz - 1, header.n_descsz) + ctypes.memmove(ctypes.pointer(note), vmcoreinfo, ctypes.sizeof(not= e)) + header_size =3D ctypes.sizeof(note) - header.n_descsz + + if phys_base: + desc =3D bytearray(note.n_desc).decode().split() + if not next((v for v in desc if v.startswith('NUMBER(phys_base= )=3D')), + False): + desc.append('NUMBER(phys_base)=3D%ld' % phys_base) + desc =3D "\n".join(desc) + '\n' + descsz =3D (len(desc) + 3) // 4 * 4 + desc +=3D '\0' * (descsz - len(desc)) + note =3D get_arch_note(self.endianness, header.n_namesz - 1, d= escsz) + ctypes.memmove(ctypes.pointer(note), vmcoreinfo, header_size) + note.n_descsz =3D descsz + ctypes.memmove(note.n_desc, desc.encode(), descsz) + + self.notes.append(note) + self.segments[0].p_filesz +=3D ctypes.sizeof(note) + self.segments[0].p_memsz +=3D ctypes.sizeof(note) + def add_segment(self, p_type, p_paddr, p_size): """Adds a segment to the elf.""" =20 @@ -505,6 +532,30 @@ shape and this command should mostly work.""" cur +=3D chunk_size left -=3D chunk_size =20 + def add_vmcoreinfo(self): + qemu_core =3D gdb.inferiors()[0] + + try: + coreinfo =3D gdb.parse_and_eval("dump_info.vmcoreinfo") + except gdb.error: + return + + if coreinfo =3D=3D 0: + return + + phys_base =3D None + has_phys_base =3D gdb.parse_and_eval("dump_info.has_phys_base") + if has_phys_base: + phys_base =3D int(gdb.parse_and_eval("dump_info.phys_base")) + + addr, size =3D [int(val, 16) for val in coreinfo.string().split()] + for block in self.guest_phys_blocks: + if block["target_start"] <=3D addr < block["target_end"]: + haddr =3D block["host_addr"] + (addr - block["target_start= "]) + vmcoreinfo =3D qemu_core.read_memory(haddr, size) + self.elf.add_vmcoreinfo_note(vmcoreinfo.tobytes(), phys_ba= se) + return + def invoke(self, args, from_tty): """Handles command invocation from gdb.""" =20 @@ -518,6 +569,7 @@ shape and this command should mostly work.""" =20 self.elf =3D ELF(argv[1]) self.guest_phys_blocks =3D get_guest_phys_blocks() + self.add_vmcoreinfo() =20 with open(argv[0], "wb") as vmcore: self.dump_init(vmcore) --=20 2.13.0.91.g00982b8dd