fix verify_module() and next_module_vaddr()

Signed-off-by: Kazuhito Hagio <k-hagio...@nec.com>
---
 kernel.c | 19 ++++++++++++++++---
 memory.c | 36 ++++++++++++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/kernel.c b/kernel.c
index 62afff25bca8..013a9a4d08f4 100644
--- a/kernel.c
+++ b/kernel.c
@@ -3913,8 +3913,13 @@ verify_modules(void)
                                mod_base = mod;
                                break;
                        case KMOD_V2:
-                               mod_base = ULONG(modbuf + 
-                                       MODULE_OFFSET2(module_module_core, rx));
+                               if (MODULE_MEMORY())
+                                       /* mem[MOD_TEXT].base */
+                                       mod_base = ULONG(modbuf + 
OFFSET(module_mem) +
+                                                       
OFFSET(module_memory_base));
+                               else
+                                       mod_base = ULONG(modbuf +
+                                               
MODULE_OFFSET2(module_module_core, rx));
                                break;
                        }
 
@@ -3936,7 +3941,15 @@ verify_modules(void)
                                case KMOD_V2:
                                        module_name = modbuf + 
                                                OFFSET(module_name);
-                                       if (THIS_KERNEL_VERSION >= 
LINUX(2,6,27))
+                                       if (MODULE_MEMORY()) {
+                                               int j;
+                                               mod_size = 0;
+                                               for (j = MOD_TEXT; j < 
MOD_INIT_TEXT; j++) {
+                                                       mod_size += UINT(modbuf 
+ OFFSET(module_mem) +
+                                                                       
SIZE(module_memory) * i +
+                                                                       
OFFSET(module_memory_size));
+                                               }
+                                       } else if (THIS_KERNEL_VERSION >= 
LINUX(2,6,27))
                                                mod_size = UINT(modbuf +
                                                        
MODULE_OFFSET2(module_core_size, rx));
                                        else
diff --git a/memory.c b/memory.c
index 0568f18eb9b7..d8a37e7a0c4f 100644
--- a/memory.c
+++ b/memory.c
@@ -15687,10 +15687,13 @@ in_vmlist_segment(ulong vaddr)
 static int
 next_module_vaddr(ulong vaddr, ulong *nextvaddr)
 {
-       int i;
-       ulong start, end;
+       int i, j;
+       ulong start, end, min = (ulong)-1;
        struct load_module *lm;
 
+       if (MODULE_MEMORY())
+               goto module_memory;
+
        for (i = 0; i < st->mods_installed; i++) {
                lm = &st->load_modules[i];
                start = lm->mod_base;
@@ -15707,6 +15710,35 @@ next_module_vaddr(ulong vaddr, ulong *nextvaddr)
                return TRUE;
        }
 
+       return FALSE;
+
+module_memory: /* TODO: test this */
+       for (i = 0; i < st->mods_installed; i++) {
+               lm = &st->load_modules[i];
+
+               for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+                       start = lm->mem[j].base;
+                       end = start + lm->mem[j].size;
+
+                       if (vaddr >= end)
+                               continue;
+
+                       if (vaddr < start) {
+                               if (start < min) /* replace candidate */
+                                       min = start;
+                               continue;
+                       }
+
+                       *nextvaddr = vaddr;
+                       return TRUE;
+               }
+       }
+
+       if (min != (ulong)-1) {
+               *nextvaddr = min;
+               return TRUE;
+       }
+
        return FALSE;
 }
 
-- 
2.31.1

--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to