[PATCH v2 1/2] tools/bootconfig: Align the bootconfig applied initrd image size to 4
From: Masami Hiramatsu
Date: Mon Nov 16 2020 - 11:23:36 EST
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>
---
Changes in v2:
- Fix to add the footer size.
---
tools/bootconfig/main.c | 36 ++++++++++++++++++++++++++++++-----
tools/bootconfig/test-bootconfig.sh | 6 +++++-
2 files changed, 36 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..ab6a043bbd4c 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -332,11 +332,14 @@ static int delete_xbc(const char *path)
static int apply_xbc(const char *path, const char *xbc_path)
{
+ const char padbuf[BOOTCONFIG_ALIGN] = { 0 };
+ size_t total_size;
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 +350,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 +388,37 @@ 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;
+ }
+ total_size = st.st_size + size + sizeof(u32) + sizeof(u32)
+ + BOOTCONFIG_MAGIC_LEN;
+ pad = BOOTCONFIG_ALIGN - total_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