diff mbox series

[v4,12/17] dump/dump: Add arch section support

Message ID 20220726092248.128336-13-frankja@linux.ibm.com
State New
Headers show
Series dump: Add arch section and s390x PV dump | expand

Commit Message

Janosch Frank July 26, 2022, 9:22 a.m. UTC
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(+)

Comments

Marc-André Lureau July 26, 2022, 11:30 a.m. UTC | #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.
Janosch Frank July 28, 2022, 7:34 a.m. UTC | #2
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.
>
Marc-André Lureau July 28, 2022, 9:49 a.m. UTC | #3
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 mbox series

Patch

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