summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-10-26 02:53:23 +0000
committerian <ian@FreeBSD.org>2014-10-26 02:53:23 +0000
commit3eae765afaf08f9c271c03e29dd692f51bbea201 (patch)
tree18e7cec185bf4ea8cbbe1f6bc69da88c7ad02716 /sys/boot
parent1edaa04098842aaa04cd15d9c29a0668cd5ed91f (diff)
downloadFreeBSD-src-3eae765afaf08f9c271c03e29dd692f51bbea201.zip
FreeBSD-src-3eae765afaf08f9c271c03e29dd692f51bbea201.tar.gz
MFC r271285:
Add a 'ubenv import' command to import environment variables from the u-boot env into the loader(8) env (which also gets them into the kernel env).
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/arm/uboot/help.uboot26
-rw-r--r--sys/boot/uboot/common/main.c69
2 files changed, 95 insertions, 0 deletions
diff --git a/sys/boot/arm/uboot/help.uboot b/sys/boot/arm/uboot/help.uboot
index 5873eb0..c1574af 100644
--- a/sys/boot/arm/uboot/help.uboot
+++ b/sys/boot/arm/uboot/help.uboot
@@ -1 +1,27 @@
$FreeBSD$
+
+###############################################################################
+# Tubenv DShow or import U-Boot environment variables
+
+ ubenv <import | show> [varname ...]
+
+ Display U-Boot environment variables, or import them into the
+ loader environment (which makes them available in the kernel).
+
+###############################################################################
+# Tubenv Simport DImport U-Boot env vars
+
+ ubenv import [varname ...]
+
+ If no variable names are specified, all U-Boot environment
+ variables are imported. Each variable is prefixed with "uboot."
+ to avoid any possible conflicts with loader or kernel variables.
+
+###############################################################################
+# Tubenv Sshow DShow U-Boot env vars
+
+ ubenv show [varname ...]
+
+ If no variable names are specified, all U-Boot environment
+ variables are shown.
+
diff --git a/sys/boot/uboot/common/main.c b/sys/boot/uboot/common/main.c
index 16cea23..75e6854 100644
--- a/sys/boot/uboot/common/main.c
+++ b/sys/boot/uboot/common/main.c
@@ -556,6 +556,75 @@ command_sysinfo(int argc, char *argv[])
return (CMD_OK);
}
+enum ubenv_action {
+ UBENV_UNKNOWN,
+ UBENV_SHOW,
+ UBENV_IMPORT
+};
+
+static void
+handle_uboot_env_var(enum ubenv_action action, const char * var)
+{
+ const char * val;
+ char ubv[128];
+
+ /*
+ * If the user prepended "uboot." (which is how they usually see these
+ * names) strip it off as a convenience.
+ */
+ if (strncmp(var, "uboot.", 6) == 0) {
+ snprintf(ubv, sizeof(ubv), "%s", &var[6]);
+ var = ubv;
+ }
+ val = ub_env_get(var);
+ if (action == UBENV_SHOW) {
+ if (val == NULL)
+ printf("uboot.%s is not set\n", var);
+ else
+ printf("uboot.%s=%s\n", var, val);
+ } else if (action == UBENV_IMPORT) {
+ if (val != NULL) {
+ snprintf(ubv, sizeof(ubv), "uboot.%s", var);
+ setenv(ubv, val, 1);
+ }
+ }
+}
+
+static int
+command_ubenv(int argc, char *argv[])
+{
+ enum ubenv_action action;
+ const char *var;
+ int i;
+
+ action = UBENV_UNKNOWN;
+ if (argc > 1) {
+ if (strcasecmp(argv[1], "import") == 0)
+ action = UBENV_IMPORT;
+ else if (strcasecmp(argv[1], "show") == 0)
+ action = UBENV_SHOW;
+ }
+ if (action == UBENV_UNKNOWN) {
+ command_errmsg = "usage: 'ubenv <import|show> [var ...]";
+ return (CMD_ERROR);
+ }
+
+ if (argc > 2) {
+ for (i = 2; i < argc; i++)
+ handle_uboot_env_var(action, argv[i]);
+ } else {
+ var = NULL;
+ for (;;) {
+ if ((var = ub_env_enum(var)) == NULL)
+ break;
+ handle_uboot_env_var(action, var);
+ }
+ }
+
+ return (CMD_OK);
+}
+COMMAND_SET(ubenv, "ubenv", "show or import U-Boot env vars", command_ubenv);
+
#ifdef LOADER_FDT_SUPPORT
/*
* Since proper fdt command handling function is defined in fdt_loader_cmd.c,
OpenPOWER on IntegriCloud