On 2023/05/25 23:39, lijiang wrote:
On Thu, May 11, 2023 at 12:35 PM HAGIO KAZUHITO(萩尾 一仁)
<k-hagio-ab(a)nec.com>
wrote:
> fix {lowest,highest}_module_address() and is_kernel_text()
>
> Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)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,
oh, so I misunderstood your comment on the patch 03/15, I thought that
patch was good. will comment to that 03/15 thread.
Thanks,
Kazu
> 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
>>
>>
>>