On Thu, May 11, 2023 at 12:35 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
wrote:

> To "sym -m" print the symbols of a module in address order.
> (but "sym -l" and "sym -M" still print modules in text address order.)
>
>
The current text address order is better to me, basically it can keep the
same order with the definition mod_mem_type, which looks more natural. For
example:
crash> sym -m kvm |grep MODULE
ffffffffc136e000 MODULE TEXT START: kvm
ffffffffc13e0000 MODULE TEXT END: kvm
ffffffffc1ceb000 MODULE DATA START: kvm
ffffffffc1d6b000 MODULE DATA END: kvm
ffffffffc291a000 MODULE RODATA START: kvm
ffffffffc296c000 MODULE RODATA END: kvm
ffffffffc11cf000 MODULE RO_AFTER_INIT START: kvm
ffffffffc11d1000 MODULE RO_AFTER_INIT END: kvm

And the internal output in each module memory type is sorted by address as
below:
crash> sym -m kvm
ffffffffc136e000 MODULE TEXT START: kvm
ffffffffc136e000 (T) __pfx___traceiter_kvm_userspace_exit
ffffffffc136e010 (T) __traceiter_kvm_userspace_exit
ffffffffc136e050 (T) __pfx___traceiter_kvm_vcpu_wakeup
ffffffffc136e060 (T) __traceiter_kvm_vcpu_wakeup
ffffffffc136e0b0 (T) __pfx___traceiter_kvm_set_irq
ffffffffc136e0c0 (T) __traceiter_kvm_set_irq
ffffffffc136e110 (T) __pfx___traceiter_kvm_ioapic_set_irq
ffffffffc136e120 (T) __traceiter_kvm_ioapic_set_irq
ffffffffc136e170 (T) __pfx___traceiter_kvm_ioapic_delayed_eoi_inj
...
ffffffffc13df650 (t) kvm_x86_exit
ffffffffc13df650 (T) cleanup_module
ffffffffc13e0000 MODULE TEXT END: kvm

In addition, the sym -m option will be consistent with the styles of sym
-l/-M options, and really simplify the code. Given that, I tend to print
modules in *text address order* and do not need to change it.

Thanks.
Lianbo


Signed-off-by: Kazuhito Hagio <k-hagio...@nec.com>
> ---
>  defs.h    |  2 ++
>  symbols.c | 33 ++++++++++++++++++++++++++++++---
>  2 files changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 655cd2add163..4051eb8d134e 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2984,6 +2984,8 @@ struct load_module {
>         struct module_memory mem[MOD_MEM_NUM_TYPES];
>         struct syment *symtable[MOD_MEM_NUM_TYPES];
>         struct syment *symend[MOD_MEM_NUM_TYPES];
> +       int address_order[MOD_MEM_NUM_TYPES];
> +       int nr_mems;
>  };
>
>  #define IN_MODULE(A,L)         (_in_module(A, L, MOD_TEXT))
> diff --git a/symbols.c b/symbols.c
> index 669fa2e2f3da..5edc4844b3d8 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -1300,7 +1300,7 @@ symname_hash_search(struct syment *table[], char
> *name)
>  static void
>  module_symbol_dump(char *module)
>  {
> -       int i, j, start, percpu_syms;
> +       int i, j, m, start, percpu_syms;
>          struct syment *sp, *sp_end;
>         struct load_module *lm;
>         const char *p1, *p2;
> @@ -1317,7 +1317,8 @@ module_symbol_dump(char *module)
>                 if (received_SIGINT() || output_closed())
>                         return;
>
> -               for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
> +               for (m = 0; m < lm->nr_mems; m++) {
> +                       j = lm->address_order[m];
>
>                         if (!lm->symtable[j])
>                                 continue;
> @@ -1936,7 +1937,7 @@ static const char *module_end_strs[] = {
>  void
>  store_module_symbols_v3(ulong total, int mods_installed)
>  {
> -       int i, m;
> +       int i, j, m;
>         ulong mod, mod_next;
>         char *mod_name;
>         uint nsyms, ngplsyms;
> @@ -2009,6 +2010,9 @@ store_module_symbols_v3(ulong total, int
> mods_installed)
>                                                 SIZE(module_memory) * i +
> OFFSET(module_memory_base));
>                         lm->mem[i].size = UINT(modbuf + OFFSET(module_mem)
> +
>                                                 SIZE(module_memory) * i +
> OFFSET(module_memory_size));
> +                       if (lm->mem[i].base)
> +                               lm->nr_mems++;
> +
>                         if (i < MOD_INIT_TEXT)
>                                 size += lm->mem[i].size;
>                 }
> @@ -2018,6 +2022,24 @@ store_module_symbols_v3(ulong total, int
> mods_installed)
>                 lm->mod_size = size;
>                 lm->module_struct = mod;
>
> +               /* For "sym -m" to print in address order */
> +               if (lm->nr_mems) {
> +                       int idx = 0;
> +                       ulong base, prev_min = 0, min = (ulong)-1;
> +                       for (i = 0; i < lm->nr_mems; i++) {
> +                               for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES;
> j++) {
> +                                       base = lm->mem[j].base;
> +                                       if (base > prev_min && base < min)
> {
> +                                               min = base;
> +                                               idx = j;
> +                                       }
> +                               }
> +                               lm->address_order[i] = idx;
> +                               prev_min = min;
> +                               min = (ulong)-1;
> +                       }
> +               }
> +
>                 if (strlen(mod_name) < MAX_MOD_NAME)
>                         strcpy(lm->mod_name, mod_name);
>                 else {
> @@ -4052,6 +4074,11 @@ dump_symbol_table(void)
>                                 fprintf(fp, "                mem[%d]: %lx
> (%x)\n",
>                                         j, lm->mem[j].base,
> lm->mem[j].size);
>                         }
> +                       fprintf(fp, "               nr_mems: %d\n",
> lm->nr_mems);
> +                       fprintf(fp, "         address_order:");
> +                       for (j = 0; j < lm->nr_mems; j++)
> +                               fprintf(fp, " %d", lm->address_order[j]);
> +                       fprintf(fp, "\n");
>                 }
>
>                 for (s = 0; s < lm->mod_sections; s++) {
> --
> 2.31.1
>
>
--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to