[Crash-utility] [RFC PATCH 05/15] Fix {lowest, highest}_modules_address() and is_kernel_text()

lijiang lijiang at redhat.com
Thu May 25 14:39:01 UTC 2023


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

> fix {lowest,highest}_module_address() and is_kernel_text()
>
> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> ---
>  defs.h    |  6 ++++--
>  symbols.c | 29 ++++++++++++++++++-----------
>  2 files changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 4051eb8d134e..95e44e8cb87c 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2988,8 +2988,10 @@ struct load_module {
>         int nr_mems;
>  };
>
> -#define IN_MODULE(A,L)         (_in_module(A, L, MOD_TEXT))
> -#define IN_MODULE_INIT(A,L)    (_in_module(A, L, MOD_INIT_TEXT))

+#define IN_MODULE(A,L)         (_in_module_range(A, L, MOD_TEXT,
> MOD_RO_AFTER_INIT))
> +#define IN_MODULE_INIT(A,L)    (_in_module_range(A, L, MOD_INIT_TEXT,
> MOD_INIT_RODATA))
> +#define IN_MODULE_TEXT(A,L)    (_in_module_range(A, L, MOD_TEXT,
> MOD_TEXT) || \
> +                               _in_module_range(A, L, MOD_INIT_TEXT,
> MOD_INIT_TEXT))
>
>  /*
>  #define IN_MODULE(A,L) \
> diff --git a/symbols.c b/symbols.c
> index 5edc4844b3d8..ef00ce0b79ca 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -106,7 +106,7 @@ static void dump_node(struct struct_elem *, char *,
> unsigned char, unsigned char
>
>  static int module_mem_type(ulong, struct load_module *);
>  static ulong module_mem_end(ulong, struct load_module *);
> -static int _in_module(ulong, struct load_module *, int);
> +static int _in_module_range(ulong, struct load_module *, int, int);
>  struct syment *value_search_module_v2(ulong, ulong *);
>
>  static const char *module_start_tags[];
> @@ -3119,7 +3119,10 @@ lowest_module_address(void)
>         lowest = (ulong)(-1);
>         for (i = 0; i < st->mods_installed; i++) {
>                 lm = &st->load_modules[i];
> -               low = lm->mod_base;
> +               if (MODULE_MEMORY())
> +                       low = lm->mem[lm->address_order[0]].base;
>

Because the [patch 03/15] will be dropped,
the {lowest,highest}_modules_address() need to walk through all module
memory types. I will comment on it next time when reimplementing these two
functions.

Thanks.
Lianbo

+               else
> +                       low = lm->mod_base;
>                 if (low < lowest)
>                         lowest = low;
>         }
> @@ -3133,11 +3136,16 @@ highest_module_address(void)
>         int i;
>         struct load_module *lm;
>         ulong high, highest;
> +       struct module_memory *mem;
>
>         highest = 0;
>         for (i = 0; i < st->mods_installed; i++) {
>                 lm = &st->load_modules[i];
> -               high = lm->mod_base + lm->mod_size;
> +               if (MODULE_MEMORY()) {
> +                       mem = &lm->mem[lm->address_order[lm->nr_mems-1]];
> +                       high = mem->base + mem->size;
> +               } else
> +                       high = lm->mod_base + lm->mod_size;
>                 if (high > highest)
>                         highest = high;
>         }
> @@ -3530,6 +3538,9 @@ is_kernel_text(ulong value)
>                                 if ((value >= start) && (value < end))
>                                         return TRUE;
>                         }
> +               } else if (MODULE_MEMORY()) {
> +                       if (IN_MODULE_TEXT(value, lm))
> +                               return TRUE;
>                 } else {
>                         switch (kt->flags & (KMOD_V1|KMOD_V2))
>                         {
> @@ -14157,17 +14168,13 @@ symbol_complete_match(const char *match, struct
> syment *sp_last)
>  }
>
>  static int
> -_in_module(ulong addr, struct load_module *lm, int type)
> +_in_module_range(ulong addr, struct load_module *lm, int start, int end)
>  {
>         ulong base, size;
> -       int i, last;
> +       int i;
>
>         if (MODULE_MEMORY()) {
> -               if (type == MOD_TEXT)
> -                       last = MOD_RO_AFTER_INIT;
> -               else
> -                       last = MOD_INIT_RODATA;
> -               for (i = type ; i <= last; i++) {
> +               for (i = start ; i <= end; i++) {
>                         base = lm->mem[i].base;
>                         size = lm->mem[i].size;
>                         if (!base)
> @@ -14178,7 +14185,7 @@ _in_module(ulong addr, struct load_module *lm, int
> type)
>                 return FALSE;
>         }
>
> -       if (type == MOD_TEXT) {
> +       if (start == MOD_TEXT) {
>                 base = lm->mod_base;
>                 size = lm->mod_size;
>         } else {
> --
> 2.31.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20230525/4d5ee547/attachment-0001.htm>


More information about the Crash-utility mailing list