⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.patch

📁 Linux-2.6.18内核调试工具补丁程序KGDB。
💻 PATCH
字号:
This allows for KGDB to better deal with autoloaded modules.  The way thisworks, requires a patch to GDB.  This patch can be found atftp://source.mvista.com/pub/kgdb/gdb-6.3-kgdb-module-notification.patchThe way this works is that the solib-search-path must contain the location ofany module to be debugged, and then when a module is loaded GDB acts like ashared library has been loaded now, and can be used that way.Signed-off-by: Tom Rini <trini@kernel.crashing.org> include/linux/module.h |   16 ++++++++++++++ kernel/module.c        |   56 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)Index: linux-2.6.15-rc4/include/linux/module.h===================================================================--- linux-2.6.15-rc4.orig/include/linux/module.h+++ linux-2.6.15-rc4/include/linux/module.h@@ -210,8 +210,17 @@ enum module_state 	MODULE_STATE_LIVE, 	MODULE_STATE_COMING, 	MODULE_STATE_GOING,+ 	MODULE_STATE_GONE, }; +#ifdef CONFIG_KGDB+#define MAX_SECTNAME 31+struct mod_section {+       void *address;+       char name[MAX_SECTNAME + 1];+};+#endif+ /* Similar stuff for section attributes. */ #define MODULE_SECT_NAME_LEN 32 struct module_sect_attr@@ -239,6 +248,13 @@ struct module 	/* Unique handle for this module */ 	char name[MODULE_NAME_LEN]; +#ifdef CONFIG_KGDB+	/* keep kgdb info at the begining so that gdb doesn't have a chance to+	 * miss out any fields */+	unsigned long num_sections;+	struct mod_section *mod_sections;+#endif+ 	/* Sysfs stuff. */ 	struct module_kobject mkobj; 	struct module_param_attrs *param_attrs;Index: linux-2.6.15-rc4/kernel/module.c===================================================================--- linux-2.6.15-rc4.orig/kernel/module.c+++ linux-2.6.15-rc4/kernel/module.c@@ -625,6 +625,12 @@ sys_delete_module(const char __user *nam 	if (ret != 0) 		goto out; +	down(&notify_mutex);+	notifier_call_chain(&module_notify_list, MODULE_STATE_GOING,+        			mod);+	up(&notify_mutex);++ 	/* Never wait if forced. */ 	if (!forced && module_refcount(mod) != 0) 		wait_for_zero_refcount(mod);@@ -637,6 +643,11 @@ sys_delete_module(const char __user *nam 	} 	free_module(mod); +	down(&notify_mutex);+	notifier_call_chain(&module_notify_list, MODULE_STATE_GONE,+			NULL);+	up(&notify_mutex);+  out: 	up(&module_mutex); 	return ret;@@ -1175,6 +1186,11 @@ static void free_module(struct module *m 	/* Arch-specific cleanup. */ 	module_arch_cleanup(mod); +#ifdef CONFIG_KGDB+	/* kgdb info */+	vfree(mod->mod_sections);+#endif+ 	/* Module unload stuff */ 	module_unload_free(mod); @@ -1409,6 +1425,31 @@ static void setup_modinfo(struct module  } #endif +#ifdef CONFIG_KGDB+int add_modsects (struct module *mod, Elf_Ehdr *hdr, Elf_Shdr *sechdrs, const+                char *secstrings)+{+        int i;++        mod->num_sections = hdr->e_shnum - 1;+        mod->mod_sections = vmalloc((hdr->e_shnum - 1)*+		sizeof (struct mod_section));++        if (mod->mod_sections == NULL) {+                return -ENOMEM;+        }++        for (i = 1; i < hdr->e_shnum; i++) {+                mod->mod_sections[i - 1].address = (void *)sechdrs[i].sh_addr;+                strncpy(mod->mod_sections[i - 1].name, secstrings ++                                sechdrs[i].sh_name, MAX_SECTNAME);+                mod->mod_sections[i - 1].name[MAX_SECTNAME] = '\0';+	}++	return 0;+}+#endif+ #ifdef CONFIG_KALLSYMS int is_exported(const char *name, const struct module *mod) {@@ -1778,6 +1819,12 @@ static struct module *load_module(void _  	add_kallsyms(mod, sechdrs, symindex, strindex, secstrings); +#ifdef CONFIG_KGDB+        if ((err = add_modsects(mod, hdr, sechdrs, secstrings)) < 0) {+                goto nomodsectinfo;+        }+#endif+ 	err = module_finalize(hdr, sechdrs, mod); 	if (err < 0) 		goto cleanup;@@ -1843,6 +1890,11 @@ static struct module *load_module(void _  arch_cleanup: 	module_arch_cleanup(mod);  cleanup:++#ifdef CONFIG_KGDB+nomodsectinfo:+       vfree(mod->mod_sections);+#endif 	module_unload_free(mod); 	module_free(mod, mod->module_init);  free_core:@@ -1916,6 +1968,10 @@ sys_init_module(void __user *umod, 		/* Init routine failed: abort.  Try to protect us from                    buggy refcounters. */ 		mod->state = MODULE_STATE_GOING;+		down(&notify_mutex);+		notifier_call_chain(&module_notify_list, MODULE_STATE_GOING,+				mod);+		up(&notify_mutex); 		synchronize_sched(); 		if (mod->unsafe) 			printk(KERN_ERR "%s: module is now stuck!\n",

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -