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);
} 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
--
2.34.1
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.
> >
>
>
--
Marc-André Lureau
© 2016 - 2026 Red Hat, Inc.