diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2016-05-09 08:49:42 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-05-09 08:49:42 +0200 |
commit | 8e2df29b5f71e75f3834a8b5e851473dc5efee7b (patch) | |
tree | 9e97dcbabd205b3a2199d0c18db70170b56add3c /common | |
parent | 23debc6fd917f6d560c665b19eff41c43c1610e9 (diff) | |
parent | a91ce459de038a4e95ae01740d8b253e703fe254 (diff) | |
download | barebox-8e2df29b5f71e75f3834a8b5e851473dc5efee7b.tar.gz barebox-8e2df29b5f71e75f3834a8b5e851473dc5efee7b.tar.xz |
Merge branch 'for-next/bootm'
Diffstat (limited to 'common')
-rw-r--r-- | common/blspec.c | 39 | ||||
-rw-r--r-- | common/bootm.c | 17 | ||||
-rw-r--r-- | common/env.c | 28 | ||||
-rw-r--r-- | common/globalvar.c | 10 |
4 files changed, 57 insertions, 37 deletions
diff --git a/common/blspec.c b/common/blspec.c index 18005569ff..ac8f512891 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -637,29 +637,6 @@ int blspec_scan_devicename(struct blspec *blspec, const char *devname) return blspec_scan_device(blspec, dev); } -static int blspec_append_root(struct blspec_entry *entry) -{ - const char *appendroot; - char *rootarg; - - appendroot = blspec_entry_var_get(entry, "linux-appendroot"); - if (!appendroot || strcmp(appendroot, "true")) - return 0; - - rootarg = path_get_linux_rootarg(entry->rootpath); - if (IS_ERR(rootarg)) { - pr_err("Getting root argument for %s failed with: %s\n", - entry->rootpath, strerrorp(rootarg)); - return PTR_ERR(rootarg); - } - - globalvar_add_simple("linux.bootargs.dyn.blspec.appendroot", rootarg); - - free(rootarg); - - return 0; -} - /* * blspec_boot - boot an entry * @@ -671,6 +648,7 @@ int blspec_boot(struct blspec_entry *entry, int verbose, int dryrun) { int ret; const char *abspath, *devicetree, *options, *initrd, *linuximage; + const char *appendroot; struct bootm_data data = { .initrd_address = UIMAGE_INVALID_ADDRESS, .os_address = UIMAGE_SOME_ADDRESS, @@ -709,9 +687,18 @@ int blspec_boot(struct blspec_entry *entry, int verbose, int dryrun) globalvar_add_simple("linux.bootargs.dyn.blspec", options); - ret = blspec_append_root(entry); - if (ret) - goto err_out; + appendroot = blspec_entry_var_get(entry, "linux-appendroot"); + if (appendroot) { + int val; + + ret = strtobool(appendroot, &val); + if (ret) { + pr_err("Invalid value \"%s\" for appendroot option\n", + appendroot); + goto err_out; + } + data.appendroot = val; + } pr_info("booting %s from %s\n", blspec_entry_var_get(entry, "title"), entry->cdev ? dev_name(entry->cdev->dev) : "none"); diff --git a/common/bootm.c b/common/bootm.c index 6d22aab289..cad8c73efe 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -48,6 +48,8 @@ static struct image_handler *bootm_find_handler(enum filetype filetype, return NULL; } +static int bootm_appendroot; + void bootm_data_init_defaults(struct bootm_data *data) { data->initrd_address = UIMAGE_INVALID_ADDRESS; @@ -58,6 +60,7 @@ void bootm_data_init_defaults(struct bootm_data *data) getenv_ul("global.bootm.initrd.loadaddr", &data->initrd_address); data->initrd_file = getenv_nonempty("global.bootm.initrd"); data->verify = bootm_get_verify_mode(); + data->appendroot = bootm_appendroot; } static enum bootm_verify bootm_verify_mode = BOOTM_VERIFY_HASH; @@ -576,6 +579,18 @@ int bootm_boot(struct bootm_data *bootm_data) } } + if (bootm_data->appendroot) { + char *rootarg; + + rootarg = path_get_linux_rootarg(data->os_file); + if (!IS_ERR(rootarg)) { + printf("Adding \"%s\" to Kernel commandline\n", rootarg); + globalvar_add_simple("linux.bootargs.bootm.appendroot", + rootarg); + free(rootarg); + } + } + printf("\nLoading %s '%s'", file_type_to_string(os_type), data->os_file); if (os_type == filetype_uimage && @@ -621,6 +636,7 @@ err_out: if (data->of_root_node && data->of_root_node != of_get_root_node()) of_delete_node(data->of_root_node); + globalvar_remove("linux.bootargs.bootm.appendroot"); free(data->os_file); free(data->oftree_file); free(data->initrd_file); @@ -634,6 +650,7 @@ static int bootm_init(void) globalvar_add_simple("bootm.image", NULL); globalvar_add_simple("bootm.image.loadaddr", NULL); globalvar_add_simple("bootm.oftree", NULL); + globalvar_add_simple_bool("bootm.appendroot", &bootm_appendroot); if (IS_ENABLED(CONFIG_CMD_BOOTM_INITRD)) { globalvar_add_simple("bootm.initrd", NULL); globalvar_add_simple("bootm.initrd.loadaddr", NULL); diff --git a/common/env.c b/common/env.c index c98ed73f9b..d6cab52a4b 100644 --- a/common/env.c +++ b/common/env.c @@ -28,6 +28,7 @@ #include <xfuncs.h> #include <errno.h> #include <init.h> +#include <string.h> #include <environment.h> static struct env_context root = { @@ -323,20 +324,25 @@ int getenv_uint(const char *var , unsigned int *val) } EXPORT_SYMBOL(getenv_uint); +/** + * getenv_bool - get a boolean value from an environment variable + * @var - Variable name + * @val - The boolean value returned. + * + * This function treats + * - any positive (nonzero) number as true + * - "0" as false + * - "true" (case insensitive) as true + * - "false" (case insensitive) as false + * + * Returns 0 for success or negative error code if the variable does + * not exist or contains something this function does not recognize + * as true or false. + */ int getenv_bool(const char *var, int *val) { const char *valstr = getenv(var); - if (!valstr || !*valstr) - return -EINVAL; - - if (!*valstr) - *val = false; - else if (*valstr == '0') - *val = false; - else - *val = true; - - return 0; + return strtobool(valstr, val); } EXPORT_SYMBOL(getenv_bool); diff --git a/common/globalvar.c b/common/globalvar.c index 9a793ac4a9..05c3e798d7 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -33,6 +33,16 @@ int globalvar_add(const char *name, return 0; } +void globalvar_remove(const char *name) +{ + struct param_d *param = get_param_by_name(&global_device, name); + + if (!param) + return; + + dev_remove_param(param); +} + static int nv_save(const char *name, const char *val) { int fd, ret; |