diff mbox

[U-Boot,v2,4/8] km/common: implement boardId HWkey checks as u-boot cmd

Message ID 02d1e3f265123ff0296b1c38b227f6d30393ee77.1304508448.git.holger.brunck@keymile.com
State Changes Requested
Headers show

Commit Message

Holger Brunck May 4, 2011, 11:47 a.m. UTC
From: Thomas Herzmann <thomas.herzmann@keymile.com>

BoardId and HWKey are used to identify the HW class of a given board.
The correct values are stored in the inventory eeprom. During creation
time of a boot package the boardId and HWkey for the SW is stored in
the default environment and burned into the flash. During boottime
the values in the inventory and in the environment are compared to
avoid starting of a SW which is not authorized for this board.

Some bootpackages are allowed to run on a set of different boardId
hwKey. In this case the environment variable boardIdListHex was added
to the default environment. In this case the command iterates over the
pair values and compares them with the values read from the inventory
eeprom.

The syntax of such a boardIdListHex value is e.g.: 158_1 159_1 159_2

Signed-off-by: Thomas Herzmann <thomas.herzmann@keymile.com>
Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
Acked-by: Heiko Schocher <hs@denx.de>
cc: Wolfgang Denk <wd@denx.de>
cc: Detlev Zundel <dzu@denx.de>
---
Changes for v2:
   - split up first large patch series to three independent smaller
     patch series
   - give the cmd a more precise name
   - rework the patch with inputs from W.Denk:
      - adapt and enhance commit msg
      - comment the code
      - add error handling
    
 board/keymile/common/common.c    |  139 ++++++++++++++++++++++++++++++++++++++
 include/configs/keymile-common.h |   30 +--------
 2 files changed, 140 insertions(+), 29 deletions(-)

Comments

Wolfgang Denk May 4, 2011, 10:11 p.m. UTC | #1
Dear Holger Brunck,

In message <02d1e3f265123ff0296b1c38b227f6d30393ee77.1304508448.git.holger.brunck@keymile.com> you wrote:
> From: Thomas Herzmann <thomas.herzmann@keymile.com>
> 
> BoardId and HWKey are used to identify the HW class of a given board.
> The correct values are stored in the inventory eeprom. During creation
> time of a boot package the boardId and HWkey for the SW is stored in
> the default environment and burned into the flash. During boottime
> the values in the inventory and in the environment are compared to
> avoid starting of a SW which is not authorized for this board.
> 
> Some bootpackages are allowed to run on a set of different boardId
> hwKey. In this case the environment variable boardIdListHex was added
> to the default environment. In this case the command iterates over the
> pair values and compares them with the values read from the inventory
> eeprom.
> 
> The syntax of such a boardIdListHex value is e.g.: 158_1 159_1 159_2
> 
> Signed-off-by: Thomas Herzmann <thomas.herzmann@keymile.com>
> Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
> Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
> Acked-by: Heiko Schocher <hs@denx.de>
> cc: Wolfgang Denk <wd@denx.de>
> cc: Detlev Zundel <dzu@denx.de>
> ---
> Changes for v2:
>    - split up first large patch series to three independent smaller
>      patch series
>    - give the cmd a more precise name
>    - rework the patch with inputs from W.Denk:
>       - adapt and enhance commit msg
>       - comment the code
>       - add error handling

This patch has checkpatch warnings.  Please fix.

...
> +	if (!envbid || !envhwkey) {
> +		/*
> +		 * BoardId/HWkey not available in the environment, so try the
> +		 * environment variable for BoardId/HWkey list
> +		 */
> +		char *bidhwklist = getenv("boardIdListHex");
> +		if (bidhwklist) {

Please insert a blank line after declarations.


Best regards,

Wolfgang Denk
Holger Brunck May 5, 2011, 1:51 p.m. UTC | #2
Hi,

On 05/05/2011 12:11 AM, Wolfgang Denk wrote:
> Dear Holger Brunck,
> 
> In message <02d1e3f265123ff0296b1c38b227f6d30393ee77.1304508448.git.holger.brunck@keymile.com> you wrote:
>> From: Thomas Herzmann <thomas.herzmann@keymile.com>
>>
>> BoardId and HWKey are used to identify the HW class of a given board.
>> The correct values are stored in the inventory eeprom. During creation
>> time of a boot package the boardId and HWkey for the SW is stored in
>> the default environment and burned into the flash. During boottime
>> the values in the inventory and in the environment are compared to
>> avoid starting of a SW which is not authorized for this board.
>>
>> Some bootpackages are allowed to run on a set of different boardId
>> hwKey. In this case the environment variable boardIdListHex was added
>> to the default environment. In this case the command iterates over the
>> pair values and compares them with the values read from the inventory
>> eeprom.
>>
>> The syntax of such a boardIdListHex value is e.g.: 158_1 159_1 159_2
>>
>> Signed-off-by: Thomas Herzmann <thomas.herzmann@keymile.com>
>> Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
>> Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
>> Acked-by: Heiko Schocher <hs@denx.de>
>> cc: Wolfgang Denk <wd@denx.de>
>> cc: Detlev Zundel <dzu@denx.de>
>> ---
>> Changes for v2:
>>    - split up first large patch series to three independent smaller
>>      patch series
>>    - give the cmd a more precise name
>>    - rework the patch with inputs from W.Denk:
>>       - adapt and enhance commit msg
>>       - comment the code
>>       - add error handling
> 
> This patch has checkpatch warnings.  Please fix.
>

Ok the one warning that we exceed 80 characters per line is fixed, sorry for
that. But there are two warnings remaining:
WARNING: consider using strict_strtoul in preference to simple_strtoul
#137: FILE: board/keymile/common/common.c:813:
+				bid = simple_strtoul(rest, &endp, 16);

WARNING: consider using strict_strtoul in preference to simple_strtoul
#141: FILE: board/keymile/common/common.c:817:
+					hwkey = simple_strtoul(rest, &endp, 16);

I know that we use strict_strtoul in the same patch some lines above, but at
this point we need *endp and we know that we got a non numeric character at the
end. So using simple_strtoul at this point is exactly what we want here.

Is it ok to ignore this warnings and add a comment above the codeline why we use
simple_stroul?

> ...
>> +	if (!envbid || !envhwkey) {
>> +		/*
>> +		 * BoardId/HWkey not available in the environment, so try the
>> +		 * environment variable for BoardId/HWkey list
>> +		 */
>> +		char *bidhwklist = getenv("boardIdListHex");
>> +		if (bidhwklist) {
> 
> Please insert a blank line after declarations.
> 
>

Ok fixed.

Best regards
Holger Brunck
Wolfgang Denk May 5, 2011, 6:29 p.m. UTC | #3
Dear Holger Brunck,

In message <4DC2AB4A.608@keymile.com> you wrote:
> 
> > This patch has checkpatch warnings.  Please fix.
> 
> Ok the one warning that we exceed 80 characters per line is fixed, sorry for
> that. But there are two warnings remaining:
> WARNING: consider using strict_strtoul in preference to simple_strtoul
> #137: FILE: board/keymile/common/common.c:813:
> +				bid = simple_strtoul(rest, &endp, 16);
> 
> WARNING: consider using strict_strtoul in preference to simple_strtoul
> #141: FILE: board/keymile/common/common.c:817:
> +					hwkey = simple_strtoul(rest, &endp, 16);
> 
> I know that we use strict_strtoul in the same patch some lines above, but at
> this point we need *endp and we know that we got a non numeric character at the
> end. So using simple_strtoul at this point is exactly what we want here.

Well, mixing both strict_strtoul() and simple_strtoul() [without any
comment] in the same patch was what attracted my attention in the
first place.

> Is it ok to ignore this warnings and add a comment above the codeline why we use
> simple_stroul?

Indeed this needs a comment.


Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c
index 68e6b9f..602ebc8 100644
--- a/board/keymile/common/common.c
+++ b/board/keymile/common/common.c
@@ -32,6 +32,7 @@ 
 #include <net.h>
 #include <netdev.h>
 #include <asm/io.h>
+#include <linux/ctype.h>
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
@@ -719,3 +720,141 @@  static int do_setboardid(cmd_tbl_t *cmdtp, int flag, int argc,
 
 U_BOOT_CMD(km_setboardid, 1, 0, do_setboardid, "setboardid", "read out bid and "
 				 "hwkey from IVM and set in environment");
+
+/*
+ * command km_checkbidhwk
+ *	if "boardid" and "hwkey" are not already set in the environment, do:
+ *		if a "boardIdListHex" exists in the environment:
+ *			- read ivm data for boardid and hwkey
+ *			- compare each entry of the boardIdListHex with the
+ *				IVM data:
+ *			if match:
+ *				set environment variables boardid, boardId,
+ *				hwkey, hwKey to	the found values
+ *				both (boardid and boardId) are set because
+ *				they might be used differently in the
+ *				application and in the init scripts (?)
+ *	return 0 in case of match, 1 if not match or error
+ */
+int do_checkboardidhwk(cmd_tbl_t *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	unsigned long ivmbid = 0, ivmhwkey = 0;
+	unsigned long envbid = 0, envhwkey = 0;
+	char *p;
+	int verbose = argc > 1 && *argv[1] == 'v';
+	int rc = 1;	/* default: no match */
+
+	/*
+	 * first read out the real inventory values, these values are
+	 * already stored in the local hush variables
+	 */
+	p = get_local_var("IVM_BoardId");
+	if (p == NULL) {
+		printf("can't get the IVM_Boardid\n");
+		return rc;
+	}
+	strict_strtoul(p, 16, &ivmbid);
+
+	p = get_local_var("IVM_HWKey");
+	if (p == NULL) {
+		printf("can't get the IVM_HWKey\n");
+		return rc;
+	}
+	strict_strtoul(p, 16, &ivmhwkey);
+
+	if (!ivmbid || !ivmhwkey) {
+		printf("Error: IVM_BoardId and/or IVM_HWKey not set!\n");
+		return rc;
+	}
+
+	/* now try to read values from environment if available */
+	p = getenv("boardid");
+	if (p != NULL)
+		strict_strtoul(p, 16, &envbid);
+	p = getenv("hwkey");
+	if (p != NULL)
+		strict_strtoul(p, 16, &envhwkey);
+
+	if (!envbid || !envhwkey) {
+		/*
+		 * BoardId/HWkey not available in the environment, so try the
+		 * environment variable for BoardId/HWkey list
+		 */
+		char *bidhwklist = getenv("boardIdListHex");
+		if (bidhwklist) {
+			int found = 0;
+			char *rest = bidhwklist;
+			char *endp;
+			if (verbose) {
+				printf("IVM_BoardId: %ld, IVM_HWKey=%ld\n",
+					ivmbid, ivmhwkey);
+				printf("boardIdHwKeyList: %s\n",
+					bidhwklist);
+			}
+			while (!found) {
+				/* loop over each bid/hwkey pair in the list */
+				unsigned long bid   = 0;
+				unsigned long hwkey = 0;
+				while (*rest && !isxdigit(*rest))
+					rest++;
+				bid = simple_strtoul(rest, &endp, 16);
+				/* BoardId/HWkey is separated with a "_" for one entry */
+				if (*endp == '_') {
+					rest  = endp + 1;
+					hwkey =	simple_strtoul(rest, &endp, 16);
+					rest  = endp;
+					while (*rest && !isxdigit(*rest))
+						rest++;
+				}
+				if ((!bid) || (!hwkey)) {
+					/* end of list */
+					break;
+				}
+				if (verbose) {
+					printf("trying bid=0x%lX, hwkey=%ld\n",
+						bid, hwkey);
+				}
+				/*
+				 * Compare the values of the found entry in the
+				 * list with the valid values which are stored
+				 * in the inventory eeprom. If they are equal
+				 * store the values in environment variables
+				 * and save the environment.
+				 * This can only happen once for the lifetime
+				 * of a board, because once saved the function
+				 * will never reach the while loop.
+				 */
+				if ((bid == ivmbid) && (hwkey == ivmhwkey)) {
+					char buf[10];
+
+					found = 1;
+					envbid   = bid;
+					envhwkey = hwkey;
+					sprintf(buf, "%lx", bid);
+					setenv("boardid", buf);
+					sprintf(buf, "%lx", hwkey);
+					setenv("hwkey", buf);
+					saveenv();
+				}
+			} /* end while( ! found ) */
+		}
+	}
+
+	/* compare now the values */
+	if ((ivmbid == envbid) && (ivmhwkey == envhwkey)) {
+		printf("boardid=0x%3lX, hwkey=%ld\n", envbid, envhwkey);
+		rc = 0;
+	} else {
+		printf("Error: env bId=0x%3lX, hwKey=%ld\n", envbid, envhwkey);
+		printf("       IVM bId=0x%3lX, hwKey=%ld\n", ivmbid, ivmhwkey);
+	}
+	return rc;
+}
+
+U_BOOT_CMD(km_checkbidhwk, 2, 0, do_checkboardidhwk,
+		"check boardid and hwkey",
+		"[v]\n  - check environment parameter "\
+		"\"boardIdListHex\" against stored boardid and hwkey "\
+		"from the IVM\n    v: verbose output"
+);
diff --git a/include/configs/keymile-common.h b/include/configs/keymile-common.h
index bc8a896..da3711b 100644
--- a/include/configs/keymile-common.h
+++ b/include/configs/keymile-common.h
@@ -238,7 +238,6 @@ 
 	"release="							\
 		"setenv actual_bank ${initial_boot_bank} && "		\
 		"setenv subbootcmds \""					\
-		"checkboardidlist "					\
 		"checkboardid "						\
 		"ubiattach ubicopy "					\
 		"cramfsloadfdt cramfsloadkernel "			\
@@ -389,36 +388,9 @@ 
 	"default="							\
 		"setenv default 'run newenv; reset' &&  "		\
 		"run release && saveenv; reset\0"			\
-	"checkboardidlist="						\
-		"if test \"x${boardIdListHex}\" != \"x\"; then "	\
-		"IVMbidhwk=${IVM_BoardId}_${IVM_HWKey}; "		\
-		"found=0; "						\
-		"for bidhwk in \"${boardIdListHex}\"; do "		\
-		"echo trying $bidhwk ...; "				\
-		"if test \"x$bidhwk\" = \"x$IVMbidhwk\"; then "		\
-		"found=1; "						\
-		"echo match found for $bidhwk; "			\
-		"if test \"x$bidhwk\" != \"x${boardId}_${hwKey}\";then "\
-			"setenv boardid ${IVM_BoardId}; "		\
-			"setenv boardId ${IVM_BoardId}; "		\
-			"setenv hwkey ${IVM_HWKey}; "			\
-			"setenv hwKey ${IVM_HWKey}; "			\
-			"echo \"boardId set to ${boardId}\"; "		\
-			"echo \"hwKey   set to ${hwKey}\"; "		\
-			"saveenv; "					\
-		"fi; "							\
-		"fi; "							\
-		"done; "						\
-		"else "							\
-			"echo \"boardIdListHex not set, not checked\"; "\
-			"found=1; "					\
-		"fi; "							\
-		"test \"$found\" = 1 \0"				\
-	"checkboardid="							\
-		"test \"x${boardId}\" = \"x${IVM_BoardId}\" && "	\
-		"test \"x${hwKey}\" = \"x${IVM_HWKey}\"\0"		\
 	"printbootargs=print bootargs\0"				\
 	"rootfsfile="xstr(CONFIG_HOSTNAME) "/rootfsImage\0"		\
+	"checkboardid=km_checkbidhwk\0"					\
 	""
 
 #ifndef CONFIG_KM_DEF_ENV