On Thu, May 11, 2023 at 12:35 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab@nec.com> wrote:
fix {lowest,highest}_module_address() and is_kernel_text()

Signed-off-by: Kazuhito Hagio <k-hagio-ab@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