[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v5 09/18] dump: Use a buffer for ELF section data and headers
From: |
Janis Schoetterl-Glausch |
Subject: |
Re: [PATCH v5 09/18] dump: Use a buffer for ELF section data and headers |
Date: |
Mon, 29 Aug 2022 22:43:13 +0200 |
User-agent: |
Evolution 3.42.4 (3.42.4-2.fc35) |
On Thu, 2022-08-11 at 12:11 +0000, Janosch Frank wrote:
> Currently we're writing the NULL section header if we overflow the
> physical header number in the ELF header. But in the future we'll add
> custom section headers AND section data.
>
> To facilitate this we need to rearange section handling a bit. As with
> the other ELF headers we split the code into a prepare and a write
> step.
>
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
> ---
> dump/dump.c | 83 +++++++++++++++++++++++++++++--------------
> include/sysemu/dump.h | 2 ++
> 2 files changed, 58 insertions(+), 27 deletions(-)
>
> diff --git a/dump/dump.c b/dump/dump.c
> index a905316fe5..0051c71d08 100644
> --- a/dump/dump.c
> +++ b/dump/dump.c
> @@ -380,30 +380,57 @@ static void write_elf_phdr_note(DumpState *s, Error
> **errp)
> }
> }
>
> -static void write_elf_section(DumpState *s, int type, Error **errp)
> +static void prepare_elf_section_hdr_zero(DumpState *s)
> {
> - Elf32_Shdr shdr32;
> - Elf64_Shdr shdr64;
> - int shdr_size;
> - void *shdr;
> + if (dump_is_64bit(s)) {
> + Elf64_Shdr *shdr64 = s->elf_section_hdrs;
> +
> + shdr64->sh_info = cpu_to_dump32(s, s->phdr_num);
> + } else {
> + Elf32_Shdr *shdr32 = s->elf_section_hdrs;
> +
> + shdr32->sh_info = cpu_to_dump32(s, s->phdr_num);
> + }
> +}
> +
> +static void prepare_elf_section_hdrs(DumpState *s)
> +{
> + size_t len, sizeof_shdr;
> +
> + /*
> + * Section ordering:
> + * - HDR zero
> + */
> + 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);
I'm not seeing this being freed.
> +
> + /*
> + * The first section header is ALWAYS a special initial section
> + * header.
> + *
> + * The header should be 0 with one exception being that if
> + * phdr_num is PN_XNUM then the sh_info field contains the real
> + * number of segment entries.
> + *
> + * As we zero allocate the buffer we will only need to modify
> + * sh_info for the PN_XNUM case.
> + */
> + if (s->phdr_num >= PN_XNUM) {
> + prepare_elf_section_hdr_zero(s);
> + }
> +}
> +
> +static void write_elf_section_headers(DumpState *s, Error **errp)
[...]
> @@ -579,6 +606,12 @@ static void dump_begin(DumpState *s, Error **errp)
> return;
> }
>
> + /* write section headers to vmcore */
> + write_elf_section_headers(s, errp);
> + if (*errp) {
> + return;
> + }
> +
> /* write PT_NOTE to vmcore */
> write_elf_phdr_note(s, errp);
> if (*errp) {
> @@ -591,14 +624,6 @@ static void dump_begin(DumpState *s, Error **errp)
> return;
> }
>
> - /* write section to vmcore */
> - if (s->shdr_num) {
> - write_elf_section(s, 1, errp);
> - if (*errp) {
> - return;
> - }
> - }
> -
Here you change the order of the headers, but the elf header is only
fixed in patch 11.
I agree that this should be a separate patch, with an explanation on
why it's necessary.
So basically squashed into patch 11, except I think the comment change
in that one should go into another patch.
> /* write notes to vmcore */
> write_elf_notes(s, errp);
> }
> @@ -674,7 +699,11 @@ static void create_vmcore(DumpState *s, Error **errp)
> return;
> }
>
> + /* Iterate over memory and dump it to file */
> dump_iterate(s, errp);
> + if (*errp) {
> + return;
> + }
> }
>
> static int write_start_flat_header(int fd)
> diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
> index b62513d87d..9995f65dc8 100644
> --- a/include/sysemu/dump.h
> +++ b/include/sysemu/dump.h
> @@ -177,6 +177,8 @@ typedef struct DumpState {
> int64_t filter_area_begin; /* Start address of partial guest memory
> area */
> int64_t filter_area_length; /* Length of partial guest memory area */
>
> + void *elf_section_hdrs; /* Pointer to section header buffer */
> +
> uint8_t *note_buf; /* buffer for notes */
> size_t note_buf_offset; /* the writing place in note_buf */
> uint32_t nr_cpus; /* number of guest's cpu */
- [PATCH v5 00/18] dump: Add arch section and s390x PV dump, Janosch Frank, 2022/08/11
- [PATCH v5 05/18] dump: Rework filter area variables, Janosch Frank, 2022/08/11
- [PATCH v5 03/18] dump: Refactor dump_iterate and introduce dump_filter_memblock_*(), Janosch Frank, 2022/08/11
- [PATCH v5 09/18] dump: Use a buffer for ELF section data and headers, Janosch Frank, 2022/08/11
- [PATCH v5 10/18] dump: Reorder struct DumpState, Janosch Frank, 2022/08/11
- [PATCH v5 15/18] s390x: Add protected dump cap, Janosch Frank, 2022/08/11
- [PATCH v5 14/18] DRAFT: linux header sync, Janosch Frank, 2022/08/11
- [PATCH v5 16/18] s390x: Introduce PV query interface, Janosch Frank, 2022/08/11
- [PATCH v5 17/18] s390x: Add KVM PV dump interface, Janosch Frank, 2022/08/11
- [PATCH v5 18/18] s390x: pv: Add dump support, Janosch Frank, 2022/08/11