[coreboot-gerrit] Patch set updated for coreboot: cbfstool: set init_size for linux payloads.

Ronald G. Minnich (rminnich@gmail.com) gerrit at coreboot.org
Wed Sep 28 22:10:59 CEST 2016


Ronald G. Minnich (rminnich at gmail.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16781

-gerrit

commit 3bbc2819791a094ae172bd33eed5bbd711ab8e6f
Author: Ronald G. Minnich <rminnich at google.com>
Date:   Wed Sep 28 10:43:12 2016 -0700

    cbfstool: set init_size for linux payloads.
    
    We were not setting the init_size for linux payloads.
    A proper value of init_size is required if the kernel
    is x86_64.
    
    This is tested in qemu and fixes the observed problem
    that 974f221c84b05b1dc2f5ea50dc16d2a9d1e95eda and later would not
    boot, and would in fact fail in head_64.S.
    
    Change-Id: I254c13d16b1e014a6f1d4fd7c39b1cfe005cd9b0
    Signed-off-by: Ronald G. Minnich <rminnich at google.com>
---
 util/cbfstool/cbfs-payload-linux.c |  9 +++++++++
 util/cbfstool/linux.h              | 12 ++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/util/cbfstool/cbfs-payload-linux.c b/util/cbfstool/cbfs-payload-linux.c
index 03a41cd..afb0f3a 100644
--- a/util/cbfstool/cbfs-payload-linux.c
+++ b/util/cbfstool/cbfs-payload-linux.c
@@ -220,14 +220,19 @@ int parse_bzImage_to_payload(const struct buffer *input,
 
 	if (hdr->setup_sects != 0) {
 		setup_size = (hdr->setup_sects + 1) * 512;
+	} else {
+		WARN("hdr->setup_sects is 0, which could cause boot problems.\n");
 	}
 
 	/* Setup parameter block. Imitate FILO. */
 	struct linux_params params;
 
 	memset(&params, 0, sizeof(struct linux_params));
+
 	params.mount_root_rdonly = hdr->root_flags;
 	params.orig_root_dev = hdr->root_dev;
+	params.init_size = hdr->init_size;
+
 	/* Sensible video defaults. Might be overridden on runtime by coreboot tables. */
 	params.orig_video_mode = 3;
 	params.orig_video_cols = 80;
@@ -262,6 +267,10 @@ int parse_bzImage_to_payload(const struct buffer *input,
 			 * so if possible (relocatable kernel) use that to
 			 * avoid a trampoline copy. */
 			kernel_base = ALIGN(16*1024*1024, params.kernel_alignment);
+			if (hdr->init_size == 0) {
+				ERROR("init_size 0 for relocatable kernel\n");
+				return -1;
+			}
 		}
 	}
 
diff --git a/util/cbfstool/linux.h b/util/cbfstool/linux.h
index b96f447..42763b5 100644
--- a/util/cbfstool/linux.h
+++ b/util/cbfstool/linux.h
@@ -139,7 +139,13 @@ struct linux_params {
 	u32 alt_mem_k;		/* 0x1e0 */
 	u8 reserved5[4];	/* 0x1e4 */
 	u8 e820_map_nr;		/* 0x1e8 */
-	u8 reserved6[9];	/* 0x1e9 */
+	u8 reserved6[8];	/* 0x1e9 */
+				/* This next variable is to show where
+				 * in this struct the Linux setup_hdr
+				 * is located. It does not get filled in.
+				 * We may someday find it useful to use
+				 * its address.
+	u8 setup_hdr;            * 0x1f1  */
 	u16 mount_root_rdonly;	/* 0x1f2 */
 	u8 reserved7[4];	/* 0x1f4 */
 	u16 ramdisk_flags;	/* 0x1f8 */
@@ -170,7 +176,9 @@ struct linux_params {
 	u32 initrd_addr_max;	/* 0x22c */
 	u32 kernel_alignment;	/* 0x230 */
 	u8 relocatable_kernel;	/* 0x234 */
-	u8 reserved13[155];		/* 0x22c */
+	u8 reserved13[0x2b];		/* 0x235 */
+	u32 init_size;          /* 0x260 */
+	u8 reserved14[0x6c];		/* 0x264 */
 	struct e820entry e820_map[E820MAX];	/* 0x2d0 */
 	u8 reserved16[688];	/* 0x550 */
 #define COMMAND_LINE_SIZE 256



More information about the coreboot-gerrit mailing list