From: Janosch Frank <frankja@linux.ibm.com>
To: qemu-devel@nongnu.org
Cc: marcandre.lureau@redhat.com, pbonzini@redhat.com,
mhartmay@linux.ibm.com, borntraeger@linux.ibm.com,
imbrenda@linux.ibm.com, pasic@linux.ibm.com, cohuck@redhat.com,
thuth@redhat.com, qemu-s390x@nongnu.org, seiden@linux.ibm.com,
scgl@linux.ibm.com
Subject: [PATCH v4 11/17] dump/dump: Add section string table support
Date: Tue, 26 Jul 2022 09:22:42 +0000 [thread overview]
Message-ID: <20220726092248.128336-12-frankja@linux.ibm.com> (raw)
In-Reply-To: <20220726092248.128336-1-frankja@linux.ibm.com>
As sections don't have a type like the notes do we need another way to
determine their contents. The string table allows us to assign each
section an identification string which architectures can then use to
tag their sections with.
There will be no string table if the architecture doesn't add custom
sections which are introduced in a following patch.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
dump/dump.c | 81 ++++++++++++++++++++++++++++++++++++++++++-
include/sysemu/dump.h | 1 +
2 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/dump/dump.c b/dump/dump.c
index 3cf846d0a0..298a1e923f 100644
--- a/dump/dump.c
+++ b/dump/dump.c
@@ -99,6 +99,7 @@ static int dump_cleanup(DumpState *s)
close(s->fd);
g_free(s->guest_note);
g_free(s->elf_header);
+ g_array_unref(s->string_table_buf);
s->guest_note = NULL;
if (s->resume) {
if (s->detached) {
@@ -357,21 +358,72 @@ static size_t prepare_elf_section_hdr_zero(DumpState *s)
return dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
}
+static void write_elf_section_hdr_string(DumpState *s, void *buff)
+{
+ Elf32_Shdr shdr32;
+ Elf64_Shdr shdr64;
+ int shdr_size;
+ void *shdr = buff;
+
+ if (dump_is_64bit(s)) {
+ shdr_size = sizeof(Elf64_Shdr);
+ memset(&shdr64, 0, shdr_size);
+ shdr64.sh_type = SHT_STRTAB;
+ shdr64.sh_offset = s->section_offset + s->elf_section_data_size;
+ shdr64.sh_name = s->string_table_buf->len;
+ g_array_append_vals(s->string_table_buf, ".strtab", sizeof(".strtab"));
+ shdr64.sh_size = s->string_table_buf->len;
+ shdr = &shdr64;
+ } else {
+ shdr_size = sizeof(Elf32_Shdr);
+ memset(&shdr32, 0, shdr_size);
+ shdr32.sh_type = SHT_STRTAB;
+ shdr32.sh_offset = s->section_offset + s->elf_section_data_size;
+ shdr32.sh_name = s->string_table_buf->len;
+ g_array_append_vals(s->string_table_buf, ".strtab", sizeof(".strtab"));
+ shdr32.sh_size = s->string_table_buf->len;
+ shdr = &shdr32;
+ }
+
+ memcpy(buff, shdr, shdr_size);
+}
+
static void prepare_elf_section_hdrs(DumpState *s)
{
size_t len, sizeof_shdr;
+ Elf64_Ehdr *hdr64 = s->elf_header;
+ Elf32_Ehdr *hdr32 = s->elf_header;
+ void *buff_hdr;
/*
* Section ordering:
* - HDR zero (if needed)
+ * - String table hdr
*/
sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
len = sizeof_shdr * s->shdr_num;
s->elf_section_hdrs = g_malloc0(len);
+ buff_hdr = s->elf_section_hdrs;
/* Write special section first */
if (s->phdr_num == PN_XNUM) {
prepare_elf_section_hdr_zero(s);
+ buff_hdr += sizeof_shdr;
+ }
+
+ if (s->shdr_num < 2) {
+ return;
+ }
+
+ /*
+ * String table needs to be last section since strings are added
+ * via arch_sections_write_hdr().
+ */
+ write_elf_section_hdr_string(s, buff_hdr);
+ if (dump_is_64bit(s)) {
+ hdr64->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
+ } else {
+ hdr32->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
}
}
@@ -401,11 +453,18 @@ static void write_elf_sections(DumpState *s, Error **errp)
{
int ret;
- /* Write section zero */
+ /* Write section zero and arch sections */
ret = fd_write_vmcore(s->elf_section_data, s->elf_section_data_size, s);
if (ret < 0) {
error_setg_errno(errp, -ret, "dump: failed to write section data");
}
+
+ /* Write string table data */
+ ret = fd_write_vmcore(s->string_table_buf->data,
+ s->string_table_buf->len, s);
+ if (ret < 0) {
+ error_setg_errno(errp, -ret, "dump: failed to write string table data");
+ }
}
static void write_data(DumpState *s, void *buf, int length, Error **errp)
@@ -713,6 +772,7 @@ static void create_vmcore(DumpState *s, Error **errp)
return;
}
+ /* Iterate over memory and dump it to file */
dump_iterate(s, errp);
if (*errp) {
return;
@@ -1695,6 +1755,13 @@ static void dump_init(DumpState *s, int fd, bool has_format,
s->has_filter = has_filter;
s->begin = begin;
s->length = length;
+ /* First index is 0, it's the special null name */
+ s->string_table_buf = g_array_new(FALSE, TRUE, 1);
+ /*
+ * Allocate the null name, due to the clearing option set to true
+ * it will be 0.
+ */
+ g_array_set_size(s->string_table_buf, 1);
memory_mapping_list_init(&s->list);
@@ -1855,6 +1922,18 @@ static void dump_init(DumpState *s, int fd, bool has_format,
}
}
+ /*
+ * calculate shdr_num and elf_section_data_size so we know the offsets and
+ * sizes of all parts.
+ *
+ * If phdr_num overflowed we have at least one section header
+ * More sections/hdrs can be added by the architectures
+ */
+ if (s->shdr_num > 1) {
+ /* Reserve the string table */
+ s->shdr_num += 1;
+ }
+
tmp = (s->phdr_num == PN_XNUM) ? s->sh_info : s->phdr_num;
if (dump_is_64bit(s)) {
s->shdr_offset = sizeof(Elf64_Ehdr);
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
index 696e6c67d6..299b611180 100644
--- a/include/sysemu/dump.h
+++ b/include/sysemu/dump.h
@@ -178,6 +178,7 @@ typedef struct DumpState {
void *elf_section_hdrs;
uint64_t elf_section_data_size;
void *elf_section_data;
+ GArray *string_table_buf; /* String table section */
uint8_t *note_buf; /* buffer for notes */
size_t note_buf_offset; /* the writing place in note_buf */
--
2.34.1
next prev parent reply other threads:[~2022-07-26 9:40 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-26 9:22 [PATCH v4 00/17] dump: Add arch section and s390x PV dump Janosch Frank
2022-07-26 9:22 ` [PATCH v4 01/17] dump: Rename write_elf_loads to write_elf_phdr_loads Janosch Frank
2022-07-27 18:25 ` Janis Schoetterl-Glausch
2022-07-28 17:20 ` Steffen Eiden
2022-07-26 9:22 ` [PATCH v4 02/17] dump: Introduce GuestPhysBlock offset and length filter functions Janosch Frank
2022-07-26 11:35 ` Marc-André Lureau
2022-07-26 13:01 ` Janosch Frank
2022-07-26 13:11 ` Marc-André Lureau
2022-07-27 10:49 ` Janis Schoetterl-Glausch
2022-07-26 9:22 ` [PATCH v4 03/17] dump: Convert GuestPhysBlock iterators and use the " Janosch Frank
2022-07-27 18:34 ` Janis Schoetterl-Glausch
2022-07-26 9:22 ` [PATCH v4 04/17] dump: Rework get_start_block Janosch Frank
2022-07-26 11:37 ` Marc-André Lureau
2022-07-27 18:42 ` Janis Schoetterl-Glausch
2022-07-28 17:52 ` Steffen Eiden
2022-07-26 9:22 ` [PATCH v4 05/17] dump: Cleanup and annotate guest memory related DumpState struct members Janosch Frank
2022-07-26 11:31 ` Marc-André Lureau
2022-07-29 18:33 ` Janis Schoetterl-Glausch
2022-07-26 9:22 ` [PATCH v4 06/17] dump: Rework dump_calculate_size function Janosch Frank
2022-07-26 11:36 ` Marc-André Lureau
2022-07-26 9:22 ` [PATCH v4 07/17] dump: Allocate header Janosch Frank
2022-07-29 18:31 ` Janis Schoetterl-Glausch
2022-07-26 9:22 ` [PATCH v4 08/17] dump: Split write of section headers and data and add a prepare step Janosch Frank
2022-07-29 15:31 ` Janis Schoetterl-Glausch
2022-07-29 17:16 ` Janis Schoetterl-Glausch
2022-08-01 7:53 ` Janosch Frank
2022-07-26 9:22 ` [PATCH v4 09/17] dump: Reorder struct DumpState Janosch Frank
2022-07-26 11:04 ` Marc-André Lureau
2022-07-29 17:21 ` Janis Schoetterl-Glausch
2022-08-01 7:55 ` Janosch Frank
2022-07-26 9:22 ` [PATCH v4 10/17] dump: Swap segment and section header locations Janosch Frank
2022-07-26 11:06 ` Marc-André Lureau
2022-07-29 18:56 ` Janis Schoetterl-Glausch
2022-07-26 9:22 ` Janosch Frank [this message]
2022-07-26 11:25 ` [PATCH v4 11/17] dump/dump: Add section string table support Marc-André Lureau
2022-07-26 12:53 ` Janosch Frank
2022-07-26 13:12 ` Marc-André Lureau
2022-07-26 14:26 ` Janosch Frank
2022-07-28 13:41 ` Marc-André Lureau
2022-08-01 9:26 ` Janosch Frank
2022-07-29 19:35 ` Janis Schoetterl-Glausch
2022-08-01 14:25 ` Janosch Frank
2022-07-26 9:22 ` [PATCH v4 12/17] dump/dump: Add arch section support Janosch Frank
2022-07-26 11:30 ` Marc-André Lureau
2022-07-28 7:34 ` Janosch Frank
2022-07-28 9:49 ` Marc-André Lureau
2022-07-26 9:22 ` [PATCH v4 13/17] linux header sync Janosch Frank
2022-07-26 11:03 ` Marc-André Lureau
2022-07-26 9:22 ` [PATCH v4 14/17] s390x: Add protected dump cap Janosch Frank
2022-07-26 9:22 ` [PATCH v4 15/17] s390x: Introduce PV query interface Janosch Frank
2022-07-26 9:22 ` [PATCH v4 16/17] s390x: Add KVM PV dump interface Janosch Frank
2022-07-26 9:22 ` [PATCH v4 17/17] s390x: pv: Add dump support Janosch Frank
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220726092248.128336-12-frankja@linux.ibm.com \
--to=frankja@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=imbrenda@linux.ibm.com \
--cc=marcandre.lureau@redhat.com \
--cc=mhartmay@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=scgl@linux.ibm.com \
--cc=seiden@linux.ibm.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).