linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Masami Hiramatsu <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Cc: Chen Yu <yu.c.chen@intel.com>, Chen Yu <yu.chen.surf@gmail.com>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
	linux-doc@vger.kernel.org
Subject: [RFC PATCH 2/3] tools/bootconfig: Use hexadecimal ASCII string for size and checksum
Date: Thu, 19 Nov 2020 23:31:51 +0900	[thread overview]
Message-ID: <160579631164.503380.17889801017052432263.stgit@devnote2> (raw)
In-Reply-To: <160579629161.503380.9118263439060046721.stgit@devnote2>

To make the bootconfig format more platform independent, use
8-bytes hexadecimal ASCII string for size and checksum field
in the footer. This will allow us to apply bootconfig to the
cross build initrd without caring the endianness.

This commit updates bootconfig and its test so that it can handle
new format.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 tools/bootconfig/main.c             |   43 ++++++++++++++++++++++-------------
 tools/bootconfig/test-bootconfig.sh |    2 +-
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index 4a445b6304bb..16eb5d4b9947 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -155,11 +155,12 @@ static int pr_errno(const char *msg, int err)
 
 static int load_xbc_from_initrd(int fd, char **buf)
 {
-	struct stat stat;
-	int ret;
-	u32 size = 0, csum = 0, rcsum;
 	char magic[BOOTCONFIG_MAGIC_LEN];
+	u32 size = 0, csum = 0, rcsum;
+	struct stat stat;
 	const char *msg;
+	char sbuf[9], *p;
+	int ret;
 
 	ret = fstat(fd, &stat);
 	if (ret < 0)
@@ -178,22 +179,33 @@ static int load_xbc_from_initrd(int fd, char **buf)
 	if (memcmp(magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN) != 0)
 		return 0;
 
-	if (lseek(fd, -(8 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0)
+	if (lseek(fd, -(16 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0)
 		return pr_errno("Failed to lseek for size", -errno);
 
-	if (read(fd, &size, sizeof(u32)) < 0)
+	sbuf[8] = '\0';
+	if (read(fd, sbuf, 8) < 0)
 		return pr_errno("Failed to read size", -errno);
+	size = strtoul(sbuf, &p, 16);
+	if (p != sbuf + 8) {
+		pr_err("Found invalid size field\n");
+		return -EINVAL;
+	}
 
-	if (read(fd, &csum, sizeof(u32)) < 0)
+	if (read(fd, sbuf, 8) < 0)
 		return pr_errno("Failed to read checksum", -errno);
+	csum = strtoul(sbuf, &p, 16);
+	if (p != sbuf + 8) {
+		pr_err("Found invalid checksum field\n");
+		return -EINVAL;
+	}
 
 	/* Wrong size error  */
-	if (stat.st_size < size + 8 + BOOTCONFIG_MAGIC_LEN) {
+	if (stat.st_size < size + 16 + BOOTCONFIG_MAGIC_LEN) {
 		pr_err("bootconfig size is too big\n");
 		return -E2BIG;
 	}
 
-	if (lseek(fd, stat.st_size - (size + 8 + BOOTCONFIG_MAGIC_LEN),
+	if (lseek(fd, stat.st_size - (size + 16 + BOOTCONFIG_MAGIC_LEN),
 		  SEEK_SET) < 0)
 		return pr_errno("Failed to lseek", -errno);
 
@@ -324,7 +336,7 @@ static int delete_xbc(const char *path)
 		ret = fstat(fd, &stat);
 		if (!ret)
 			ret = ftruncate(fd, stat.st_size
-					- size - 8 - BOOTCONFIG_MAGIC_LEN);
+					- size - 16 - BOOTCONFIG_MAGIC_LEN);
 		if (ret)
 			ret = -errno;
 	} /* Ignore if there is no boot config in initrd */
@@ -354,8 +366,7 @@ static int apply_xbc(const char *path, const char *xbc_path)
 	csum = checksum((unsigned char *)buf, size);
 
 	/* Backup the bootconfig data */
-	data = calloc(size + BOOTCONFIG_ALIGN +
-		      sizeof(u32) + sizeof(u32) + BOOTCONFIG_MAGIC_LEN, 1);
+	data = calloc(size + BOOTCONFIG_ALIGN + 16 + BOOTCONFIG_MAGIC_LEN, 1);
 	if (!data)
 		return -ENOMEM;
 	memcpy(data, buf, size);
@@ -401,17 +412,17 @@ static int apply_xbc(const char *path, const char *xbc_path)
 	}
 
 	/* To align up the total size to BOOTCONFIG_ALIGN, get padding size */
-	total_size = stat.st_size + size + sizeof(u32) * 2 + BOOTCONFIG_MAGIC_LEN;
+	total_size = stat.st_size + size + 16 + BOOTCONFIG_MAGIC_LEN;
 	pad = ((total_size + BOOTCONFIG_ALIGN - 1) & (~BOOTCONFIG_ALIGN_MASK)) - total_size;
 	size += pad;
 
 	/* Add a footer */
 	p = data + size;
-	*(u32 *)p = size;
-	p += sizeof(u32);
+	sprintf(p, "%08x", size);
+	p += 8;
 
-	*(u32 *)p = csum;
-	p += sizeof(u32);
+	sprintf(p, "%08x", csum);
+	p += 8;
 
 	memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
 	p += BOOTCONFIG_MAGIC_LEN;
diff --git a/tools/bootconfig/test-bootconfig.sh b/tools/bootconfig/test-bootconfig.sh
index baed891d0ba4..a40926b8927c 100755
--- a/tools/bootconfig/test-bootconfig.sh
+++ b/tools/bootconfig/test-bootconfig.sh
@@ -60,7 +60,7 @@ echo "Show command test"
 xpass $BOOTCONF $INITRD
 
 echo "File size check"
-total_size=$(expr $bconf_size + $initrd_size + 9 + 12 + $ALIGN - 1 )
+total_size=$(expr $bconf_size + $initrd_size + 17 + 12 + $ALIGN - 1 )
 total_size=$(expr $total_size / $ALIGN)
 total_size=$(expr $total_size \* $ALIGN)
 xpass test $new_size -eq $total_size


  parent reply	other threads:[~2020-11-19 14:32 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-19 14:31 [RFC PATCH 0/3] bootconfig: Use hexadecimal ASCII string for size and checksum Masami Hiramatsu
2020-11-19 14:31 ` [RFC PATCH 1/3] " Masami Hiramatsu
2020-11-19 14:31 ` Masami Hiramatsu [this message]
2020-11-19 14:32 ` [RFC PATCH 3/3] docs: " Masami Hiramatsu
2020-11-19 17:36 ` [RFC PATCH 0/3] " Linus Torvalds
2020-11-19 17:42   ` Steven Rostedt
2020-11-19 23:58     ` Masami Hiramatsu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=160579631164.503380.17889801017052432263.stgit@devnote2 \
    --to=mhiramat@kernel.org \
    --cc=corbet@lwn.net \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=torvalds@linux-foundation.org \
    --cc=yu.c.chen@intel.com \
    --cc=yu.chen.surf@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).