Message ID | 20220726092248.128336-13-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dump: Add arch section and s390x PV dump | expand |
Hi On Tue, Jul 26, 2022 at 1:23 PM Janosch Frank <frankja@linux.ibm.com> wrote: > > Add hooks which architectures can use to add arbitrary data to custom > sections. > > Signed-off-by: Janosch Frank <frankja@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.
On 7/26/22 13:30, Marc-André Lureau wrote: > Hi > > On Tue, Jul 26, 2022 at 1:23 PM Janosch Frank <frankja@linux.ibm.com> wrote: >> >> Add hooks which architectures can use to add arbitrary data to custom >> sections. >> >> Signed-off-by: Janosch Frank <frankja@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. > >> } 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. >
Hi On Thu, Jul 28, 2022 at 11:42 AM Janosch Frank <frankja@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 <frankja@linux.ibm.com> > wrote: > >> > >> Add hooks which architectures can use to add arbitrary data to custom > >> sections. > >> > >> Signed-off-by: Janosch Frank <frankja@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. > > > >
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); } 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); + } +} + #endif
Add hooks which architectures can use to add arbitrary data to custom sections. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> --- dump/dump.c | 5 +++++ include/sysemu/dump-arch.h | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+)