From nobody Sat Apr 27 17:25:20 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650626094076853.6214039872465; Fri, 22 Apr 2022 04:14:54 -0700 (PDT) Received: from localhost ([::1]:57894 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrFV-0001yq-0k for importer2@patchew.org; Fri, 22 Apr 2022 07:14:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:32842) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKD-0008Oh-1y for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:60282) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqK9-0004hw-UU for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:40 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-660-DRcHBP6BOrqRheubgMXCbQ-1; Fri, 22 Apr 2022 06:15:34 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CBBC01E10B4B; Fri, 22 Apr 2022 10:15:33 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 765CE404D2D7; Fri, 22 Apr 2022 10:15:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xwqnwuSwuDIJyClnh4Em0V7N2d6F0nUS40fblp2WyK8=; b=Dyue9E4KX9/PKeD9SAOWciXhL6jFKX4c9JGOCtjBeZykhj+6j8T9UwmnRX/Yvi2+sGEDHV 3OmxrFbSXAz+U10h1aEQssc4MfHoQnVZX49+chkWwUNytzAbd2EtC9iu+2g8c7uaGljjsD XYj5CotXKfAS+cp+s4UhC6K8Sq1P71A= X-MC-Unique: DRcHBP6BOrqRheubgMXCbQ-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 01/13] dump: Use ERRP_GUARD() Date: Fri, 22 Apr 2022 14:15:13 +0400 Message-Id: <20220422101525.3260741-2-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650626094607100001 From: Janosch Frank Let's move to the new way of handling errors before changing the dump code. This patch has mostly been generated by the coccinelle script scripts/coccinelle/errp-guard.cocci. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-2-frankja@linux.ibm.com> --- dump/dump.c | 144 ++++++++++++++++++++++------------------------------ 1 file changed, 61 insertions(+), 83 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index e766ce1d7d91..b91e9d8c123e 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -389,23 +389,21 @@ static void write_data(DumpState *s, void *buf, int l= ength, Error **errp) static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t s= tart, int64_t size, Error **errp) { + ERRP_GUARD(); int64_t i; - Error *local_err =3D NULL; =20 for (i =3D 0; i < size / s->dump_info.page_size; i++) { write_data(s, block->host_addr + start + i * s->dump_info.page_siz= e, - s->dump_info.page_size, &local_err); - if (local_err) { - error_propagate(errp, local_err); + s->dump_info.page_size, errp); + if (*errp) { return; } } =20 if ((size % s->dump_info.page_size) !=3D 0) { write_data(s, block->host_addr + start + i * s->dump_info.page_siz= e, - size % s->dump_info.page_size, &local_err); - if (local_err) { - error_propagate(errp, local_err); + size % s->dump_info.page_size, errp); + if (*errp) { return; } } @@ -475,11 +473,11 @@ static void get_offset_range(hwaddr phys_addr, =20 static void write_elf_loads(DumpState *s, Error **errp) { + ERRP_GUARD(); hwaddr offset, filesz; MemoryMapping *memory_mapping; uint32_t phdr_index =3D 1; uint32_t max_index; - Error *local_err =3D NULL; =20 if (s->have_section) { max_index =3D s->sh_info; @@ -493,14 +491,13 @@ static void write_elf_loads(DumpState *s, Error **err= p) s, &offset, &filesz); if (s->dump_info.d_class =3D=3D ELFCLASS64) { write_elf64_load(s, memory_mapping, phdr_index++, offset, - filesz, &local_err); + filesz, errp); } else { write_elf32_load(s, memory_mapping, phdr_index++, offset, - filesz, &local_err); + filesz, errp); } =20 - if (local_err) { - error_propagate(errp, local_err); + if (*errp) { return; } =20 @@ -513,7 +510,7 @@ static void write_elf_loads(DumpState *s, Error **errp) /* write elf header, PT_NOTE and elf note to vmcore. */ static void dump_begin(DumpState *s, Error **errp) { - Error *local_err =3D NULL; + ERRP_GUARD(); =20 /* * the vmcore's format is: @@ -541,73 +538,64 @@ static void dump_begin(DumpState *s, Error **errp) =20 /* write elf header to vmcore */ if (s->dump_info.d_class =3D=3D ELFCLASS64) { - write_elf64_header(s, &local_err); + write_elf64_header(s, errp); } else { - write_elf32_header(s, &local_err); + write_elf32_header(s, errp); } - if (local_err) { - error_propagate(errp, local_err); + if (*errp) { return; } =20 if (s->dump_info.d_class =3D=3D ELFCLASS64) { /* write PT_NOTE to vmcore */ - write_elf64_note(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf64_note(s, errp); + if (*errp) { return; } =20 /* write all PT_LOAD to vmcore */ - write_elf_loads(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf_loads(s, errp); + if (*errp) { return; } =20 /* write section to vmcore */ if (s->have_section) { - write_elf_section(s, 1, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf_section(s, 1, errp); + if (*errp) { return; } } =20 /* write notes to vmcore */ - write_elf64_notes(fd_write_vmcore, s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf64_notes(fd_write_vmcore, s, errp); + if (*errp) { return; } } else { /* write PT_NOTE to vmcore */ - write_elf32_note(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf32_note(s, errp); + if (*errp) { return; } =20 /* write all PT_LOAD to vmcore */ - write_elf_loads(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf_loads(s, errp); + if (*errp) { return; } =20 /* write section to vmcore */ if (s->have_section) { - write_elf_section(s, 0, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf_section(s, 0, errp); + if (*errp) { return; } } =20 /* write notes to vmcore */ - write_elf32_notes(fd_write_vmcore, s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf32_notes(fd_write_vmcore, s, errp); + if (*errp) { return; } } @@ -643,9 +631,9 @@ static int get_next_block(DumpState *s, GuestPhysBlock = *block) /* write all memory to vmcore */ static void dump_iterate(DumpState *s, Error **errp) { + ERRP_GUARD(); GuestPhysBlock *block; int64_t size; - Error *local_err =3D NULL; =20 do { block =3D s->next_block; @@ -657,9 +645,8 @@ static void dump_iterate(DumpState *s, Error **errp) size -=3D block->target_end - (s->begin + s->length); } } - write_memory(s, block, s->start, size, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_memory(s, block, s->start, size, errp); + if (*errp) { return; } =20 @@ -668,11 +655,10 @@ static void dump_iterate(DumpState *s, Error **errp) =20 static void create_vmcore(DumpState *s, Error **errp) { - Error *local_err =3D NULL; + ERRP_GUARD(); =20 - dump_begin(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + dump_begin(s, errp); + if (*errp) { return; } =20 @@ -809,6 +795,7 @@ static bool note_name_equal(DumpState *s, /* write common header, sub header and elf note to vmcore */ static void create_header32(DumpState *s, Error **errp) { + ERRP_GUARD(); DiskDumpHeader32 *dh =3D NULL; KdumpSubHeader32 *kh =3D NULL; size_t size; @@ -817,7 +804,6 @@ static void create_header32(DumpState *s, Error **errp) uint32_t bitmap_blocks; uint32_t status =3D 0; uint64_t offset_note; - Error *local_err =3D NULL; =20 /* write common header, the version of kdump-compressed format is 6th = */ size =3D sizeof(DiskDumpHeader32); @@ -893,9 +879,8 @@ static void create_header32(DumpState *s, Error **errp) s->note_buf_offset =3D 0; =20 /* use s->note_buf to store notes temporarily */ - write_elf32_notes(buf_write_note, s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf32_notes(buf_write_note, s, errp); + if (*errp) { goto out; } if (write_buffer(s->fd, offset_note, s->note_buf, @@ -921,6 +906,7 @@ out: /* write common header, sub header and elf note to vmcore */ static void create_header64(DumpState *s, Error **errp) { + ERRP_GUARD(); DiskDumpHeader64 *dh =3D NULL; KdumpSubHeader64 *kh =3D NULL; size_t size; @@ -929,7 +915,6 @@ static void create_header64(DumpState *s, Error **errp) uint32_t bitmap_blocks; uint32_t status =3D 0; uint64_t offset_note; - Error *local_err =3D NULL; =20 /* write common header, the version of kdump-compressed format is 6th = */ size =3D sizeof(DiskDumpHeader64); @@ -1005,9 +990,8 @@ static void create_header64(DumpState *s, Error **errp) s->note_buf_offset =3D 0; =20 /* use s->note_buf to store notes temporarily */ - write_elf64_notes(buf_write_note, s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_elf64_notes(buf_write_note, s, errp); + if (*errp) { goto out; } =20 @@ -1463,8 +1447,8 @@ out: =20 static void create_kdump_vmcore(DumpState *s, Error **errp) { + ERRP_GUARD(); int ret; - Error *local_err =3D NULL; =20 /* * the kdump-compressed format is: @@ -1494,21 +1478,18 @@ static void create_kdump_vmcore(DumpState *s, Error= **errp) return; } =20 - write_dump_header(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_dump_header(s, errp); + if (*errp) { return; } =20 - write_dump_bitmap(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_dump_bitmap(s, errp); + if (*errp) { return; } =20 - write_dump_pages(s, &local_err); - if (local_err) { - error_propagate(errp, local_err); + write_dump_pages(s, errp); + if (*errp) { return; } =20 @@ -1638,10 +1619,10 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, DumpGuestMemoryFormat format, bool paging, bool has_= filter, int64_t begin, int64_t length, Error **errp) { + ERRP_GUARD(); VMCoreInfoState *vmci =3D vmcoreinfo_find(); CPUState *cpu; int nr_cpus; - Error *err =3D NULL; int ret; =20 s->has_format =3D has_format; @@ -1760,9 +1741,8 @@ static void dump_init(DumpState *s, int fd, bool has_= format, =20 /* get memory mapping */ if (paging) { - qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &er= r); - if (err !=3D NULL) { - error_propagate(errp, err); + qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, err= p); + if (*errp) { goto cleanup; } } else { @@ -1861,33 +1841,32 @@ cleanup: /* this operation might be time consuming. */ static void dump_process(DumpState *s, Error **errp) { - Error *local_err =3D NULL; + ERRP_GUARD(); DumpQueryResult *result =3D NULL; =20 if (s->has_format && s->format =3D=3D DUMP_GUEST_MEMORY_FORMAT_WIN_DMP= ) { #ifdef TARGET_X86_64 - create_win_dump(s, &local_err); + create_win_dump(s, errp); #endif } else if (s->has_format && s->format !=3D DUMP_GUEST_MEMORY_FORMAT_EL= F) { - create_kdump_vmcore(s, &local_err); + create_kdump_vmcore(s, errp); } else { - create_vmcore(s, &local_err); + create_vmcore(s, errp); } =20 /* make sure status is written after written_size updates */ smp_wmb(); qatomic_set(&s->status, - (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED)); + (*errp ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED)); =20 /* send DUMP_COMPLETED message (unconditionally) */ result =3D qmp_query_dump(NULL); /* should never fail */ assert(result); - qapi_event_send_dump_completed(result, !!local_err, (local_err ? - error_get_pretty(local_err) : NULL)); + qapi_event_send_dump_completed(result, !!*errp, (*errp ? + error_get_pretty(*err= p) : NULL)); qapi_free_DumpQueryResult(result); =20 - error_propagate(errp, local_err); dump_cleanup(s); } =20 @@ -1916,10 +1895,10 @@ void qmp_dump_guest_memory(bool paging, const char = *file, int64_t length, bool has_format, DumpGuestMemoryFormat format, Error **errp) { + ERRP_GUARD(); const char *p; int fd =3D -1; DumpState *s; - Error *local_err =3D NULL; bool detach_p =3D false; =20 if (runstate_check(RUN_STATE_INMIGRATE)) { @@ -2019,9 +1998,8 @@ void qmp_dump_guest_memory(bool paging, const char *f= ile, dump_state_prepare(s); =20 dump_init(s, fd, has_format, format, paging, has_begin, - begin, length, &local_err); - if (local_err) { - error_propagate(errp, local_err); + begin, length, errp); + if (*errp) { qatomic_set(&s->status, DUMP_STATUS_FAILED); return; } --=20 2.36.0 From nobody Sat Apr 27 17:25:20 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650628472532481.4192011198779; Fri, 22 Apr 2022 04:54:32 -0700 (PDT) Received: from localhost ([::1]:52150 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrrr-0001Uc-B1 for importer2@patchew.org; Fri, 22 Apr 2022 07:54:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:32876) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKG-0008Vt-FP for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:37201) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKE-0004kv-Me for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:44 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-336-SWDzsH0KPNaeKRy5ivVVwg-1; Fri, 22 Apr 2022 06:15:39 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AF66185A5A8; Fri, 22 Apr 2022 10:15:38 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 89D9F145BF06; Fri, 22 Apr 2022 10:15:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622542; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jI4pQSWqi7Y9HLlOZtHkN+4181BB2+AFf1Aj3taf6AQ=; b=Eoh7y7QSvtWZvtmiKjze5aU4l76M9nMU01OwVjvLTGiB5s8eGhBRVPaGIUUZaIny8gQsSR CBSimhEFE1KrXn2/OyrkC6V+kLquXKqVGRQTc+lCGAdpNf9tS0SeK90u/nWwx9vzZtj2Ef jnex0bqWdIKv3vY4ffh+XXLSTqwbESM= X-MC-Unique: SWDzsH0KPNaeKRy5ivVVwg-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 02/13] dump: Remove the sh_info variable Date: Fri, 22 Apr 2022 14:15:14 +0400 Message-Id: <20220422101525.3260741-3-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650628474560100001 From: Janosch Frank There's no need to have phdr_num and sh_info at the same time. We can make phdr_num 32 bit and set PN_XNUM when we write the header if phdr_num >=3D PN_XNUM. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220407094824.5074-1-frankja@linux.ibm.com> --- include/sysemu/dump.h | 3 +-- dump/dump.c | 44 +++++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index 250143cb5a71..b463fc9c0226 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -154,8 +154,7 @@ typedef struct DumpState { GuestPhysBlockList guest_phys_blocks; ArchDumpInfo dump_info; MemoryMappingList list; - uint16_t phdr_num; - uint32_t sh_info; + uint32_t phdr_num; bool have_section; bool resume; bool detached; diff --git a/dump/dump.c b/dump/dump.c index b91e9d8c123e..010b272da038 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -123,6 +123,12 @@ static int fd_write_vmcore(const void *buf, size_t siz= e, void *opaque) =20 static void write_elf64_header(DumpState *s, Error **errp) { + /* + * phnum in the elf header is 16 bit, if we have more segments we + * set phnum to PN_XNUM and write the real number of segments to a + * special section. + */ + uint16_t phnum =3D MIN(s->phdr_num, PN_XNUM); Elf64_Ehdr elf_header; int ret; =20 @@ -137,9 +143,9 @@ static void write_elf64_header(DumpState *s, Error **er= rp) elf_header.e_ehsize =3D cpu_to_dump16(s, sizeof(elf_header)); elf_header.e_phoff =3D cpu_to_dump64(s, sizeof(Elf64_Ehdr)); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf64_Phdr)); - elf_header.e_phnum =3D cpu_to_dump16(s, s->phdr_num); + elf_header.e_phnum =3D cpu_to_dump16(s, phnum); if (s->have_section) { - uint64_t shoff =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->sh= _info; + uint64_t shoff =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->ph= dr_num; =20 elf_header.e_shoff =3D cpu_to_dump64(s, shoff); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf64_Shdr)); @@ -154,6 +160,12 @@ static void write_elf64_header(DumpState *s, Error **e= rrp) =20 static void write_elf32_header(DumpState *s, Error **errp) { + /* + * phnum in the elf header is 16 bit, if we have more segments we + * set phnum to PN_XNUM and write the real number of segments to a + * special section. + */ + uint16_t phnum =3D MIN(s->phdr_num, PN_XNUM); Elf32_Ehdr elf_header; int ret; =20 @@ -168,9 +180,9 @@ static void write_elf32_header(DumpState *s, Error **er= rp) elf_header.e_ehsize =3D cpu_to_dump16(s, sizeof(elf_header)); elf_header.e_phoff =3D cpu_to_dump32(s, sizeof(Elf32_Ehdr)); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf32_Phdr)); - elf_header.e_phnum =3D cpu_to_dump16(s, s->phdr_num); + elf_header.e_phnum =3D cpu_to_dump16(s, phnum); if (s->have_section) { - uint32_t shoff =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->sh= _info; + uint32_t shoff =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->ph= dr_num; =20 elf_header.e_shoff =3D cpu_to_dump32(s, shoff); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf32_Shdr)); @@ -357,12 +369,12 @@ static void write_elf_section(DumpState *s, int type,= Error **errp) if (type =3D=3D 0) { shdr_size =3D sizeof(Elf32_Shdr); memset(&shdr32, 0, shdr_size); - shdr32.sh_info =3D cpu_to_dump32(s, s->sh_info); + shdr32.sh_info =3D cpu_to_dump32(s, s->phdr_num); shdr =3D &shdr32; } else { shdr_size =3D sizeof(Elf64_Shdr); memset(&shdr64, 0, shdr_size); - shdr64.sh_info =3D cpu_to_dump32(s, s->sh_info); + shdr64.sh_info =3D cpu_to_dump32(s, s->phdr_num); shdr =3D &shdr64; } =20 @@ -477,13 +489,6 @@ static void write_elf_loads(DumpState *s, Error **errp) hwaddr offset, filesz; MemoryMapping *memory_mapping; uint32_t phdr_index =3D 1; - uint32_t max_index; - - if (s->have_section) { - max_index =3D s->sh_info; - } else { - max_index =3D s->phdr_num; - } =20 QTAILQ_FOREACH(memory_mapping, &s->list.head, next) { get_offset_range(memory_mapping->phys_addr, @@ -501,7 +506,7 @@ static void write_elf_loads(DumpState *s, Error **errp) return; } =20 - if (phdr_index >=3D max_index) { + if (phdr_index >=3D s->phdr_num) { break; } } @@ -1800,22 +1805,21 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, s->phdr_num +=3D s->list.num; s->have_section =3D false; } else { + /* sh_info of section 0 holds the real number of phdrs */ s->have_section =3D true; - s->phdr_num =3D PN_XNUM; - s->sh_info =3D 1; /* PT_NOTE */ =20 /* the type of shdr->sh_info is uint32_t, so we should avoid overf= low */ if (s->list.num <=3D UINT32_MAX - 1) { - s->sh_info +=3D s->list.num; + s->phdr_num +=3D s->list.num; } else { - s->sh_info =3D UINT32_MAX; + s->phdr_num =3D UINT32_MAX; } } =20 if (s->dump_info.d_class =3D=3D ELFCLASS64) { if (s->have_section) { s->memory_offset =3D sizeof(Elf64_Ehdr) + - sizeof(Elf64_Phdr) * s->sh_info + + sizeof(Elf64_Phdr) * s->phdr_num + sizeof(Elf64_Shdr) + s->note_size; } else { s->memory_offset =3D sizeof(Elf64_Ehdr) + @@ -1824,7 +1828,7 @@ static void dump_init(DumpState *s, int fd, bool has_= format, } else { if (s->have_section) { s->memory_offset =3D sizeof(Elf32_Ehdr) + - sizeof(Elf32_Phdr) * s->sh_info + + sizeof(Elf32_Phdr) * s->phdr_num + sizeof(Elf32_Shdr) + s->note_size; } else { s->memory_offset =3D sizeof(Elf32_Ehdr) + --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650628642227970.2612364523567; Fri, 22 Apr 2022 04:57:22 -0700 (PDT) Received: from localhost ([::1]:60724 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrub-0007Z3-0m for importer2@patchew.org; Fri, 22 Apr 2022 07:57:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:32904) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKK-0000Bf-7b for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:48 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:32319) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKI-0004my-FU for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:15:47 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-154-ZHoZj5BnPYauWlXy4x3_Sg-1; Fri, 22 Apr 2022 06:15:43 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3878738149B1; Fri, 22 Apr 2022 10:15:43 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id D7C3A40E80F5; Fri, 22 Apr 2022 10:15:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622544; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2UUAiq0z2rzGHnE26rtABqpfZSZSn8iucEsR8c2fwcE=; b=DwDcYppH9rt/BsVMuTaFOiYPBogUuQQgp7tCioOLOL8kdhSoMjKtJ/IAaFdY7+zIbdxKfj +spmBf9jImhe1c1ApSQLsG4I+Wla9sur1QDlErHHNRG9gIwyiRUJS7rSxlNdaKVRbUNaVF kVMJKoD7duQTcqasDFGnhk1l84nfKfc= X-MC-Unique: ZHoZj5BnPYauWlXy4x3_Sg-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 03/13] dump: Introduce shdr_num to decrease complexity Date: Fri, 22 Apr 2022 14:15:15 +0400 Message-Id: <20220422101525.3260741-4-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650628643620100001 From: Janosch Frank Let's move from a boolean to a int variable which will later enable us to store the number of sections that are in the dump file. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-4-frankja@linux.ibm.com> --- include/sysemu/dump.h | 2 +- dump/dump.c | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index b463fc9c0226..19458bffbd1d 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -155,7 +155,7 @@ typedef struct DumpState { ArchDumpInfo dump_info; MemoryMappingList list; uint32_t phdr_num; - bool have_section; + uint32_t shdr_num; bool resume; bool detached; ssize_t note_size; diff --git a/dump/dump.c b/dump/dump.c index 010b272da038..285ed4475b0d 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -144,12 +144,12 @@ static void write_elf64_header(DumpState *s, Error **= errp) elf_header.e_phoff =3D cpu_to_dump64(s, sizeof(Elf64_Ehdr)); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf64_Phdr)); elf_header.e_phnum =3D cpu_to_dump16(s, phnum); - if (s->have_section) { + if (s->shdr_num) { uint64_t shoff =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->ph= dr_num; =20 elf_header.e_shoff =3D cpu_to_dump64(s, shoff); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf64_Shdr)); - elf_header.e_shnum =3D cpu_to_dump16(s, 1); + elf_header.e_shnum =3D cpu_to_dump16(s, s->shdr_num); } =20 ret =3D fd_write_vmcore(&elf_header, sizeof(elf_header), s); @@ -181,12 +181,12 @@ static void write_elf32_header(DumpState *s, Error **= errp) elf_header.e_phoff =3D cpu_to_dump32(s, sizeof(Elf32_Ehdr)); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf32_Phdr)); elf_header.e_phnum =3D cpu_to_dump16(s, phnum); - if (s->have_section) { + if (s->shdr_num) { uint32_t shoff =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->ph= dr_num; =20 elf_header.e_shoff =3D cpu_to_dump32(s, shoff); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf32_Shdr)); - elf_header.e_shnum =3D cpu_to_dump16(s, 1); + elf_header.e_shnum =3D cpu_to_dump16(s, s->shdr_num); } =20 ret =3D fd_write_vmcore(&elf_header, sizeof(elf_header), s); @@ -565,7 +565,7 @@ static void dump_begin(DumpState *s, Error **errp) } =20 /* write section to vmcore */ - if (s->have_section) { + if (s->shdr_num) { write_elf_section(s, 1, errp); if (*errp) { return; @@ -591,7 +591,7 @@ static void dump_begin(DumpState *s, Error **errp) } =20 /* write section to vmcore */ - if (s->have_section) { + if (s->shdr_num) { write_elf_section(s, 0, errp); if (*errp) { return; @@ -1802,11 +1802,11 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, */ s->phdr_num =3D 1; /* PT_NOTE */ if (s->list.num < UINT16_MAX - 2) { + s->shdr_num =3D 0; s->phdr_num +=3D s->list.num; - s->have_section =3D false; } else { /* sh_info of section 0 holds the real number of phdrs */ - s->have_section =3D true; + s->shdr_num =3D 1; =20 /* the type of shdr->sh_info is uint32_t, so we should avoid overf= low */ if (s->list.num <=3D UINT32_MAX - 1) { @@ -1817,19 +1817,19 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, } =20 if (s->dump_info.d_class =3D=3D ELFCLASS64) { - if (s->have_section) { + if (s->shdr_num) { s->memory_offset =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->phdr_num + - sizeof(Elf64_Shdr) + s->note_size; + sizeof(Elf64_Shdr) * s->shdr_num + s->note_= size; } else { s->memory_offset =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->phdr_num + s->note_= size; } } else { - if (s->have_section) { + if (s->shdr_num) { s->memory_offset =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->phdr_num + - sizeof(Elf32_Shdr) + s->note_size; + sizeof(Elf32_Shdr) * s->shdr_num + s->note_= size; } else { s->memory_offset =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->phdr_num + s->note_= size; --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650626317063586.6697821267654; Fri, 22 Apr 2022 04:18:37 -0700 (PDT) Received: from localhost ([::1]:38088 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrJ4-0007z6-6K for importer2@patchew.org; Fri, 22 Apr 2022 07:18:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:32938) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKY-0000Jy-7b for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:02 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:34585) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKT-0004ow-NF for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:00 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-73-EEiRR7XKPJKHTp2odb98fw-1; Fri, 22 Apr 2022 06:15:51 -0400 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AF8A610726AB; Fri, 22 Apr 2022 10:15:47 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id DA37D46A0C4; Fri, 22 Apr 2022 10:15:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622554; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eGECfgCA062ozS385htHljf3FpYVHp12BzT+d6+p2DU=; b=QB16d9RxOku4Vvo3LrjABwqxNpVWkvvOcCcJFtavm8L1T5ITeLpeqk7U++E8xa5HUrm2p0 ig0vlKXtBi9n8rh4+ia4gvya14YDDULgWt+HdyCxTYChITTCpVM8wnhnZsJK6X8Ht6yX3Z ITL3cy57FHuDKU/yQHgf07rZKxzLV/E= X-MC-Unique: EEiRR7XKPJKHTp2odb98fw-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 04/13] dump: Remove the section if when calculating the memory offset Date: Fri, 22 Apr 2022 14:15:16 +0400 Message-Id: <20220422101525.3260741-5-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650626318195100001 From: Janosch Frank When s->shdr_num is 0 we'll add 0 bytes of section headers which is equivalent to not adding section headers but with the multiplication we can remove a if/else. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-5-frankja@linux.ibm.com> --- dump/dump.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 285ed4475b0d..9c80680eb2a4 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -1817,23 +1817,15 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, } =20 if (s->dump_info.d_class =3D=3D ELFCLASS64) { - if (s->shdr_num) { - s->memory_offset =3D sizeof(Elf64_Ehdr) + - sizeof(Elf64_Phdr) * s->phdr_num + - sizeof(Elf64_Shdr) * s->shdr_num + s->note_= size; - } else { - s->memory_offset =3D sizeof(Elf64_Ehdr) + - sizeof(Elf64_Phdr) * s->phdr_num + s->note_= size; - } + s->memory_offset =3D sizeof(Elf64_Ehdr) + + sizeof(Elf64_Phdr) * s->phdr_num + + sizeof(Elf64_Shdr) * s->shdr_num + + s->note_size; } else { - if (s->shdr_num) { - s->memory_offset =3D sizeof(Elf32_Ehdr) + - sizeof(Elf32_Phdr) * s->phdr_num + - sizeof(Elf32_Shdr) * s->shdr_num + s->note_= size; - } else { - s->memory_offset =3D sizeof(Elf32_Ehdr) + - sizeof(Elf32_Phdr) * s->phdr_num + s->note_= size; - } + s->memory_offset =3D sizeof(Elf32_Ehdr) + + sizeof(Elf32_Phdr) * s->phdr_num + + sizeof(Elf32_Shdr) * s->shdr_num + + s->note_size; } =20 return; --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650627206317937.1703163421513; Fri, 22 Apr 2022 04:33:26 -0700 (PDT) Received: from localhost ([::1]:39984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrXR-0005Rl-AD for importer2@patchew.org; Fri, 22 Apr 2022 07:33:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:32976) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKx-0000um-2v for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:27 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:59631) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqKv-0004pw-9a for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:26 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-669-_zvv2H4-MM2dKOnq2O5YnA-1; Fri, 22 Apr 2022 06:16:23 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E2C5B1E16DEB; Fri, 22 Apr 2022 10:16:09 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 90FD92166B5E; Fri, 22 Apr 2022 10:15:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622584; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9VGjHnY5cju+jYKhkuVAJZGadThEoBTMrkLnDIrBkOw=; b=Xxg98snnO0m5u9Qj+U+FLT4e3LKTZGKH5v7yE9+uZ/xGIXr8qXPLHUcwyYjenG6uxOvprk rPZIOecVGyGkQrL/uB0T9WYjGGqHd9HEt12Xc8nra8Wv+Kv7vNDCSZw2Eb2CpC3Q4h8S5X iObOW7+EEJ+B2JMIyUUHuOllWgS6iOE= X-MC-Unique: _zvv2H4-MM2dKOnq2O5YnA-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 05/13] dump: Add more offset variables Date: Fri, 22 Apr 2022 14:15:17 +0400 Message-Id: <20220422101525.3260741-6-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650627207725100001 From: Janosch Frank Offset calculations are easy enough to get wrong. Let's add a few variables to make moving around elf headers and data sections easier. Signed-off-by: Janosch Frank Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Richard Henderson Message-Id: <20220330123603.107120-6-frankja@linux.ibm.com> --- include/sysemu/dump.h | 4 ++++ dump/dump.c | 35 +++++++++++++++-------------------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index 19458bffbd1d..ffc2ea1072f3 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -159,6 +159,10 @@ typedef struct DumpState { bool resume; bool detached; ssize_t note_size; + hwaddr shdr_offset; + hwaddr phdr_offset; + hwaddr section_offset; + hwaddr note_offset; hwaddr memory_offset; int fd; =20 diff --git a/dump/dump.c b/dump/dump.c index 9c80680eb2a4..7f226257eec3 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -141,13 +141,11 @@ static void write_elf64_header(DumpState *s, Error **= errp) elf_header.e_machine =3D cpu_to_dump16(s, s->dump_info.d_machine); elf_header.e_version =3D cpu_to_dump32(s, EV_CURRENT); elf_header.e_ehsize =3D cpu_to_dump16(s, sizeof(elf_header)); - elf_header.e_phoff =3D cpu_to_dump64(s, sizeof(Elf64_Ehdr)); + elf_header.e_phoff =3D cpu_to_dump64(s, s->phdr_offset); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf64_Phdr)); elf_header.e_phnum =3D cpu_to_dump16(s, phnum); if (s->shdr_num) { - uint64_t shoff =3D sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->ph= dr_num; - - elf_header.e_shoff =3D cpu_to_dump64(s, shoff); + elf_header.e_shoff =3D cpu_to_dump64(s, s->shdr_offset); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf64_Shdr)); elf_header.e_shnum =3D cpu_to_dump16(s, s->shdr_num); } @@ -178,13 +176,11 @@ static void write_elf32_header(DumpState *s, Error **= errp) elf_header.e_machine =3D cpu_to_dump16(s, s->dump_info.d_machine); elf_header.e_version =3D cpu_to_dump32(s, EV_CURRENT); elf_header.e_ehsize =3D cpu_to_dump16(s, sizeof(elf_header)); - elf_header.e_phoff =3D cpu_to_dump32(s, sizeof(Elf32_Ehdr)); + elf_header.e_phoff =3D cpu_to_dump32(s, s->phdr_offset); elf_header.e_phentsize =3D cpu_to_dump16(s, sizeof(Elf32_Phdr)); elf_header.e_phnum =3D cpu_to_dump16(s, phnum); if (s->shdr_num) { - uint32_t shoff =3D sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->ph= dr_num; - - elf_header.e_shoff =3D cpu_to_dump32(s, shoff); + elf_header.e_shoff =3D cpu_to_dump32(s, s->shdr_offset); elf_header.e_shentsize =3D cpu_to_dump16(s, sizeof(Elf32_Shdr)); elf_header.e_shnum =3D cpu_to_dump16(s, s->shdr_num); } @@ -247,12 +243,11 @@ static void write_elf32_load(DumpState *s, MemoryMapp= ing *memory_mapping, static void write_elf64_note(DumpState *s, Error **errp) { Elf64_Phdr phdr; - hwaddr begin =3D s->memory_offset - s->note_size; int ret; =20 memset(&phdr, 0, sizeof(Elf64_Phdr)); phdr.p_type =3D cpu_to_dump32(s, PT_NOTE); - phdr.p_offset =3D cpu_to_dump64(s, begin); + phdr.p_offset =3D cpu_to_dump64(s, s->note_offset); phdr.p_paddr =3D 0; phdr.p_filesz =3D cpu_to_dump64(s, s->note_size); phdr.p_memsz =3D cpu_to_dump64(s, s->note_size); @@ -312,13 +307,12 @@ static void write_elf64_notes(WriteCoreDumpFunction f= , DumpState *s, =20 static void write_elf32_note(DumpState *s, Error **errp) { - hwaddr begin =3D s->memory_offset - s->note_size; Elf32_Phdr phdr; int ret; =20 memset(&phdr, 0, sizeof(Elf32_Phdr)); phdr.p_type =3D cpu_to_dump32(s, PT_NOTE); - phdr.p_offset =3D cpu_to_dump32(s, begin); + phdr.p_offset =3D cpu_to_dump32(s, s->note_offset); phdr.p_paddr =3D 0; phdr.p_filesz =3D cpu_to_dump32(s, s->note_size); phdr.p_memsz =3D cpu_to_dump32(s, s->note_size); @@ -1817,15 +1811,16 @@ static void dump_init(DumpState *s, int fd, bool ha= s_format, } =20 if (s->dump_info.d_class =3D=3D ELFCLASS64) { - s->memory_offset =3D sizeof(Elf64_Ehdr) + - sizeof(Elf64_Phdr) * s->phdr_num + - sizeof(Elf64_Shdr) * s->shdr_num + - s->note_size; + s->phdr_offset =3D sizeof(Elf64_Ehdr); + s->shdr_offset =3D s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_n= um; + s->note_offset =3D s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_n= um; + s->memory_offset =3D s->note_offset + s->note_size; } else { - s->memory_offset =3D sizeof(Elf32_Ehdr) + - sizeof(Elf32_Phdr) * s->phdr_num + - sizeof(Elf32_Shdr) * s->shdr_num + - s->note_size; + + s->phdr_offset =3D sizeof(Elf32_Ehdr); + s->shdr_offset =3D s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_n= um; + s->note_offset =3D s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_n= um; + s->memory_offset =3D s->note_offset + s->note_size; } =20 return; --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650628785678706.1018239145315; Fri, 22 Apr 2022 04:59:45 -0700 (PDT) Received: from localhost ([::1]:41184 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrwu-0005JC-MV for importer2@patchew.org; Fri, 22 Apr 2022 07:59:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33062) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLB-0001OX-GF for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:50352) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqL9-0004sM-Q3 for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:41 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-632-gqHloUznONm_HcsXXYPnDA-1; Fri, 22 Apr 2022 06:16:30 -0400 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3A4413833806; Fri, 22 Apr 2022 10:16:14 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5BFCC46A0C0; Fri, 22 Apr 2022 10:16:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622599; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3nbPWrBKFz5isE5nYeLGtAJ4w/fMkY/JV7oDCyphMD4=; b=DQ3m9AZYM7o4hWmenUQCf+lJWAJthpRqK67z9WapwKfc1aBUiPsCZ2bH7ALibU3HRTLVIY 6hKJi0X9TxHHtq2kwGllGkb2jwrWGtArrF7F9yzILLnPY/E/pHfucuha6S8R5hCViEn+5w TraWxfi9bML9+kPxsWv+t0JEMvdcP2w= X-MC-Unique: gqHloUznONm_HcsXXYPnDA-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 06/13] dump: Introduce dump_is_64bit() helper function Date: Fri, 22 Apr 2022 14:15:18 +0400 Message-Id: <20220422101525.3260741-7-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650628786507100001 From: Janosch Frank Checking d_class in dump_info leads to lengthy conditionals so let's shorten things a bit by introducing a helper function. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-7-frankja@linux.ibm.com> --- dump/dump.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 7f226257eec3..b063db134021 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -54,6 +54,11 @@ static Error *dump_migration_blocker; DIV_ROUND_UP((name_size), 4) + \ DIV_ROUND_UP((desc_size), 4)) * 4) =20 +static inline bool dump_is_64bit(DumpState *s) +{ + return s->dump_info.d_class =3D=3D ELFCLASS64; +} + uint16_t cpu_to_dump16(DumpState *s, uint16_t val) { if (s->dump_info.d_endian =3D=3D ELFDATA2LSB) { @@ -488,7 +493,7 @@ static void write_elf_loads(DumpState *s, Error **errp) get_offset_range(memory_mapping->phys_addr, memory_mapping->length, s, &offset, &filesz); - if (s->dump_info.d_class =3D=3D ELFCLASS64) { + if (dump_is_64bit(s)) { write_elf64_load(s, memory_mapping, phdr_index++, offset, filesz, errp); } else { @@ -536,7 +541,7 @@ static void dump_begin(DumpState *s, Error **errp) */ =20 /* write elf header to vmcore */ - if (s->dump_info.d_class =3D=3D ELFCLASS64) { + if (dump_is_64bit(s)) { write_elf64_header(s, errp); } else { write_elf32_header(s, errp); @@ -545,7 +550,7 @@ static void dump_begin(DumpState *s, Error **errp) return; } =20 - if (s->dump_info.d_class =3D=3D ELFCLASS64) { + if (dump_is_64bit(s)) { /* write PT_NOTE to vmcore */ write_elf64_note(s, errp); if (*errp) { @@ -756,7 +761,7 @@ static void get_note_sizes(DumpState *s, const void *no= te, uint64_t name_sz; uint64_t desc_sz; =20 - if (s->dump_info.d_class =3D=3D ELFCLASS64) { + if (dump_is_64bit(s)) { const Elf64_Nhdr *hdr =3D note; note_head_sz =3D sizeof(Elf64_Nhdr); name_sz =3D tswap64(hdr->n_namesz); @@ -1016,10 +1021,10 @@ out: =20 static void write_dump_header(DumpState *s, Error **errp) { - if (s->dump_info.d_class =3D=3D ELFCLASS32) { - create_header32(s, errp); - } else { + if (dump_is_64bit(s)) { create_header64(s, errp); + } else { + create_header32(s, errp); } } =20 @@ -1706,8 +1711,8 @@ static void dump_init(DumpState *s, int fd, bool has_= format, uint32_t size; uint16_t format; =20 - note_head_size =3D s->dump_info.d_class =3D=3D ELFCLASS32 ? - sizeof(Elf32_Nhdr) : sizeof(Elf64_Nhdr); + note_head_size =3D dump_is_64bit(s) ? + sizeof(Elf64_Nhdr) : sizeof(Elf32_Nhdr); =20 format =3D le16_to_cpu(vmci->vmcoreinfo.guest_format); size =3D le32_to_cpu(vmci->vmcoreinfo.size); @@ -1810,7 +1815,7 @@ static void dump_init(DumpState *s, int fd, bool has_= format, } } =20 - if (s->dump_info.d_class =3D=3D ELFCLASS64) { + if (dump_is_64bit(s)) { s->phdr_offset =3D sizeof(Elf64_Ehdr); s->shdr_offset =3D s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_n= um; s->note_offset =3D s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_n= um; --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650626816070648.6239832079195; Fri, 22 Apr 2022 04:26:56 -0700 (PDT) Received: from localhost ([::1]:53420 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrR8-00026e-Ub for importer2@patchew.org; Fri, 22 Apr 2022 07:26:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33040) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqL8-0001HY-Em for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:53005) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqL6-0004s5-LP for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:38 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-187-guFB9XEdOxWlligQ8iMrhg-1; Fri, 22 Apr 2022 06:16:35 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 867C2886064; Fri, 22 Apr 2022 10:16:18 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2F98240885A1; Fri, 22 Apr 2022 10:16:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622596; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S5RvyNxXEYShfr4Q7IiYdFz1VRPMbYGzJ+InfSOKIYY=; b=gVcu3Z1Sini6Z3VQJRuDuQl0WD0Luwixk2kttG665s33rHYq2BkoE4NpMhxok5Eya9Ya9w ZMv5yFb5ThczUoze/GLsZm7XsL2w0cbTWHUPMbnChWo6LwIwplVB/Wg8jIO7jZp4WTeEAz c3/RL1wnMoGM34xufXhzFzroxaDFWJQ= X-MC-Unique: guFB9XEdOxWlligQ8iMrhg-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 07/13] dump: Consolidate phdr note writes Date: Fri, 22 Apr 2022 14:15:19 +0400 Message-Id: <20220422101525.3260741-8-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650626817066100001 From: Janosch Frank There's no need to have two write functions. Let's rather have two functions that set the data for elf 32/64 and then write it in a common function. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-8-frankja@linux.ibm.com> --- dump/dump.c | 94 +++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index b063db134021..0d95fc5b7a3c 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -245,24 +245,15 @@ static void write_elf32_load(DumpState *s, MemoryMapp= ing *memory_mapping, } } =20 -static void write_elf64_note(DumpState *s, Error **errp) +static void write_elf64_phdr_note(DumpState *s, Elf64_Phdr *phdr) { - Elf64_Phdr phdr; - int ret; - - memset(&phdr, 0, sizeof(Elf64_Phdr)); - phdr.p_type =3D cpu_to_dump32(s, PT_NOTE); - phdr.p_offset =3D cpu_to_dump64(s, s->note_offset); - phdr.p_paddr =3D 0; - phdr.p_filesz =3D cpu_to_dump64(s, s->note_size); - phdr.p_memsz =3D cpu_to_dump64(s, s->note_size); - phdr.p_vaddr =3D 0; - - ret =3D fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s); - if (ret < 0) { - error_setg_errno(errp, -ret, - "dump: failed to write program header table"); - } + memset(phdr, 0, sizeof(*phdr)); + phdr->p_type =3D cpu_to_dump32(s, PT_NOTE); + phdr->p_offset =3D cpu_to_dump64(s, s->note_offset); + phdr->p_paddr =3D 0; + phdr->p_filesz =3D cpu_to_dump64(s, s->note_size); + phdr->p_memsz =3D cpu_to_dump64(s, s->note_size); + phdr->p_vaddr =3D 0; } =20 static inline int cpu_index(CPUState *cpu) @@ -310,24 +301,15 @@ static void write_elf64_notes(WriteCoreDumpFunction f= , DumpState *s, write_guest_note(f, s, errp); } =20 -static void write_elf32_note(DumpState *s, Error **errp) +static void write_elf32_phdr_note(DumpState *s, Elf32_Phdr *phdr) { - Elf32_Phdr phdr; - int ret; - - memset(&phdr, 0, sizeof(Elf32_Phdr)); - phdr.p_type =3D cpu_to_dump32(s, PT_NOTE); - phdr.p_offset =3D cpu_to_dump32(s, s->note_offset); - phdr.p_paddr =3D 0; - phdr.p_filesz =3D cpu_to_dump32(s, s->note_size); - phdr.p_memsz =3D cpu_to_dump32(s, s->note_size); - phdr.p_vaddr =3D 0; - - ret =3D fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s); - if (ret < 0) { - error_setg_errno(errp, -ret, - "dump: failed to write program header table"); - } + memset(phdr, 0, sizeof(*phdr)); + phdr->p_type =3D cpu_to_dump32(s, PT_NOTE); + phdr->p_offset =3D cpu_to_dump32(s, s->note_offset); + phdr->p_paddr =3D 0; + phdr->p_filesz =3D cpu_to_dump32(s, s->note_size); + phdr->p_memsz =3D cpu_to_dump32(s, s->note_size); + phdr->p_vaddr =3D 0; } =20 static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s, @@ -357,6 +339,32 @@ static void write_elf32_notes(WriteCoreDumpFunction f,= DumpState *s, write_guest_note(f, s, errp); } =20 +static void write_elf_phdr_note(DumpState *s, Error **errp) +{ + ERRP_GUARD(); + Elf32_Phdr phdr32; + Elf64_Phdr phdr64; + void *phdr; + size_t size; + int ret; + + if (dump_is_64bit(s)) { + write_elf64_phdr_note(s, &phdr64); + size =3D sizeof(phdr64); + phdr =3D &phdr64; + } else { + write_elf32_phdr_note(s, &phdr32); + size =3D sizeof(phdr32); + phdr =3D &phdr32; + } + + ret =3D fd_write_vmcore(phdr, size, s); + if (ret < 0) { + error_setg_errno(errp, -ret, + "dump: failed to write program header table"); + } +} + static void write_elf_section(DumpState *s, int type, Error **errp) { Elf32_Shdr shdr32; @@ -550,13 +558,13 @@ static void dump_begin(DumpState *s, Error **errp) return; } =20 - if (dump_is_64bit(s)) { - /* write PT_NOTE to vmcore */ - write_elf64_note(s, errp); - if (*errp) { - return; - } + /* write PT_NOTE to vmcore */ + write_elf_phdr_note(s, errp); + if (*errp) { + return; + } =20 + if (dump_is_64bit(s)) { /* write all PT_LOAD to vmcore */ write_elf_loads(s, errp); if (*errp) { @@ -577,12 +585,6 @@ static void dump_begin(DumpState *s, Error **errp) return; } } else { - /* write PT_NOTE to vmcore */ - write_elf32_note(s, errp); - if (*errp) { - return; - } - /* write all PT_LOAD to vmcore */ write_elf_loads(s, errp); if (*errp) { --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16506270334283.2292263988398417; Fri, 22 Apr 2022 04:30:33 -0700 (PDT) Received: from localhost ([::1]:33500 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrUd-0008PL-Lb for importer2@patchew.org; Fri, 22 Apr 2022 07:30:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33068) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLC-0001Qg-Bs for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:50693) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLA-0004sU-Q7 for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:42 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-518-NJHjkEQIOl-uRJSNDggahQ-1; Fri, 22 Apr 2022 06:16:39 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0DE403C21184; Fri, 22 Apr 2022 10:16:23 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 24E1240EC000; Fri, 22 Apr 2022 10:16:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622600; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V+C4GEug/y+QDL51lRuwik+lTntgUagWVw/Wl00bh5A=; b=buYDpzwSlQ0mBb8kvQSWseS9HpBikRwEeUycrEuLDHaai7d2AzpybsutgkJYCC8/0TVmbR VNgLjldgtKP6AxFq7lnc9MRqunvNeDUXqUMtqDfBb4RXNgfrtL8EznZNXocsPdd5IakmXU PCfDZmGo5abo1GNoE1dZv1YrcSPiZQs= X-MC-Unique: NJHjkEQIOl-uRJSNDggahQ-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 08/13] dump: Cleanup dump_begin write functions Date: Fri, 22 Apr 2022 14:15:20 +0400 Message-Id: <20220422101525.3260741-9-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650627034693100001 From: Janosch Frank There's no need to have a gigantic if in there let's move the elf 32/64 bit logic into the section, segment or note code. Signed-off-by: Janosch Frank Reviewed-by: Richard Henderson Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-9-frankja@linux.ibm.com> --- dump/dump.c | 42 +++++++++++------------------------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 0d95fc5b7a3c..929ef953515c 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -564,46 +564,26 @@ static void dump_begin(DumpState *s, Error **errp) return; } =20 - if (dump_is_64bit(s)) { - /* write all PT_LOAD to vmcore */ - write_elf_loads(s, errp); + /* write all PT_LOAD to vmcore */ + write_elf_loads(s, errp); + if (*errp) { + return; + } + + /* write section to vmcore */ + if (s->shdr_num) { + write_elf_section(s, 1, errp); if (*errp) { return; } + } =20 - /* write section to vmcore */ - if (s->shdr_num) { - write_elf_section(s, 1, errp); - if (*errp) { - return; - } - } - + if (dump_is_64bit(s)) { /* write notes to vmcore */ write_elf64_notes(fd_write_vmcore, s, errp); - if (*errp) { - return; - } } else { - /* write all PT_LOAD to vmcore */ - write_elf_loads(s, errp); - if (*errp) { - return; - } - - /* write section to vmcore */ - if (s->shdr_num) { - write_elf_section(s, 0, errp); - if (*errp) { - return; - } - } - /* write notes to vmcore */ write_elf32_notes(fd_write_vmcore, s, errp); - if (*errp) { - return; - } } } =20 --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650626568884435.71775281162945; Fri, 22 Apr 2022 04:22:48 -0700 (PDT) Received: from localhost ([::1]:45894 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrN9-0004xC-P8 for importer2@patchew.org; Fri, 22 Apr 2022 07:22:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33140) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLJ-0001Zq-1q for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:22109) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLF-0004sr-5V for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:47 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-102-07-9PO7-NGytYoxukwlLBQ-1; Fri, 22 Apr 2022 06:16:42 -0400 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2109C18E532D; Fri, 22 Apr 2022 10:16:27 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4D0E646A0DF; Fri, 22 Apr 2022 10:16:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622604; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fZMzKbc8kxCWrT767HDRzuLwwVI7VB8l10jMiOd54ik=; b=GdBVIwdMvpR2amikpwH4bJKuK0gyUgUo4LvECYWXcR2wga61DAJlXcLa54q4IQVcN55/2P 5py8t0mzIHmwuwZJ9Na4TZ8Fh3lfnXeSU+VhJ5v+68apoopxlZWgQYh7dWire1T1+suQC7 D51Vprh2Vq93WyeakIDKMgdMIYubgaU= X-MC-Unique: 07-9PO7-NGytYoxukwlLBQ-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 09/13] dump: Consolidate elf note function Date: Fri, 22 Apr 2022 14:15:21 +0400 Message-Id: <20220422101525.3260741-10-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650626570332100001 From: Janosch Frank Just like with the other write functions let's move the 32/64 bit elf handling to a function to improve readability. Signed-off-by: Janosch Frank Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220330123603.107120-10-frankja@linux.ibm.com> --- dump/dump.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 929ef953515c..4d9658ffa24f 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -519,6 +519,15 @@ static void write_elf_loads(DumpState *s, Error **errp) } } =20 +static void write_elf_notes(DumpState *s, Error **errp) +{ + if (dump_is_64bit(s)) { + write_elf64_notes(fd_write_vmcore, s, errp); + } else { + write_elf32_notes(fd_write_vmcore, s, errp); + } +} + /* write elf header, PT_NOTE and elf note to vmcore. */ static void dump_begin(DumpState *s, Error **errp) { @@ -578,13 +587,8 @@ static void dump_begin(DumpState *s, Error **errp) } } =20 - if (dump_is_64bit(s)) { - /* write notes to vmcore */ - write_elf64_notes(fd_write_vmcore, s, errp); - } else { - /* write notes to vmcore */ - write_elf32_notes(fd_write_vmcore, s, errp); - } + /* write notes to vmcore */ + write_elf_notes(s, errp); } =20 static int get_next_block(DumpState *s, GuestPhysBlock *block) --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650627438727449.5111142164602; Fri, 22 Apr 2022 04:37:18 -0700 (PDT) Received: from localhost ([::1]:50114 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrbB-0004fd-OA for importer2@patchew.org; Fri, 22 Apr 2022 07:37:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33142) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLJ-0001Zv-3W for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:28130) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLF-0004st-84 for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:48 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-668-TT0aefUSOB6uIPWtabqUWA-1; Fri, 22 Apr 2022 06:16:43 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E95BC806613; Fri, 22 Apr 2022 10:16:31 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 93B06415F5F; Fri, 22 Apr 2022 10:16:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622604; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=y1MjqZTYFRrQne6LN0s4LaacTtvSOZRT2GmCtGvpnyg=; b=TK9qq7idHM5K1UbW2iV3lckH4fKjpufvCARXhaTpzztBEb90lrAgFo4SqVPd3+5hYVLpSA HHnRXB0H4Xtmzg3seK1Yz0qTmMiQplwL2CSe7BU4BxMJTzWkmZ/KJE9lfUDeedrCbekK/O kRxv5yOKwOqfr5Lf1K6om40V26Fp6wQ= X-MC-Unique: TT0aefUSOB6uIPWtabqUWA-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 10/13] include/qemu: rename Windows context definitions to expose bitness Date: Fri, 22 Apr 2022 14:15:22 +0400 Message-Id: <20220422101525.3260741-11-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com, Viktor Prutyanov Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650627440316100001 From: Viktor Prutyanov Context structure in 64-bit Windows differs from 32-bit one and it should be reflected in its name. Signed-off-by: Viktor Prutyanov Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220406171558.199263-2-viktor.prutyanov@redhat.com> --- include/qemu/win_dump_defs.h | 8 ++++---- contrib/elf2dmp/main.c | 6 +++--- dump/win_dump.c | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/qemu/win_dump_defs.h b/include/qemu/win_dump_defs.h index 145096e8ee79..5a5e5a5e0989 100644 --- a/include/qemu/win_dump_defs.h +++ b/include/qemu/win_dump_defs.h @@ -97,8 +97,8 @@ typedef struct WinDumpHeader64 { #define WIN_CTX_FP 0x00000008L #define WIN_CTX_DBG 0x00000010L =20 -#define WIN_CTX_FULL (WIN_CTX_X64 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX= _FP) -#define WIN_CTX_ALL (WIN_CTX_FULL | WIN_CTX_SEG | WIN_CTX_DBG) +#define WIN_CTX64_FULL (WIN_CTX_X64 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX= _FP) +#define WIN_CTX64_ALL (WIN_CTX64_FULL | WIN_CTX_SEG | WIN_CTX_DBG) =20 #define LIVE_SYSTEM_DUMP 0x00000161 =20 @@ -107,7 +107,7 @@ typedef struct WinM128A { int64_t high; } QEMU_ALIGNED(16) WinM128A; =20 -typedef struct WinContext { +typedef struct WinContext64 { uint64_t PHome[6]; =20 uint32_t ContextFlags; @@ -174,6 +174,6 @@ typedef struct WinContext { uint64_t LastBranchFromRip; uint64_t LastExceptionToRip; uint64_t LastExceptionFromRip; -} QEMU_ALIGNED(16) WinContext; +} QEMU_ALIGNED(16) WinContext64; =20 #endif /* QEMU_WIN_DUMP_DEFS_H */ diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c index 20b477d582a4..b9fc6d230ca0 100644 --- a/contrib/elf2dmp/main.c +++ b/contrib/elf2dmp/main.c @@ -141,10 +141,10 @@ static KDDEBUGGER_DATA64 *get_kdbg(uint64_t KernBase,= struct pdb_reader *pdb, return kdbg; } =20 -static void win_context_init_from_qemu_cpu_state(WinContext *ctx, +static void win_context_init_from_qemu_cpu_state(WinContext64 *ctx, QEMUCPUState *s) { - WinContext win_ctx =3D (WinContext){ + WinContext64 win_ctx =3D (WinContext64){ .ContextFlags =3D WIN_CTX_X64 | WIN_CTX_INT | WIN_CTX_SEG | WIN_CT= X_CTL, .MxCsr =3D INITIAL_MXCSR, =20 @@ -302,7 +302,7 @@ static int fill_context(KDDEBUGGER_DATA64 *kdbg, for (i =3D 0; i < qe->state_nr; i++) { uint64_t Prcb; uint64_t Context; - WinContext ctx; + WinContext64 ctx; QEMUCPUState *s =3D qe->state[i]; =20 if (va_space_rw(vs, kdbg->KiProcessorBlock + sizeof(Prcb) * i, diff --git a/dump/win_dump.c b/dump/win_dump.c index fbdbb7bd93a6..e9215e4fd5e5 100644 --- a/dump/win_dump.c +++ b/dump/win_dump.c @@ -188,7 +188,7 @@ try_again: } =20 struct saved_context { - WinContext ctx; + WinContext64 ctx; uint64_t addr; }; =20 @@ -220,7 +220,7 @@ static void patch_and_save_context(WinDumpHeader64 *h, CPUX86State *env =3D &x86_cpu->env; uint64_t Prcb; uint64_t Context; - WinContext ctx; + WinContext64 ctx; =20 if (cpu_memory_rw_debug(first_cpu, KiProcessorBlock + i * sizeof(uint64_t), @@ -240,8 +240,8 @@ static void patch_and_save_context(WinDumpHeader64 *h, =20 saved_ctx[i].addr =3D Context; =20 - ctx =3D (WinContext){ - .ContextFlags =3D WIN_CTX_ALL, + ctx =3D (WinContext64){ + .ContextFlags =3D WIN_CTX64_ALL, .MxCsr =3D env->mxcsr, =20 .SegEs =3D env->segs[0].selector, @@ -283,13 +283,13 @@ static void patch_and_save_context(WinDumpHeader64 *h, }; =20 if (cpu_memory_rw_debug(first_cpu, Context, - (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext), 0)) { + (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext64), 0)) { error_setg(errp, "win-dump: failed to save CPU #%d context", i= ); return; } =20 if (cpu_memory_rw_debug(first_cpu, Context, - (uint8_t *)&ctx, sizeof(WinContext), 1)) { + (uint8_t *)&ctx, sizeof(WinContext64), 1)) { error_setg(errp, "win-dump: failed to write CPU #%d context", = i); return; } @@ -305,7 +305,7 @@ static void restore_context(WinDumpHeader64 *h, =20 for (i =3D 0; i < h->NumberProcessors; i++) { if (cpu_memory_rw_debug(first_cpu, saved_ctx[i].addr, - (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext), 1)) { + (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext64), 1)) { warn_report("win-dump: failed to restore CPU #%d context", i); } } --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650627849851861.3195774057601; Fri, 22 Apr 2022 04:44:09 -0700 (PDT) Received: from localhost ([::1]:58786 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrho-0003LJ-Ka for importer2@patchew.org; Fri, 22 Apr 2022 07:44:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33144) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLJ-0001Zy-5N for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:29617) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLF-0004sy-DH for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:48 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-303-t7xp0O77MA6n9iBLG1mI1g-1; Fri, 22 Apr 2022 06:16:43 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2F74180C51F; Fri, 22 Apr 2022 10:16:36 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 04E8040EC000; Fri, 22 Apr 2022 10:16:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622604; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zSqzJ3jWNXX/jgDQ0/SGXPV+P0gsCODNd2auoCmhZ9c=; b=BD5IMwbUcVQ7k2p7UNvRhi57AS3zQ7Rl1gzke7gfpE9DVjDPeyVhkN3BREfegqSyIJaYbN UfjHcmUBPcdewLaZ2bKwpdMr9inDdnOWaos5MUInJpfY3uqUP6FSfBQcVMaQH5yMkB6rHG veItvAmbXoGGn/DWT/hX3fToKWz7o7I= X-MC-Unique: t7xp0O77MA6n9iBLG1mI1g-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 11/13] dump/win_dump: add helper macros for Windows dump header access Date: Fri, 22 Apr 2022 14:15:23 +0400 Message-Id: <20220422101525.3260741-12-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650627851009100001 From: Viktor Prutyanov Perform read access to Windows dump header fields via helper macros. This is preparation for the next 32-bit guest Windows dump support. Signed-off-by: Viktor Prutyanov Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220406171558.199263-3-viktor.prutyanov@redhat.com> --- dump/win_dump.c | 100 +++++++++++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/dump/win_dump.c b/dump/win_dump.c index e9215e4fd5e5..d733918038b2 100644 --- a/dump/win_dump.c +++ b/dump/win_dump.c @@ -23,11 +23,25 @@ #include "hw/misc/vmcoreinfo.h" #include "win_dump.h" =20 -static size_t write_run(WinDumpPhyMemRun64 *run, int fd, Error **errp) +#define WIN_DUMP_PTR_SIZE sizeof(uint64_t) + +#define _WIN_DUMP_FIELD(f) (h->f) +#define WIN_DUMP_FIELD(field) _WIN_DUMP_FIELD(field) + +#define _WIN_DUMP_FIELD_PTR(f) ((void *)&h->f) +#define WIN_DUMP_FIELD_PTR(field) _WIN_DUMP_FIELD_PTR(field) + +#define _WIN_DUMP_FIELD_SIZE(f) sizeof(h->f) +#define WIN_DUMP_FIELD_SIZE(field) _WIN_DUMP_FIELD_SIZE(field) + +#define WIN_DUMP_CTX_SIZE sizeof(WinContext64) + +static size_t write_run(uint64_t base_page, uint64_t page_count, + int fd, Error **errp) { void *buf; - uint64_t addr =3D run->BasePage << TARGET_PAGE_BITS; - uint64_t size =3D run->PageCount << TARGET_PAGE_BITS; + uint64_t addr =3D base_page << TARGET_PAGE_BITS; + uint64_t size =3D page_count << TARGET_PAGE_BITS; uint64_t len, l; size_t total =3D 0; =20 @@ -58,13 +72,14 @@ static size_t write_run(WinDumpPhyMemRun64 *run, int fd= , Error **errp) =20 static void write_runs(DumpState *s, WinDumpHeader64 *h, Error **errp) { - WinDumpPhyMemDesc64 *desc =3D &h->PhysicalMemoryBlock; - WinDumpPhyMemRun64 *run =3D desc->Run; + uint64_t BasePage, PageCount; Error *local_err =3D NULL; int i; =20 - for (i =3D 0; i < desc->NumberOfRuns; i++) { - s->written_size +=3D write_run(run + i, s->fd, &local_err); + for (i =3D 0; i < WIN_DUMP_FIELD(PhysicalMemoryBlock.NumberOfRuns); i+= +) { + BasePage =3D WIN_DUMP_FIELD(PhysicalMemoryBlock.Run[i].BasePage); + PageCount =3D WIN_DUMP_FIELD(PhysicalMemoryBlock.Run[i].PageCount); + s->written_size +=3D write_run(BasePage, PageCount, s->fd, &local_= err); if (local_err) { error_propagate(errp, local_err); return; @@ -72,11 +87,24 @@ static void write_runs(DumpState *s, WinDumpHeader64 *h= , Error **errp) } } =20 +static int cpu_read_ptr(CPUState *cpu, uint64_t addr, uint64_t *ptr) +{ + int ret; + uint64_t ptr64; + + ret =3D cpu_memory_rw_debug(cpu, addr, &ptr64, WIN_DUMP_PTR_SIZE, 0); + + *ptr =3D ptr64; + + return ret; +} + static void patch_mm_pfn_database(WinDumpHeader64 *h, Error **errp) { if (cpu_memory_rw_debug(first_cpu, - h->KdDebuggerDataBlock + KDBG_MM_PFN_DATABASE_OFFSET64, - (uint8_t *)&h->PfnDatabase, sizeof(h->PfnDatabase), 0)) { + WIN_DUMP_FIELD(KdDebuggerDataBlock) + KDBG_MM_PFN_DATABASE_OFF= SET64, + WIN_DUMP_FIELD_PTR(PfnDatabase), + WIN_DUMP_FIELD_SIZE(PfnDatabase), 0)) { error_setg(errp, "win-dump: failed to read MmPfnDatabase"); return; } @@ -86,16 +114,17 @@ static void patch_bugcheck_data(WinDumpHeader64 *h, Er= ror **errp) { uint64_t KiBugcheckData; =20 - if (cpu_memory_rw_debug(first_cpu, - h->KdDebuggerDataBlock + KDBG_KI_BUGCHECK_DATA_OFFSET64, - (uint8_t *)&KiBugcheckData, sizeof(KiBugcheckData), 0)) { + if (cpu_read_ptr(first_cpu, + WIN_DUMP_FIELD(KdDebuggerDataBlock) + + KDBG_KI_BUGCHECK_DATA_OFFSET64, + &KiBugcheckData)) { error_setg(errp, "win-dump: failed to read KiBugcheckData"); return; } =20 - if (cpu_memory_rw_debug(first_cpu, - KiBugcheckData, - h->BugcheckData, sizeof(h->BugcheckData), 0)) { + if (cpu_memory_rw_debug(first_cpu, KiBugcheckData, + WIN_DUMP_FIELD(BugcheckData), + WIN_DUMP_FIELD_SIZE(BugcheckData), 0)) { error_setg(errp, "win-dump: failed to read bugcheck data"); return; } @@ -104,8 +133,8 @@ static void patch_bugcheck_data(WinDumpHeader64 *h, Err= or **errp) * If BugcheckCode wasn't saved, we consider guest OS as alive. */ =20 - if (!h->BugcheckCode) { - h->BugcheckCode =3D LIVE_SYSTEM_DUMP; + if (!WIN_DUMP_FIELD(BugcheckCode)) { + *(uint32_t *)WIN_DUMP_FIELD_PTR(BugcheckCode) =3D LIVE_SYSTEM_DUMP; } } =20 @@ -154,7 +183,7 @@ static void check_kdbg(WinDumpHeader64 *h, Error **errp) { const char OwnerTag[] =3D "KDBG"; char read_OwnerTag[4]; - uint64_t KdDebuggerDataBlock =3D h->KdDebuggerDataBlock; + uint64_t KdDebuggerDataBlock =3D WIN_DUMP_FIELD(KdDebuggerDataBlock); bool try_fallback =3D true; =20 try_again: @@ -173,7 +202,7 @@ try_again: * we try to use KDBG obtained by guest driver. */ =20 - KdDebuggerDataBlock =3D h->BugcheckParameter1; + KdDebuggerDataBlock =3D WIN_DUMP_FIELD(BugcheckParameter1); try_fallback =3D false; goto try_again; } else { @@ -196,20 +225,21 @@ static void patch_and_save_context(WinDumpHeader64 *h, struct saved_context *saved_ctx, Error **errp) { + uint64_t KdDebuggerDataBlock =3D WIN_DUMP_FIELD(KdDebuggerDataBlock); uint64_t KiProcessorBlock; uint16_t OffsetPrcbContext; CPUState *cpu; int i =3D 0; =20 - if (cpu_memory_rw_debug(first_cpu, - h->KdDebuggerDataBlock + KDBG_KI_PROCESSOR_BLOCK_OFFSET64, - (uint8_t *)&KiProcessorBlock, sizeof(KiProcessorBlock), 0)) { + if (cpu_read_ptr(first_cpu, + KdDebuggerDataBlock + KDBG_KI_PROCESSOR_BLOCK_OFFSET64, + &KiProcessorBlock)) { error_setg(errp, "win-dump: failed to read KiProcessorBlock"); return; } =20 if (cpu_memory_rw_debug(first_cpu, - h->KdDebuggerDataBlock + KDBG_OFFSET_PRCB_CONTEXT_OFFSET64, + KdDebuggerDataBlock + KDBG_OFFSET_PRCB_CONTEXT_OFFSET64, (uint8_t *)&OffsetPrcbContext, sizeof(OffsetPrcbContext), 0)) { error_setg(errp, "win-dump: failed to read OffsetPrcbContext"); return; @@ -222,17 +252,17 @@ static void patch_and_save_context(WinDumpHeader64 *h, uint64_t Context; WinContext64 ctx; =20 - if (cpu_memory_rw_debug(first_cpu, - KiProcessorBlock + i * sizeof(uint64_t), - (uint8_t *)&Prcb, sizeof(Prcb), 0)) { + if (cpu_read_ptr(first_cpu, + KiProcessorBlock + i * WIN_DUMP_PTR_SIZE, + &Prcb)) { error_setg(errp, "win-dump: failed to read" " CPU #%d PRCB location", i); return; } =20 - if (cpu_memory_rw_debug(first_cpu, + if (cpu_read_ptr(first_cpu, Prcb + OffsetPrcbContext, - (uint8_t *)&Context, sizeof(Context), 0)) { + &Context)) { error_setg(errp, "win-dump: failed to read" " CPU #%d ContextFrame location", i); return; @@ -283,13 +313,13 @@ static void patch_and_save_context(WinDumpHeader64 *h, }; =20 if (cpu_memory_rw_debug(first_cpu, Context, - (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext64), 0)) { + &saved_ctx[i].ctx, WIN_DUMP_CTX_SIZE, 0)) { error_setg(errp, "win-dump: failed to save CPU #%d context", i= ); return; } =20 if (cpu_memory_rw_debug(first_cpu, Context, - (uint8_t *)&ctx, sizeof(WinContext64), 1)) { + &ctx, WIN_DUMP_CTX_SIZE, 1)) { error_setg(errp, "win-dump: failed to write CPU #%d context", = i); return; } @@ -303,9 +333,9 @@ static void restore_context(WinDumpHeader64 *h, { int i; =20 - for (i =3D 0; i < h->NumberProcessors; i++) { + for (i =3D 0; i < WIN_DUMP_FIELD(NumberProcessors); i++) { if (cpu_memory_rw_debug(first_cpu, saved_ctx[i].addr, - (uint8_t *)&saved_ctx[i].ctx, sizeof(WinContext64), 1)) { + &saved_ctx[i].ctx, WIN_DUMP_CTX_SIZE, 1)) { warn_report("win-dump: failed to restore CPU #%d context", i); } } @@ -337,7 +367,7 @@ void create_win_dump(DumpState *s, Error **errp) * should be made from system context. */ =20 - first_x86_cpu->env.cr[3] =3D h->DirectoryTableBase; + first_x86_cpu->env.cr[3] =3D WIN_DUMP_FIELD(DirectoryTableBase); =20 check_kdbg(h, &local_err); if (local_err) { @@ -347,7 +377,7 @@ void create_win_dump(DumpState *s, Error **errp) =20 patch_header(h); =20 - saved_ctx =3D g_new(struct saved_context, h->NumberProcessors); + saved_ctx =3D g_new(struct saved_context, WIN_DUMP_FIELD(NumberProcess= ors)); =20 /* * Always patch context because there is no way @@ -360,7 +390,7 @@ void create_win_dump(DumpState *s, Error **errp) goto out_free; } =20 - s->total_size =3D h->RequiredDumpSpace; + s->total_size =3D WIN_DUMP_FIELD(RequiredDumpSpace); =20 s->written_size =3D qemu_write_full(s->fd, h, sizeof(*h)); if (s->written_size !=3D sizeof(*h)) { --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650627238223226.42756442842597; Fri, 22 Apr 2022 04:33:58 -0700 (PDT) Received: from localhost ([::1]:41940 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrXx-0006qX-1F for importer2@patchew.org; Fri, 22 Apr 2022 07:33:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33110) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLG-0001Xl-OF for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:44588) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLE-0004so-Uj for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:46 -0400 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-552-QnQizBptPC-Cc5LsUUgjsQ-1; Fri, 22 Apr 2022 06:16:41 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C348A29AA2F0; Fri, 22 Apr 2022 10:16:40 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 97F1740D0174; Fri, 22 Apr 2022 10:16:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622604; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DCkl8eJnoPYOTy/MzJ7Gpf2r/mA2NvJ6Yww2tEiXpko=; b=F1qV6rtS0OTA27IFHbZ8AKL8Cj2ukd/cxqNYpgPzF1PF4ZZUrEmoZAn7eYl4jbLrf1O4E+ kiTxAK5lUlm/EWWkIEp+Xzh9bi+wCqfP0qeq27tbYPxQTfsCmul6mKM27QtZa/Tf1gEi3F Hwe5Z7EVlTC448WxeE8Xjh/HblRYbWI= X-MC-Unique: QnQizBptPC-Cc5LsUUgjsQ-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 12/13] include/qemu: add 32-bit Windows dump structures Date: Fri, 22 Apr 2022 14:15:24 +0400 Message-Id: <20220422101525.3260741-13-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650627239884100001 From: Viktor Prutyanov These structures are required to produce 32-bit guest Windows Complete Memory Dump. Add 32-bit Windows dump header, CPU context and physical memory descriptor structures along with corresponding definitions. Signed-off-by: Viktor Prutyanov Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220406171558.199263-4-viktor.prutyanov@redhat.com> --- include/qemu/win_dump_defs.h | 107 +++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/include/qemu/win_dump_defs.h b/include/qemu/win_dump_defs.h index 5a5e5a5e0989..73a44e2408c2 100644 --- a/include/qemu/win_dump_defs.h +++ b/include/qemu/win_dump_defs.h @@ -11,11 +11,22 @@ #ifndef QEMU_WIN_DUMP_DEFS_H #define QEMU_WIN_DUMP_DEFS_H =20 +typedef struct WinDumpPhyMemRun32 { + uint32_t BasePage; + uint32_t PageCount; +} QEMU_PACKED WinDumpPhyMemRun32; + typedef struct WinDumpPhyMemRun64 { uint64_t BasePage; uint64_t PageCount; } QEMU_PACKED WinDumpPhyMemRun64; =20 +typedef struct WinDumpPhyMemDesc32 { + uint32_t NumberOfRuns; + uint32_t NumberOfPages; + WinDumpPhyMemRun32 Run[86]; +} QEMU_PACKED WinDumpPhyMemDesc32; + typedef struct WinDumpPhyMemDesc64 { uint32_t NumberOfRuns; uint32_t unused; @@ -33,6 +44,39 @@ typedef struct WinDumpExceptionRecord { uint64_t ExceptionInformation[15]; } QEMU_PACKED WinDumpExceptionRecord; =20 +typedef struct WinDumpHeader32 { + char Signature[4]; + char ValidDump[4]; + uint32_t MajorVersion; + uint32_t MinorVersion; + uint32_t DirectoryTableBase; + uint32_t PfnDatabase; + uint32_t PsLoadedModuleList; + uint32_t PsActiveProcessHead; + uint32_t MachineImageType; + uint32_t NumberProcessors; + union { + struct { + uint32_t BugcheckCode; + uint32_t BugcheckParameter1; + uint32_t BugcheckParameter2; + uint32_t BugcheckParameter3; + uint32_t BugcheckParameter4; + }; + uint8_t BugcheckData[20]; + }; + uint8_t VersionUser[32]; + uint32_t reserved0; + uint32_t KdDebuggerDataBlock; + union { + WinDumpPhyMemDesc32 PhysicalMemoryBlock; + uint8_t PhysicalMemoryBlockBuffer[700]; + }; + uint8_t reserved1[3200]; + uint32_t RequiredDumpSpace; + uint8_t reserved2[92]; +} QEMU_PACKED WinDumpHeader32; + typedef struct WinDumpHeader64 { char Signature[4]; char ValidDump[4]; @@ -81,25 +125,49 @@ typedef struct WinDumpHeader64 { uint8_t reserved[4018]; } QEMU_PACKED WinDumpHeader64; =20 +typedef union WinDumpHeader { + struct { + char Signature[4]; + char ValidDump[4]; + }; + WinDumpHeader32 x32; + WinDumpHeader64 x64; +} WinDumpHeader; + #define KDBG_OWNER_TAG_OFFSET64 0x10 #define KDBG_MM_PFN_DATABASE_OFFSET64 0xC0 #define KDBG_KI_BUGCHECK_DATA_OFFSET64 0x88 #define KDBG_KI_PROCESSOR_BLOCK_OFFSET64 0x218 #define KDBG_OFFSET_PRCB_CONTEXT_OFFSET64 0x338 =20 +#define KDBG_OWNER_TAG_OFFSET KDBG_OWNER_TAG_OFFSET64 +#define KDBG_MM_PFN_DATABASE_OFFSET KDBG_MM_PFN_DATABASE_OFFSET64 +#define KDBG_KI_BUGCHECK_DATA_OFFSET KDBG_KI_BUGCHECK_DATA_OFFSET64 +#define KDBG_KI_PROCESSOR_BLOCK_OFFSET KDBG_KI_PROCESSOR_BLOCK_OFFSET64 +#define KDBG_OFFSET_PRCB_CONTEXT_OFFSET KDBG_OFFSET_PRCB_CONTEXT_OFFSET64 + #define VMCOREINFO_ELF_NOTE_HDR_SIZE 24 +#define VMCOREINFO_WIN_DUMP_NOTE_SIZE64 (sizeof(WinDumpHeader64) + \ + VMCOREINFO_ELF_NOTE_HDR_SIZE) +#define VMCOREINFO_WIN_DUMP_NOTE_SIZE32 (sizeof(WinDumpHeader32) + \ + VMCOREINFO_ELF_NOTE_HDR_SIZE) =20 #define WIN_CTX_X64 0x00100000L +#define WIN_CTX_X86 0x00010000L =20 #define WIN_CTX_CTL 0x00000001L #define WIN_CTX_INT 0x00000002L #define WIN_CTX_SEG 0x00000004L #define WIN_CTX_FP 0x00000008L #define WIN_CTX_DBG 0x00000010L +#define WIN_CTX_EXT 0x00000020L =20 #define WIN_CTX64_FULL (WIN_CTX_X64 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX= _FP) #define WIN_CTX64_ALL (WIN_CTX64_FULL | WIN_CTX_SEG | WIN_CTX_DBG) =20 +#define WIN_CTX32_FULL (WIN_CTX_X86 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX_= SEG) +#define WIN_CTX32_ALL (WIN_CTX32_FULL | WIN_CTX_FP | WIN_CTX_DBG | WIN_CTX= _EXT) + #define LIVE_SYSTEM_DUMP 0x00000161 =20 typedef struct WinM128A { @@ -107,6 +175,40 @@ typedef struct WinM128A { int64_t high; } QEMU_ALIGNED(16) WinM128A; =20 +typedef struct WinContext32 { + uint32_t ContextFlags; + + uint32_t Dr0; + uint32_t Dr1; + uint32_t Dr2; + uint32_t Dr3; + uint32_t Dr6; + uint32_t Dr7; + + uint8_t FloatSave[112]; + + uint32_t SegGs; + uint32_t SegFs; + uint32_t SegEs; + uint32_t SegDs; + + uint32_t Edi; + uint32_t Esi; + uint32_t Ebx; + uint32_t Edx; + uint32_t Ecx; + uint32_t Eax; + + uint32_t Ebp; + uint32_t Eip; + uint32_t SegCs; + uint32_t EFlags; + uint32_t Esp; + uint32_t SegSs; + + uint8_t ExtendedRegisters[512]; +} QEMU_ALIGNED(16) WinContext32; + typedef struct WinContext64 { uint64_t PHome[6]; =20 @@ -176,4 +278,9 @@ typedef struct WinContext64 { uint64_t LastExceptionFromRip; } QEMU_ALIGNED(16) WinContext64; =20 +typedef union WinContext { + WinContext32 x32; + WinContext64 x64; +} WinContext; + #endif /* QEMU_WIN_DUMP_DEFS_H */ --=20 2.36.0 From nobody Sat Apr 27 17:25:21 2024 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1650626765673637.1014594552025; Fri, 22 Apr 2022 04:26:05 -0700 (PDT) Received: from localhost ([::1]:53188 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nhrQK-0001xG-Hz for importer2@patchew.org; Fri, 22 Apr 2022 07:26:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33156) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLL-0001er-8c for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:21920) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhqLI-0004tG-PR for qemu-devel@nongnu.org; Fri, 22 Apr 2022 06:16:50 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-126-faGv3Cn5PnKqcy-Q9jVQ0g-1; Fri, 22 Apr 2022 06:16:46 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A7E20105A404; Fri, 22 Apr 2022 10:16:45 +0000 (UTC) Received: from localhost (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id E15B2C28107; Fri, 22 Apr 2022 10:16:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650622607; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HXwrRFIl3MKJX75HV4mLMd8urc9MXKNUMtnL7Yxa1mg=; b=aNkvT5IkunpSLmRJe/WkHplIskBPzScNVl8Ft6xGiWvqyMqOwZUig0exuNPl9KKCXct0uH Xf1uGiMWbriLkAaDOupMk4pTjH+bhSKH2vNN07A1gBXxb1sqIayK70qbdsVgvK+29GT9fq PqhbnbKeryChzbaBn/pM9xBMmUUx/L8= X-MC-Unique: faGv3Cn5PnKqcy-Q9jVQ0g-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Subject: [PULL v2 13/13] dump/win_dump: add 32-bit guest Windows support Date: Fri, 22 Apr 2022 14:15:25 +0400 Message-Id: <20220422101525.3260741-14-marcandre.lureau@redhat.com> In-Reply-To: <20220422101525.3260741-1-marcandre.lureau@redhat.com> References: <20220422101525.3260741-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , viktor.prutyanov@redhat.com, richard.henderson@linaro.org, frankja@linux.ibm.com, "Dr. David Alan Gilbert" Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1650626766907100001 From: Viktor Prutyanov Before this patch, 'dump-guest-memory -w' was accepting only 64-bit dump header provided by guest through vmcoreinfo and thus was unable to produce 32-bit guest Windows dump. So, add 32-bit guest Windows dumping support. Signed-off-by: Viktor Prutyanov Reviewed-by: Philippe Mathieu-Daud=C3=A9 [ misc error handling fixes to avoid compiler warning ] Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20220406171558.199263-5-viktor.prutyanov@redhat.com> --- dump/win_dump.c | 251 +++++++++++++++++++++++++++++------------------- hmp-commands.hx | 2 +- 2 files changed, 154 insertions(+), 99 deletions(-) diff --git a/dump/win_dump.c b/dump/win_dump.c index d733918038b2..fd91350fbb8e 100644 --- a/dump/win_dump.c +++ b/dump/win_dump.c @@ -23,18 +23,24 @@ #include "hw/misc/vmcoreinfo.h" #include "win_dump.h" =20 -#define WIN_DUMP_PTR_SIZE sizeof(uint64_t) +static size_t win_dump_ptr_size(bool x64) +{ + return x64 ? sizeof(uint64_t) : sizeof(uint32_t); +} =20 -#define _WIN_DUMP_FIELD(f) (h->f) +#define _WIN_DUMP_FIELD(f) (x64 ? h->x64.f : h->x32.f) #define WIN_DUMP_FIELD(field) _WIN_DUMP_FIELD(field) =20 -#define _WIN_DUMP_FIELD_PTR(f) ((void *)&h->f) +#define _WIN_DUMP_FIELD_PTR(f) (x64 ? (void *)&h->x64.f : (void *)&h->x32.= f) #define WIN_DUMP_FIELD_PTR(field) _WIN_DUMP_FIELD_PTR(field) =20 -#define _WIN_DUMP_FIELD_SIZE(f) sizeof(h->f) +#define _WIN_DUMP_FIELD_SIZE(f) (x64 ? sizeof(h->x64.f) : sizeof(h->x32.f)) #define WIN_DUMP_FIELD_SIZE(field) _WIN_DUMP_FIELD_SIZE(field) =20 -#define WIN_DUMP_CTX_SIZE sizeof(WinContext64) +static size_t win_dump_ctx_size(bool x64) +{ + return x64 ? sizeof(WinContext64) : sizeof(WinContext32); +} =20 static size_t write_run(uint64_t base_page, uint64_t page_count, int fd, Error **errp) @@ -70,7 +76,7 @@ static size_t write_run(uint64_t base_page, uint64_t page= _count, return total; } =20 -static void write_runs(DumpState *s, WinDumpHeader64 *h, Error **errp) +static void write_runs(DumpState *s, WinDumpHeader *h, bool x64, Error **e= rrp) { uint64_t BasePage, PageCount; Error *local_err =3D NULL; @@ -87,22 +93,24 @@ static void write_runs(DumpState *s, WinDumpHeader64 *h= , Error **errp) } } =20 -static int cpu_read_ptr(CPUState *cpu, uint64_t addr, uint64_t *ptr) +static int cpu_read_ptr(bool x64, CPUState *cpu, uint64_t addr, uint64_t *= ptr) { int ret; + uint32_t ptr32; uint64_t ptr64; =20 - ret =3D cpu_memory_rw_debug(cpu, addr, &ptr64, WIN_DUMP_PTR_SIZE, 0); + ret =3D cpu_memory_rw_debug(cpu, addr, x64 ? (void *)&ptr64 : (void *)= &ptr32, + win_dump_ptr_size(x64), 0); =20 - *ptr =3D ptr64; + *ptr =3D x64 ? ptr64 : ptr32; =20 return ret; } =20 -static void patch_mm_pfn_database(WinDumpHeader64 *h, Error **errp) +static void patch_mm_pfn_database(WinDumpHeader *h, bool x64, Error **errp) { if (cpu_memory_rw_debug(first_cpu, - WIN_DUMP_FIELD(KdDebuggerDataBlock) + KDBG_MM_PFN_DATABASE_OFF= SET64, + WIN_DUMP_FIELD(KdDebuggerDataBlock) + KDBG_MM_PFN_DATABASE_OFF= SET, WIN_DUMP_FIELD_PTR(PfnDatabase), WIN_DUMP_FIELD_SIZE(PfnDatabase), 0)) { error_setg(errp, "win-dump: failed to read MmPfnDatabase"); @@ -110,13 +118,12 @@ static void patch_mm_pfn_database(WinDumpHeader64 *h,= Error **errp) } } =20 -static void patch_bugcheck_data(WinDumpHeader64 *h, Error **errp) +static void patch_bugcheck_data(WinDumpHeader *h, bool x64, Error **errp) { uint64_t KiBugcheckData; =20 - if (cpu_read_ptr(first_cpu, - WIN_DUMP_FIELD(KdDebuggerDataBlock) + - KDBG_KI_BUGCHECK_DATA_OFFSET64, + if (cpu_read_ptr(x64, first_cpu, + WIN_DUMP_FIELD(KdDebuggerDataBlock) + KDBG_KI_BUGCHECK_DATA_OF= FSET, &KiBugcheckData)) { error_setg(errp, "win-dump: failed to read KiBugcheckData"); return; @@ -141,45 +148,55 @@ static void patch_bugcheck_data(WinDumpHeader64 *h, E= rror **errp) /* * This routine tries to correct mistakes in crashdump header. */ -static void patch_header(WinDumpHeader64 *h) +static void patch_header(WinDumpHeader *h, bool x64) { Error *local_err =3D NULL; =20 - h->RequiredDumpSpace =3D sizeof(WinDumpHeader64) + - (h->PhysicalMemoryBlock.NumberOfPages << TARGET_PAGE_BITS); - h->PhysicalMemoryBlock.unused =3D 0; - h->unused1 =3D 0; + if (x64) { + h->x64.RequiredDumpSpace =3D sizeof(WinDumpHeader64) + + (h->x64.PhysicalMemoryBlock.NumberOfPages << TARGET_PAGE_BITS); + h->x64.PhysicalMemoryBlock.unused =3D 0; + h->x64.unused1 =3D 0; + } else { + h->x32.RequiredDumpSpace =3D sizeof(WinDumpHeader32) + + (h->x32.PhysicalMemoryBlock.NumberOfPages << TARGET_PAGE_BITS); + } =20 - patch_mm_pfn_database(h, &local_err); + patch_mm_pfn_database(h, x64, &local_err); if (local_err) { warn_report_err(local_err); local_err =3D NULL; } - patch_bugcheck_data(h, &local_err); + patch_bugcheck_data(h, x64, &local_err); if (local_err) { warn_report_err(local_err); } } =20 -static void check_header(WinDumpHeader64 *h, Error **errp) +static bool check_header(WinDumpHeader *h, bool *x64, Error **errp) { const char Signature[] =3D "PAGE"; - const char ValidDump[] =3D "DU64"; =20 if (memcmp(h->Signature, Signature, sizeof(h->Signature))) { error_setg(errp, "win-dump: invalid header, expected '%.4s'," " got '%.4s'", Signature, h->Signature); - return; + return false; } =20 - if (memcmp(h->ValidDump, ValidDump, sizeof(h->ValidDump))) { - error_setg(errp, "win-dump: invalid header, expected '%.4s'," - " got '%.4s'", ValidDump, h->ValidDump); - return; + if (!memcmp(h->ValidDump, "DUMP", sizeof(h->ValidDump))) { + *x64 =3D false; + } else if (!memcmp(h->ValidDump, "DU64", sizeof(h->ValidDump))) { + *x64 =3D true; + } else { + error_setg(errp, "win-dump: invalid header, expected 'DUMP' or 'DU= 64'," + " got '%.4s'", h->ValidDump); + return false; } + + return true; } =20 -static void check_kdbg(WinDumpHeader64 *h, Error **errp) +static void check_kdbg(WinDumpHeader *h, bool x64, Error **errp) { const char OwnerTag[] =3D "KDBG"; char read_OwnerTag[4]; @@ -188,7 +205,7 @@ static void check_kdbg(WinDumpHeader64 *h, Error **errp) =20 try_again: if (cpu_memory_rw_debug(first_cpu, - KdDebuggerDataBlock + KDBG_OWNER_TAG_OFFSET64, + KdDebuggerDataBlock + KDBG_OWNER_TAG_OFFSET, (uint8_t *)&read_OwnerTag, sizeof(read_OwnerTag), 0)) { error_setg(errp, "win-dump: failed to read OwnerTag"); return; @@ -213,15 +230,19 @@ try_again: } } =20 - h->KdDebuggerDataBlock =3D KdDebuggerDataBlock; + if (x64) { + h->x64.KdDebuggerDataBlock =3D KdDebuggerDataBlock; + } else { + h->x32.KdDebuggerDataBlock =3D KdDebuggerDataBlock; + } } =20 struct saved_context { - WinContext64 ctx; + WinContext ctx; uint64_t addr; }; =20 -static void patch_and_save_context(WinDumpHeader64 *h, +static void patch_and_save_context(WinDumpHeader *h, bool x64, struct saved_context *saved_ctx, Error **errp) { @@ -231,15 +252,15 @@ static void patch_and_save_context(WinDumpHeader64 *h, CPUState *cpu; int i =3D 0; =20 - if (cpu_read_ptr(first_cpu, - KdDebuggerDataBlock + KDBG_KI_PROCESSOR_BLOCK_OFFSET64, + if (cpu_read_ptr(x64, first_cpu, + KdDebuggerDataBlock + KDBG_KI_PROCESSOR_BLOCK_OFFSET, &KiProcessorBlock)) { error_setg(errp, "win-dump: failed to read KiProcessorBlock"); return; } =20 if (cpu_memory_rw_debug(first_cpu, - KdDebuggerDataBlock + KDBG_OFFSET_PRCB_CONTEXT_OFFSET64, + KdDebuggerDataBlock + KDBG_OFFSET_PRCB_CONTEXT_OFFSET, (uint8_t *)&OffsetPrcbContext, sizeof(OffsetPrcbContext), 0)) { error_setg(errp, "win-dump: failed to read OffsetPrcbContext"); return; @@ -250,17 +271,17 @@ static void patch_and_save_context(WinDumpHeader64 *h, CPUX86State *env =3D &x86_cpu->env; uint64_t Prcb; uint64_t Context; - WinContext64 ctx; + WinContext ctx; =20 - if (cpu_read_ptr(first_cpu, - KiProcessorBlock + i * WIN_DUMP_PTR_SIZE, + if (cpu_read_ptr(x64, first_cpu, + KiProcessorBlock + i * win_dump_ptr_size(x64), &Prcb)) { error_setg(errp, "win-dump: failed to read" " CPU #%d PRCB location", i); return; } =20 - if (cpu_read_ptr(first_cpu, + if (cpu_read_ptr(x64, first_cpu, Prcb + OffsetPrcbContext, &Context)) { error_setg(errp, "win-dump: failed to read" @@ -270,56 +291,88 @@ static void patch_and_save_context(WinDumpHeader64 *h, =20 saved_ctx[i].addr =3D Context; =20 - ctx =3D (WinContext64){ - .ContextFlags =3D WIN_CTX64_ALL, - .MxCsr =3D env->mxcsr, - - .SegEs =3D env->segs[0].selector, - .SegCs =3D env->segs[1].selector, - .SegSs =3D env->segs[2].selector, - .SegDs =3D env->segs[3].selector, - .SegFs =3D env->segs[4].selector, - .SegGs =3D env->segs[5].selector, - .EFlags =3D cpu_compute_eflags(env), - - .Dr0 =3D env->dr[0], - .Dr1 =3D env->dr[1], - .Dr2 =3D env->dr[2], - .Dr3 =3D env->dr[3], - .Dr6 =3D env->dr[6], - .Dr7 =3D env->dr[7], - - .Rax =3D env->regs[R_EAX], - .Rbx =3D env->regs[R_EBX], - .Rcx =3D env->regs[R_ECX], - .Rdx =3D env->regs[R_EDX], - .Rsp =3D env->regs[R_ESP], - .Rbp =3D env->regs[R_EBP], - .Rsi =3D env->regs[R_ESI], - .Rdi =3D env->regs[R_EDI], - .R8 =3D env->regs[8], - .R9 =3D env->regs[9], - .R10 =3D env->regs[10], - .R11 =3D env->regs[11], - .R12 =3D env->regs[12], - .R13 =3D env->regs[13], - .R14 =3D env->regs[14], - .R15 =3D env->regs[15], - - .Rip =3D env->eip, - .FltSave =3D { + if (x64) { + ctx.x64 =3D (WinContext64){ + .ContextFlags =3D WIN_CTX64_ALL, .MxCsr =3D env->mxcsr, - }, - }; + + .SegEs =3D env->segs[0].selector, + .SegCs =3D env->segs[1].selector, + .SegSs =3D env->segs[2].selector, + .SegDs =3D env->segs[3].selector, + .SegFs =3D env->segs[4].selector, + .SegGs =3D env->segs[5].selector, + .EFlags =3D cpu_compute_eflags(env), + + .Dr0 =3D env->dr[0], + .Dr1 =3D env->dr[1], + .Dr2 =3D env->dr[2], + .Dr3 =3D env->dr[3], + .Dr6 =3D env->dr[6], + .Dr7 =3D env->dr[7], + + .Rax =3D env->regs[R_EAX], + .Rbx =3D env->regs[R_EBX], + .Rcx =3D env->regs[R_ECX], + .Rdx =3D env->regs[R_EDX], + .Rsp =3D env->regs[R_ESP], + .Rbp =3D env->regs[R_EBP], + .Rsi =3D env->regs[R_ESI], + .Rdi =3D env->regs[R_EDI], + .R8 =3D env->regs[8], + .R9 =3D env->regs[9], + .R10 =3D env->regs[10], + .R11 =3D env->regs[11], + .R12 =3D env->regs[12], + .R13 =3D env->regs[13], + .R14 =3D env->regs[14], + .R15 =3D env->regs[15], + + .Rip =3D env->eip, + .FltSave =3D { + .MxCsr =3D env->mxcsr, + }, + }; + } else { + ctx.x32 =3D (WinContext32){ + .ContextFlags =3D WIN_CTX32_FULL | WIN_CTX_DBG, + + .SegEs =3D env->segs[0].selector, + .SegCs =3D env->segs[1].selector, + .SegSs =3D env->segs[2].selector, + .SegDs =3D env->segs[3].selector, + .SegFs =3D env->segs[4].selector, + .SegGs =3D env->segs[5].selector, + .EFlags =3D cpu_compute_eflags(env), + + .Dr0 =3D env->dr[0], + .Dr1 =3D env->dr[1], + .Dr2 =3D env->dr[2], + .Dr3 =3D env->dr[3], + .Dr6 =3D env->dr[6], + .Dr7 =3D env->dr[7], + + .Eax =3D env->regs[R_EAX], + .Ebx =3D env->regs[R_EBX], + .Ecx =3D env->regs[R_ECX], + .Edx =3D env->regs[R_EDX], + .Esp =3D env->regs[R_ESP], + .Ebp =3D env->regs[R_EBP], + .Esi =3D env->regs[R_ESI], + .Edi =3D env->regs[R_EDI], + + .Eip =3D env->eip, + }; + } =20 if (cpu_memory_rw_debug(first_cpu, Context, - &saved_ctx[i].ctx, WIN_DUMP_CTX_SIZE, 0)) { + &saved_ctx[i].ctx, win_dump_ctx_size(x64), 0)) { error_setg(errp, "win-dump: failed to save CPU #%d context", i= ); return; } =20 if (cpu_memory_rw_debug(first_cpu, Context, - &ctx, WIN_DUMP_CTX_SIZE, 1)) { + &ctx, win_dump_ctx_size(x64), 1)) { error_setg(errp, "win-dump: failed to write CPU #%d context", = i); return; } @@ -328,14 +381,14 @@ static void patch_and_save_context(WinDumpHeader64 *h, } } =20 -static void restore_context(WinDumpHeader64 *h, +static void restore_context(WinDumpHeader *h, bool x64, struct saved_context *saved_ctx) { int i; =20 for (i =3D 0; i < WIN_DUMP_FIELD(NumberProcessors); i++) { if (cpu_memory_rw_debug(first_cpu, saved_ctx[i].addr, - &saved_ctx[i].ctx, WIN_DUMP_CTX_SIZE, 1)) { + &saved_ctx[i].ctx, win_dump_ctx_size(x64), 1)) { warn_report("win-dump: failed to restore CPU #%d context", i); } } @@ -343,25 +396,27 @@ static void restore_context(WinDumpHeader64 *h, =20 void create_win_dump(DumpState *s, Error **errp) { - WinDumpHeader64 *h =3D (WinDumpHeader64 *)(s->guest_note + - VMCOREINFO_ELF_NOTE_HDR_SIZE); + WinDumpHeader *h =3D (void *)(s->guest_note + VMCOREINFO_ELF_NOTE_HDR_= SIZE); X86CPU *first_x86_cpu =3D X86_CPU(first_cpu); uint64_t saved_cr3 =3D first_x86_cpu->env.cr[3]; struct saved_context *saved_ctx =3D NULL; Error *local_err =3D NULL; + bool x64 =3D true; + size_t hdr_size; =20 - if (s->guest_note_size !=3D sizeof(WinDumpHeader64) + - VMCOREINFO_ELF_NOTE_HDR_SIZE) { + if (s->guest_note_size !=3D VMCOREINFO_WIN_DUMP_NOTE_SIZE32 && + s->guest_note_size !=3D VMCOREINFO_WIN_DUMP_NOTE_SIZE64) { error_setg(errp, "win-dump: invalid vmcoreinfo note size"); return; } =20 - check_header(h, &local_err); - if (local_err) { + if (!check_header(h, &x64, &local_err)) { error_propagate(errp, local_err); return; } =20 + hdr_size =3D x64 ? sizeof(WinDumpHeader64) : sizeof(WinDumpHeader32); + /* * Further access to kernel structures by virtual addresses * should be made from system context. @@ -369,13 +424,13 @@ void create_win_dump(DumpState *s, Error **errp) =20 first_x86_cpu->env.cr[3] =3D WIN_DUMP_FIELD(DirectoryTableBase); =20 - check_kdbg(h, &local_err); + check_kdbg(h, x64, &local_err); if (local_err) { error_propagate(errp, local_err); goto out_cr3; } =20 - patch_header(h); + patch_header(h, x64); =20 saved_ctx =3D g_new(struct saved_context, WIN_DUMP_FIELD(NumberProcess= ors)); =20 @@ -384,7 +439,7 @@ void create_win_dump(DumpState *s, Error **errp) * to determine if the system-saved context is valid */ =20 - patch_and_save_context(h, saved_ctx, &local_err); + patch_and_save_context(h, x64, saved_ctx, &local_err); if (local_err) { error_propagate(errp, local_err); goto out_free; @@ -392,20 +447,20 @@ void create_win_dump(DumpState *s, Error **errp) =20 s->total_size =3D WIN_DUMP_FIELD(RequiredDumpSpace); =20 - s->written_size =3D qemu_write_full(s->fd, h, sizeof(*h)); - if (s->written_size !=3D sizeof(*h)) { + s->written_size =3D qemu_write_full(s->fd, h, hdr_size); + if (s->written_size !=3D hdr_size) { error_setg(errp, QERR_IO_ERROR); goto out_restore; } =20 - write_runs(s, h, &local_err); + write_runs(s, h, x64, &local_err); if (local_err) { error_propagate(errp, local_err); goto out_restore; } =20 out_restore: - restore_context(h, saved_ctx); + restore_context(h, x64, saved_ctx); out_free: g_free(saved_ctx); out_cr3: diff --git a/hmp-commands.hx b/hmp-commands.hx index 8476277aa9c9..dd4006d3558a 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1064,7 +1064,7 @@ ERST "-l: dump in kdump-compressed format, with lzo compr= ession.\n\t\t\t" "-s: dump in kdump-compressed format, with snappy co= mpression.\n\t\t\t" "-w: dump in Windows crashdump format (can be used i= nstead of ELF-dump converting),\n\t\t\t" - " for Windows x64 guests with vmcoreinfo driver o= nly.\n\t\t\t" + " for Windows x86 and x64 guests with vmcoreinfo = driver only.\n\t\t\t" "begin: the starting physical address.\n\t\t\t" "length: the memory size, in bytes.", .cmd =3D hmp_dump_guest_memory, --=20 2.36.0