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;
+ 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