From: 黄涛 Date: Mon, 24 Sep 2012 03:22:25 +0000 (+0800) Subject: rk: add module parse kernel cmdline support X-Git-Tag: firefly_0821_release~8587 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=12f00f285401ea8b1ab210082c8df46c297adb1f;p=firefly-linux-kernel-4.4.55.git rk: add module parse kernel cmdline support --- diff --git a/kernel/module.c b/kernel/module.c index a0dbb8cc0705..298f61375791 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2827,6 +2827,13 @@ static struct module *load_module(void __user *umod, list_add_rcu(&mod->list, &modules); mutex_unlock(&module_mutex); +#ifdef CONFIG_RK_CONFIG +{ + extern int module_parse_kernel_cmdline(const char *name, const struct kernel_param *params, unsigned num); + module_parse_kernel_cmdline(mod->name, mod->kp, mod->num_kp); +} +#endif + /* Module is ready to execute: parsing args may do that. */ err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL); if (err < 0) diff --git a/kernel/params.c b/kernel/params.c index ed72e1330862..ce0b0a80bc69 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -217,6 +217,43 @@ int parse_args(const char *name, return 0; } +#ifdef CONFIG_RK_CONFIG +int module_parse_kernel_cmdline(const char *name, const struct kernel_param *params, unsigned num) +{ + int ret; + unsigned i; + size_t name_len = strlen(name); + struct kernel_param new_params[num]; + char args[strlen(saved_command_line) + 1]; + + if (!num) + return 0; + + strcpy(args, saved_command_line); + memcpy(new_params, params, sizeof(struct kernel_param) * num); + + for (i = 0; i < num; i++) + new_params[i].name = NULL; + for (i = 0; i < num; i++) { + char *new_name = kmalloc(strlen(params[i].name) + name_len + 2, GFP_KERNEL); + if (!new_name) { + ret = -ENOMEM; + goto out; + } + sprintf(new_name, "%s.%s", name, params[i].name); + new_params[i].name = new_name; + } + + ret = parse_args(name, args, new_params, num, NULL); + +out: + for (i = 0; i < num; i++) + if (new_params[i].name) + kfree(new_params[i].name); + return ret; +} +#endif + /* Lazy bastard, eh? */ #define STANDARD_PARAM_DEF(name, type, format, tmptype, strtolfn) \ int param_set_##name(const char *val, const struct kernel_param *kp) \