Message ID | 20220811121111.9878-8-frankja@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | dump: Add arch section and s390x PV dump | expand |
On Thu, Aug 11, 2022 at 4:29 PM Janosch Frank <frankja@linux.ibm.com> wrote: > Let's split the write from the modification of the elf header so we > can consolidate the write of the data in one function. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > dump/dump.c | 100 ++++++++++++++++++++++++++++------------------------ > 1 file changed, 53 insertions(+), 47 deletions(-) > > diff --git a/dump/dump.c b/dump/dump.c > index d82cc46d7d..8a2a97a85e 100644 > --- a/dump/dump.c > +++ b/dump/dump.c > @@ -131,7 +131,7 @@ static int fd_write_vmcore(const void *buf, size_t > size, void *opaque) > return 0; > } > > -static void write_elf64_header(DumpState *s, Error **errp) > +static void prepare_elf64_header(DumpState *s, Elf64_Ehdr *elf_header) > { > /* > * phnum in the elf header is 16 bit, if we have more segments we > @@ -139,34 +139,27 @@ static void write_elf64_header(DumpState *s, Error > **errp) > * special section. > */ > uint16_t phnum = MIN(s->phdr_num, PN_XNUM); > - Elf64_Ehdr elf_header; > - int ret; > > - memset(&elf_header, 0, sizeof(Elf64_Ehdr)); > - memcpy(&elf_header, ELFMAG, SELFMAG); > - elf_header.e_ident[EI_CLASS] = ELFCLASS64; > - elf_header.e_ident[EI_DATA] = s->dump_info.d_endian; > - elf_header.e_ident[EI_VERSION] = EV_CURRENT; > - elf_header.e_type = cpu_to_dump16(s, ET_CORE); > - elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine); > - elf_header.e_version = cpu_to_dump32(s, EV_CURRENT); > - elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); > - elf_header.e_phoff = cpu_to_dump64(s, s->phdr_offset); > - elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr)); > - elf_header.e_phnum = cpu_to_dump16(s, phnum); > + memset(elf_header, 0, sizeof(Elf64_Ehdr)); > + memcpy(elf_header, ELFMAG, SELFMAG); > + elf_header->e_ident[EI_CLASS] = ELFCLASS64; > + elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; > + elf_header->e_ident[EI_VERSION] = EV_CURRENT; > + elf_header->e_type = cpu_to_dump16(s, ET_CORE); > + elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); > + elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); > + elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); > + elf_header->e_phoff = cpu_to_dump64(s, s->phdr_offset); > + elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr)); > + elf_header->e_phnum = cpu_to_dump16(s, phnum); > if (s->shdr_num) { > - elf_header.e_shoff = cpu_to_dump64(s, s->shdr_offset); > - elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr)); > - elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num); > - } > - > - ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s); > - if (ret < 0) { > - error_setg_errno(errp, -ret, "dump: failed to write elf header"); > + elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset); > + elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr)); > + elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); > } > } > > -static void write_elf32_header(DumpState *s, Error **errp) > +static void prepare_elf32_header(DumpState *s, Elf32_Ehdr *elf_header) > { > /* > * phnum in the elf header is 16 bit, if we have more segments we > @@ -174,28 +167,45 @@ static void write_elf32_header(DumpState *s, Error > **errp) > * special section. > */ > uint16_t phnum = MIN(s->phdr_num, PN_XNUM); > - Elf32_Ehdr elf_header; > + > + memset(elf_header, 0, sizeof(Elf32_Ehdr)); > + memcpy(elf_header, ELFMAG, SELFMAG); > + elf_header->e_ident[EI_CLASS] = ELFCLASS32; > + elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; > + elf_header->e_ident[EI_VERSION] = EV_CURRENT; > + elf_header->e_type = cpu_to_dump16(s, ET_CORE); > + elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); > + elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); > + elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); > + elf_header->e_phoff = cpu_to_dump32(s, s->phdr_offset); > + elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr)); > + elf_header->e_phnum = cpu_to_dump16(s, phnum); > + if (s->shdr_num) { > + elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset); > + elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr)); > + elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); > + } > +} > + > +static void write_elf_header(DumpState *s, Error **errp) > +{ > + Elf32_Ehdr elf32_header; > + Elf64_Ehdr elf64_header; > + size_t header_size; > + void *header_ptr; > int ret; > > - memset(&elf_header, 0, sizeof(Elf32_Ehdr)); > - memcpy(&elf_header, ELFMAG, SELFMAG); > - elf_header.e_ident[EI_CLASS] = ELFCLASS32; > - elf_header.e_ident[EI_DATA] = s->dump_info.d_endian; > - elf_header.e_ident[EI_VERSION] = EV_CURRENT; > - elf_header.e_type = cpu_to_dump16(s, ET_CORE); > - elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine); > - elf_header.e_version = cpu_to_dump32(s, EV_CURRENT); > - elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); > - elf_header.e_phoff = cpu_to_dump32(s, s->phdr_offset); > - elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr)); > - elf_header.e_phnum = cpu_to_dump16(s, phnum); > - if (s->shdr_num) { > - elf_header.e_shoff = cpu_to_dump32(s, s->shdr_offset); > - elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr)); > - elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num); > + if (dump_is_64bit(s)) { > + prepare_elf64_header(s, &elf64_header); > + header_size = sizeof(elf64_header); > + header_ptr = &elf64_header; > + } else { > + prepare_elf32_header(s, &elf32_header); > + header_size = sizeof(elf32_header); > + header_ptr = &elf32_header; > } > > - ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s); > + ret = fd_write_vmcore(header_ptr, header_size, s); > if (ret < 0) { > error_setg_errno(errp, -ret, "dump: failed to write elf header"); > } > @@ -564,11 +574,7 @@ static void dump_begin(DumpState *s, Error **errp) > */ > > /* write elf header to vmcore */ > - if (dump_is_64bit(s)) { > - write_elf64_header(s, errp); > - } else { > - write_elf32_header(s, errp); > - } > + write_elf_header(s, errp); > if (*errp) { > return; > } > -- > 2.34.1 > > >
On Thu, 2022-08-11 at 12:11 +0000, Janosch Frank wrote: > Let's split the write from the modification of the elf header so we > can consolidate the write of the data in one function. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> This is cosmetic only, right? Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
diff --git a/dump/dump.c b/dump/dump.c index d82cc46d7d..8a2a97a85e 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -131,7 +131,7 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque) return 0; } -static void write_elf64_header(DumpState *s, Error **errp) +static void prepare_elf64_header(DumpState *s, Elf64_Ehdr *elf_header) { /* * phnum in the elf header is 16 bit, if we have more segments we @@ -139,34 +139,27 @@ static void write_elf64_header(DumpState *s, Error **errp) * special section. */ uint16_t phnum = MIN(s->phdr_num, PN_XNUM); - Elf64_Ehdr elf_header; - int ret; - memset(&elf_header, 0, sizeof(Elf64_Ehdr)); - memcpy(&elf_header, ELFMAG, SELFMAG); - elf_header.e_ident[EI_CLASS] = ELFCLASS64; - elf_header.e_ident[EI_DATA] = s->dump_info.d_endian; - elf_header.e_ident[EI_VERSION] = EV_CURRENT; - elf_header.e_type = cpu_to_dump16(s, ET_CORE); - elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine); - elf_header.e_version = cpu_to_dump32(s, EV_CURRENT); - elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); - elf_header.e_phoff = cpu_to_dump64(s, s->phdr_offset); - elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr)); - elf_header.e_phnum = cpu_to_dump16(s, phnum); + memset(elf_header, 0, sizeof(Elf64_Ehdr)); + memcpy(elf_header, ELFMAG, SELFMAG); + elf_header->e_ident[EI_CLASS] = ELFCLASS64; + elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; + elf_header->e_ident[EI_VERSION] = EV_CURRENT; + elf_header->e_type = cpu_to_dump16(s, ET_CORE); + elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); + elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); + elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); + elf_header->e_phoff = cpu_to_dump64(s, s->phdr_offset); + elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr)); + elf_header->e_phnum = cpu_to_dump16(s, phnum); if (s->shdr_num) { - elf_header.e_shoff = cpu_to_dump64(s, s->shdr_offset); - elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr)); - elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num); - } - - ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s); - if (ret < 0) { - error_setg_errno(errp, -ret, "dump: failed to write elf header"); + elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset); + elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr)); + elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); } } -static void write_elf32_header(DumpState *s, Error **errp) +static void prepare_elf32_header(DumpState *s, Elf32_Ehdr *elf_header) { /* * phnum in the elf header is 16 bit, if we have more segments we @@ -174,28 +167,45 @@ static void write_elf32_header(DumpState *s, Error **errp) * special section. */ uint16_t phnum = MIN(s->phdr_num, PN_XNUM); - Elf32_Ehdr elf_header; + + memset(elf_header, 0, sizeof(Elf32_Ehdr)); + memcpy(elf_header, ELFMAG, SELFMAG); + elf_header->e_ident[EI_CLASS] = ELFCLASS32; + elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; + elf_header->e_ident[EI_VERSION] = EV_CURRENT; + elf_header->e_type = cpu_to_dump16(s, ET_CORE); + elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); + elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); + elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); + elf_header->e_phoff = cpu_to_dump32(s, s->phdr_offset); + elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr)); + elf_header->e_phnum = cpu_to_dump16(s, phnum); + if (s->shdr_num) { + elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset); + elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr)); + elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); + } +} + +static void write_elf_header(DumpState *s, Error **errp) +{ + Elf32_Ehdr elf32_header; + Elf64_Ehdr elf64_header; + size_t header_size; + void *header_ptr; int ret; - memset(&elf_header, 0, sizeof(Elf32_Ehdr)); - memcpy(&elf_header, ELFMAG, SELFMAG); - elf_header.e_ident[EI_CLASS] = ELFCLASS32; - elf_header.e_ident[EI_DATA] = s->dump_info.d_endian; - elf_header.e_ident[EI_VERSION] = EV_CURRENT; - elf_header.e_type = cpu_to_dump16(s, ET_CORE); - elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine); - elf_header.e_version = cpu_to_dump32(s, EV_CURRENT); - elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); - elf_header.e_phoff = cpu_to_dump32(s, s->phdr_offset); - elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr)); - elf_header.e_phnum = cpu_to_dump16(s, phnum); - if (s->shdr_num) { - elf_header.e_shoff = cpu_to_dump32(s, s->shdr_offset); - elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr)); - elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num); + if (dump_is_64bit(s)) { + prepare_elf64_header(s, &elf64_header); + header_size = sizeof(elf64_header); + header_ptr = &elf64_header; + } else { + prepare_elf32_header(s, &elf32_header); + header_size = sizeof(elf32_header); + header_ptr = &elf32_header; } - ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s); + ret = fd_write_vmcore(header_ptr, header_size, s); if (ret < 0) { error_setg_errno(errp, -ret, "dump: failed to write elf header"); } @@ -564,11 +574,7 @@ static void dump_begin(DumpState *s, Error **errp) */ /* write elf header to vmcore */ - if (dump_is_64bit(s)) { - write_elf64_header(s, errp); - } else { - write_elf32_header(s, errp); - } + write_elf_header(s, errp); if (*errp) { return; }
Let's split the write from the modification of the elf header so we can consolidate the write of the data in one function. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> --- dump/dump.c | 100 ++++++++++++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 47 deletions(-)