Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Sep 2014 19:19:10 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r271285 - in head/sys/boot: arm/uboot uboot/common
Message-ID:  <201409081919.s88JJAxl041413@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Mon Sep  8 19:19:10 2014
New Revision: 271285
URL: http://svnweb.freebsd.org/changeset/base/271285

Log:
  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).  You can import selected variables or the whole environment.  Each
  u-boot var=value becomes uboot.var=value in the loader env.  You can also
  use 'ubenv show' to display uboot vars without importing them.

Modified:
  head/sys/boot/arm/uboot/help.uboot
  head/sys/boot/uboot/common/main.c

Modified: head/sys/boot/arm/uboot/help.uboot
==============================================================================
--- head/sys/boot/arm/uboot/help.uboot	Mon Sep  8 19:00:13 2014	(r271284)
+++ head/sys/boot/arm/uboot/help.uboot	Mon Sep  8 19:19:10 2014	(r271285)
@@ -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.
+

Modified: head/sys/boot/uboot/common/main.c
==============================================================================
--- head/sys/boot/uboot/common/main.c	Mon Sep  8 19:00:13 2014	(r271284)
+++ head/sys/boot/uboot/common/main.c	Mon Sep  8 19:19:10 2014	(r271285)
@@ -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,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409081919.s88JJAxl041413>