[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