Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ab49564 authored by Mukesh Ojha's avatar Mukesh Ojha
Browse files

Kconfig.debug: module: Add debug config to debug modules



There can be scenario where, dynamically loadable modules adds
a certain nodes in list data structure and forgot to remove
reference from the list while unloading themself. And this can
result in fault while accessing those dangling pointers.

So If we log the module used address ranges, we could be able to
tell exact victim module.

And, It will be good to keep these debug logs under a config flag.

So, let's add DEBUG_MODULE_LOAD_INFO config and use this in
printing module used init and core layout address
ranges.

e.g:
Core layout sections:
[   40.599573]  .text
[   40.627074]  .plt
[   40.603426]  .rodata.str1.8
[   40.608016]  __mcount_loc
[   40.622142]  .note.gnu.build-id
[   40.612654]  .data
[   40.616438]  .gnu.linkonce.this_module
[   40.634909]  .bss

Init layout sections
[   40.630781]  .init.plt
[   40.638591]  .symtab
[   40.642573]  .strtab

After this patch:
/ # insmod sample.ko
[   26.244768] Hi Mukesh
[   26.247314] Loaded sample: module init layout addresses range: 0xffffff9dbff8a000-0xffffff9dbff8bfff
[   26.256896] sample: core layout addresses range: 0xffffff9dbff85000-0xffffff9dbff88fff
/ # rmmod sample
[   63.812065] Bye Mukesh
[   63.816318] Unloaded sample: module core layout address range: 0xffffff9dbff85000-0xffffff9dbff88fff

Change-Id: I4acfc4f53c561f92ca63fa3c4559148929575580
Signed-off-by: default avatarMukesh Ojha <mojha@codeaurora.org>
parent 9cba6936
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -2156,6 +2156,11 @@ static void free_module(struct module *mod)

	/* Finally, free the core (containing the module structure) */
	disable_ro_nx(&mod->core_layout);
#ifdef CONFIG_DEBUG_MODULE_LOAD_INFO
	pr_info("Unloaded %s: module core layout address range: 0x%lx-0x%lx\n",
		mod->name, (long)mod->core_layout.base,
		(long)(mod->core_layout.base + mod->core_layout.size - 1));
#endif
	module_memfree(mod->core_layout.base);

#ifdef CONFIG_MPU
@@ -3469,6 +3474,14 @@ static noinline int do_init_module(struct module *mod)
	mod_tree_remove_init(mod);
	disable_ro_nx(&mod->init_layout);
	module_arch_freeing_init(mod);
#ifdef CONFIG_DEBUG_MODULE_LOAD_INFO
	pr_info("Loaded %s: module init layout addresses range: 0x%lx-0x%lx\n",
		mod->name, (long)mod->init_layout.base,
		(long)(mod->init_layout.base + mod->init_layout.size - 1));
	pr_info("%s: core layout addresses range: 0x%lx-0x%lx\n", mod->name,
		(long)mod->core_layout.base,
		(long)(mod->core_layout.base + mod->core_layout.size - 1));
#endif
	mod->init_layout.base = NULL;
	mod->init_layout.size = 0;
	mod->init_layout.ro_size = 0;
+12 −0
Original line number Diff line number Diff line
@@ -113,6 +113,18 @@ config DYNAMIC_DEBUG

	  See Documentation/dynamic-debug-howto.txt for additional information.

config DEBUG_MODULE_LOAD_INFO
        bool "Use prints for module info under a debug flag"
	help
	  If you say Y here the resulting kernel image will include
          debug prints which was kept under DEBUG_MODULE_LOAD_INFO.
          This will be used by developer to debug loadable modules in
	  the kernel.
	  Say Y here only if you plan to debug the kernel.

	  If unsure, say N.


endmenu # "printk and dmesg options"

menu "Compile-time checks and compiler options"