Hi On Tue, Jul 26, 2022 at 1:23 PM Janosch Frank <fran...@linux.ibm.com> wrote: > > Add hooks which architectures can use to add arbitrary data to custom > sections. > > Signed-off-by: Janosch Frank <fran...@linux.ibm.com> > --- > dump/dump.c | 5 +++++ > include/sysemu/dump-arch.h | 27 +++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/dump/dump.c b/dump/dump.c > index 298a1e923f..1ec4c3b6c3 100644 > --- a/dump/dump.c > +++ b/dump/dump.c > @@ -398,6 +398,7 @@ static void prepare_elf_section_hdrs(DumpState *s) > /* > * Section ordering: > * - HDR zero (if needed) > + * - Arch section hdrs > * - String table hdr > */ > sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr); > @@ -415,6 +416,8 @@ static void prepare_elf_section_hdrs(DumpState *s) > return; > } > > + buff_hdr += dump_arch_sections_write_hdr(&s->dump_info, s, buff_hdr); > + > /* > * String table needs to be last section since strings are added > * via arch_sections_write_hdr(). > @@ -758,6 +761,7 @@ static void dump_end(DumpState *s, Error **errp) > return; > } > s->elf_section_data = g_malloc0(s->elf_section_data_size); > + dump_arch_sections_write(&s->dump_info, s, s->elf_section_data); > > /* write sections to vmcore */ > write_elf_sections(s, errp); > @@ -1929,6 +1933,7 @@ static void dump_init(DumpState *s, int fd, bool > has_format, > * If phdr_num overflowed we have at least one section header > * More sections/hdrs can be added by the architectures > */ > + dump_arch_sections_add(&s->dump_info, (void *)s); > if (s->shdr_num > 1) { > /* Reserve the string table */ > s->shdr_num += 1; > diff --git a/include/sysemu/dump-arch.h b/include/sysemu/dump-arch.h > index e25b02e990..de77908424 100644 > --- a/include/sysemu/dump-arch.h > +++ b/include/sysemu/dump-arch.h > @@ -21,6 +21,9 @@ typedef struct ArchDumpInfo { > uint32_t page_size; /* The target's page size. If it's variable and > * unknown, then this should be the maximum. */ > uint64_t phys_base; /* The target's physmem base. */ > + void (*arch_sections_add_fn)(void *opaque); > + uint64_t (*arch_sections_write_hdr_fn)(void *opaque, uint8_t *buff); > + void (*arch_sections_write_fn)(void *opaque, uint8_t *buff);
Why not pass DumpState? If there is an issue with header declaration order, you can always move the declaration in include/qemu/typedefs.h, I guess. > } ArchDumpInfo; > > struct GuestPhysBlockList; /* memory_mapping.h */ > @@ -28,4 +31,28 @@ int cpu_get_dump_info(ArchDumpInfo *info, > const struct GuestPhysBlockList *guest_phys_blocks); > ssize_t cpu_get_note_size(int class, int machine, int nr_cpus); > > +static inline void dump_arch_sections_add(ArchDumpInfo *info, void *opaque) > +{ > + if (info->arch_sections_add_fn) { > + info->arch_sections_add_fn(opaque); > + } > +} > + > +static inline uint64_t dump_arch_sections_write_hdr(ArchDumpInfo *info, > + void *opaque, uint8_t *buff) > +{ > + if (info->arch_sections_write_hdr_fn) { > + return info->arch_sections_write_hdr_fn(opaque, buff); > + } > + return 0; > +} > + > +static inline void dump_arch_sections_write(ArchDumpInfo *info, void *opaque, > + uint8_t *buff) > +{ > + if (info->arch_sections_write_fn) { > + info->arch_sections_write_fn(opaque, buff); > + } > +} We probably don't need those static inline helpers in the header.