📄 module.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(¬ify_mutex);+ notifier_call_chain(&module_notify_list, MODULE_STATE_GOING,+ mod);+ up(¬ify_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(¬ify_mutex);+ notifier_call_chain(&module_notify_list, MODULE_STATE_GONE,+ NULL);+ up(¬ify_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(¬ify_mutex);+ notifier_call_chain(&module_notify_list, MODULE_STATE_GOING,+ mod);+ up(¬ify_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 + -