Re: [PATCH 1/2] tools/bootconfig: Align the bootconfig applied initrd image size to 4

From: Woody Suwalski
Date: Mon Nov 16 2020 - 18:34:34 EST


Masami Hiramatsu wrote:
Align the bootconfig applied initrd image size to 4. To pad the data,
bootconfig will use space (0x20) in front of the bootconfig data,
and expands its size and update checksum.

Signed-off-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx>
---
include/linux/bootconfig.h | 1 +
tools/bootconfig/main.c | 33 ++++++++++++++++++++++++++++-----
tools/bootconfig/test-bootconfig.sh | 6 +++++-
3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h
index 9903088891fa..461f621047f3 100644
--- a/include/linux/bootconfig.h
+++ b/include/linux/bootconfig.h
@@ -12,6 +12,7 @@
#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
#define BOOTCONFIG_MAGIC_LEN 12
+#define BOOTCONFIG_ALIGN 4
/* XBC tree node */
struct xbc_node {
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index eb92027817a7..4b48e6a5ad1b 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -332,11 +332,13 @@ static int delete_xbc(const char *path)
static int apply_xbc(const char *path, const char *xbc_path)
{
+ const char padbuf[BOOTCONFIG_ALIGN] = { 0 };
u32 size, csum;
char *buf, *data;
int ret, fd;
const char *msg;
- int pos;
+ struct stat st;
+ int pos, pad;
ret = load_xbc_file(xbc_path, &buf);
if (ret < 0) {
@@ -347,12 +349,10 @@ static int apply_xbc(const char *path, const char *xbc_path)
csum = checksum((unsigned char *)buf, size);
/* Prepare xbc_path data */
- data = malloc(size + 8);
+ data = malloc(size);
if (!data)
return -ENOMEM;
strcpy(data, buf);
- *(u32 *)(data + size) = size;
- *(u32 *)(data + size + 4) = csum;
/* Check the data format */
ret = xbc_init(buf, &msg, &pos);
@@ -387,12 +387,35 @@ static int apply_xbc(const char *path, const char *xbc_path)
free(data);
return fd;
}
+
+ /* To algin up the total size to BOOTCONFIG_ALIGN, get padding size */
+ ret = fstat(fd, &st);
+ if (ret < 0) {
+ pr_err("Failed to get the stat of %s\n", path);
+ free(data);
+ return ret;
+ }
+ pad = BOOTCONFIG_ALIGN - (st.st_size + size) % BOOTCONFIG_ALIGN;
+
/* TODO: Ensure the @path is initramfs/initrd image */
- ret = write(fd, data, size + 8);
+ ret = write(fd, data, size);
if (ret < 0) {
pr_err("Failed to apply a boot config: %d\n", ret);
goto out;
}
+
+ if (pad != BOOTCONFIG_ALIGN) {
+ /* Write padding null characters */
+ ret = write(fd, padbuf, pad);
+ if (ret < 0) {
+ pr_err("Failed to write padding: %d\n", ret);
+ goto out;
+ }
+ size += pad;
+ }
+ ret = write(fd, &size, sizeof(u32));
+ ret = write(fd, &csum, sizeof(u32));
+
/* Write a magic word of the bootconfig */
ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
if (ret < 0) {
diff --git a/tools/bootconfig/test-bootconfig.sh b/tools/bootconfig/test-bootconfig.sh
index d295e406a756..baed891d0ba4 100755
--- a/tools/bootconfig/test-bootconfig.sh
+++ b/tools/bootconfig/test-bootconfig.sh
@@ -9,6 +9,7 @@ else
TESTDIR=.
fi
BOOTCONF=${TESTDIR}/bootconfig
+ALIGN=4
INITRD=`mktemp ${TESTDIR}/initrd-XXXX`
TEMPCONF=`mktemp ${TESTDIR}/temp-XXXX.bconf`
@@ -59,7 +60,10 @@ echo "Show command test"
xpass $BOOTCONF $INITRD
echo "File size check"
-xpass test $new_size -eq $(expr $bconf_size + $initrd_size + 9 + 12)
+total_size=$(expr $bconf_size + $initrd_size + 9 + 12 + $ALIGN - 1 )
+total_size=$(expr $total_size / $ALIGN)
+total_size=$(expr $total_size \* $ALIGN)
+xpass test $new_size -eq $total_size
echo "Apply command repeat test"
xpass $BOOTCONF -a $TEMPCONF $INITRD

Typo in the comment line 391: algin

Woody