Hi On Thu, Jul 28, 2022 at 11:42 AM Janosch Frank <fran...@linux.ibm.com> wrote:
> On 7/26/22 13:30, Marc-André Lureau wrote: > > 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. > > The CPU note function passes the opaque pointer so I did as the same. > If you want I can have a look if it makes sense to move over to DumpState. > > Yes, please, give it a try > > > >> } 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. > > > > -- Marc-André Lureau