[Crash-utility] [PATCH] load_module_symbols_helper().
Dave Anderson
anderson at redhat.com
Wed Jan 19 20:18:28 UTC 2011
----- Original Message -----
> Hi Dave,
>
> I wuold like to send one more patch which is helper of load_module_symbols().
> (Simplified usage by resolving some module parameters at API inside.)
>
> This is useful for dynamic module loading from extension modules
> to be coordinated with previous ikconfig patch.
>
> Also add new env CRASH_MODULE_PATH which can use from setenv() or export.
> If load_module_symbols_helper() result is wrong, set this env properly.
>
> [ remaining issues ]
> - Search basic kernel module path to be installed
> Try some closer path to default but enough or right?
> - .gnu.linkonce.this_module section
> In x86_64, module name '-' is changed with '_' in this section.
> Is this conversion arch depend? or Any other specific chars?
>
> Thanks,
> Toshi.
This patch has way too much duplication of effort.
For example, why not do something simple like this in kernel.c?:
diff -r1.244 kernel.c
3626a3627,3640
> int
> load_module_symbols_helper(char *name)
> {
> char *objfile;
> ulong address;
>
> if (is_module_name(name, &address, NULL) &&
> (objfile = find_module_objfile(name, NULL, NULL))) {
> do_module_cmd(LOAD_SPECIFIED_MODULE_SYMBOLS, name, address, objfile, NULL);
> return TRUE;
> }
> return FALSE;
> }
>
To test it, I patched test.c like this:
diff -r1.4 test.c
42c42
< ;
---
> load_module_symbols_helper(args[optind]);
And verified that it works like so:
crash> test ext3
MODULE NAME SIZE OBJECT FILE
ffffffff8806ae00 ext3 168017 /lib/modules/2.6.18-128.el5/kernel/fs/ext3/ext3.ko
crash>
Then you could also apply your "CRASH_MODULE_PATH" concept to
the module_objfile_search() function, which does the same kind
of thing for the various possible directory trees. That way,
the non-standard CRASH_MODULE_PATH could be used by the "mod"
command as well.
Dave
> ----------------------------------------------------------
> [ Test code image ]
>
> #include <defs.h>
>
> static int kvm_done, kvm_intel_done;
>
> void kvm_symbol_setup(void)
> {
> /* dummy: structs or global symbols of KVM initilize */
> kvm_done = 1;
> }
>
> void kvm_intel_symbol_setup(void)
> {
> /* dummy: structs or global symbols of VMX initilize */
> kvm_intel_done = 1;
> }
>
> static void __attribute__((constructor))
> module_load_test(void)
> {
> int ikconfig;
>
> read_in_kernel_config(IKCFG_SETUP);
>
> ikconfig = get_kernel_config("KVM", NULL);
> if (ikconfig == IKCONFIG_Y)
> kvm_symbol_setup();
> else if (ikconfig == IKCONFIG_M)
> if (load_module_symbols_helper("kvm", "arch/x86/kvm"))
> kvm_symbol_setup();
>
> ikconfig = get_kernel_config("KVM_INTEL", NULL);
> if (ikconfig == IKCONFIG_Y)
> kvm_intel_symbol_setup();
> else if (ikconfig == IKCONFIG_M)
> if (load_module_symbols_helper("kvm-intel", "arch/x86/kvm"))
> kvm_intel_symbol_setup();
>
> if (kvm_done)
> fprintf(fp, "kvm module symbols loaded\n");
>
> if (kvm_intel_done)
> fprintf(fp, "kvm-intel module symbols loaded\n");
> }
>
> static void __attribute__((destructor))
> module_load_test_fin(void)
> {
> read_in_kernel_config(IKCFG_FREE);
> }
>
> [ Result ]
> crash> mod | grep kvm
> ffffffffa008dba0 kvm 175160 (not loaded) [CONFIG_KALLSYMS]
> ffffffffa00a4c40 kvm_intel 39368 (not loaded) [CONFIG_KALLSYMS]
>
> crash> extend test.so
> kvm module symbols loaded
> kvm-intel module symbols loaded
> extend: ./test.so: no commands registered: shared object unloaded
>
> crash> mod | grep kvm
> ffffffffa008dba0 kvm 175160
> /lib/modules/2.6.35/kernel/arch/x86/kvm/kvm.ko
> ffffffffa00a4c40 kvm_intel 39368
> /lib/modules/2.6.35/kernel/arch/x86/kvm/kvm-intel.ko
>
>
> Toshikazu Nakayama (1):
> Add helper routine for load_module_symbols().
>
> crash-5.1.1/defs.h | 1 +
> crash-5.1.1/symbols.c | 89
> +++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 90 insertions(+), 0 deletions(-)
>
> --
> 1.7.4.rc2
>
>
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
More information about the Crash-utility
mailing list