Skip to contentSkip to conversation

Add support for the 32 bit boot protocol to the x86 zboot command.

PATCH New Gabe Black 3 participants 37 messages Nov 30, 2011 – Dec 6, 2011 x86

lore
Share & tools
lore

Gabe Black

author
#0 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257 ++++++++++++++++++++++++++---------------
 3 files changed, 183 insertions(+), 126 deletions(-)
Signature · 1 line
1.7.3.1
author
#1 lore raw

PATCH 1/4 x86: Clean up the x86 zimage code in preparation to extend it

This change cleans up some formatting issues in the zimage handling code, and converts it from using offsets added to a base pointer to using the available structure definitions which were already being included.

---
 arch/x86/include/asm/zimage.h |   21 ----------
 arch/x86/lib/zimage.c         |   82 ++++++++++++++++++++++------------------
 2 files changed, 45 insertions(+), 58 deletions(-)
arch/x86/include/asm/zimage.h +0 -21
index b172048..a7adfbf 100644
@@ -29,27 +29,6 @@
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 
-#define CMD_LINE_MAGIC_OFF  0x020 /* Magic 0xa33f if the offset below is valid */
-#define CMD_LINE_OFFSET_OFF 0x022 /* Offset to comandline */
-#define SETUP_SECTS_OFF     0x1F1 /* The size of the setup in sectors */
-#define ROOT_FLAGS_OFF      0x1F2 /* If set, the root is mounted readonly */
-#define VID_MODE_OFF        0x1FA /* Video mode control */
-#define ROOT_DEV_OFF        0x1FC /* Default root device number */
-#define BOOT_FLAG_OFF       0x1FE /* 0xAA55 magic number */
-#define HEADER_OFF          0x202 /* Magic signature "HdrS" */
-#define VERSION_OFF         0x206 /* Boot protocol version supported */
-#define REALMODE_SWTCH_OFF  0x208 /* Boot loader hook (see below) */
-#define START_SYS_OFF       0x20C /* Points to kernel version string */
-#define TYPE_OF_LOADER_OFF  0x210 /* Boot loader identifier */
-#define LOADFLAGS_OFF       0x211 /* Boot protocol option flags */
-#define SETUP_MOVE_SIZE_OFF 0x212 /* Move to high memory size (used with hooks) */
-#define CODE32_START_OFF    0x214 /* Boot loader hook (see below) */
-#define RAMDISK_IMAGE_OFF   0x218 /* initrd load address (set by boot loader) */
-#define RAMDISK_SIZE_OFF    0x21C /* initrd size (set by boot loader) */
-#define HEAP_END_PTR_OFF    0x224 /* Free memory after setup end */
-#define CMD_LINE_PTR_OFF    0x228 /* 32-bit pointer to the kernel command line */
-
-
 #define HEAP_FLAG           0x80
 #define BIG_KERNEL_FLAG     0x01
 
arch/x86/lib/zimage.c +45 -37

182 lines not on this page · raw message

Signature · 1 line
1.7.3.1
author
#2 lore raw

PATCH 2/4 x86: Add support for booting Linux using the 32 bit boot protocol

In reply to Gabe Black

This change conditionally modifies the zboot command so that it can use the 32 bit boot protocol. This is necessary because the 16 bit realmode entry point assumes that it can call BIOS services which neither coreboot nor u-boot provide.

---
 arch/x86/include/asm/zimage.h |    4 +-
 arch/x86/lib/bootm.c          |    6 +++-
 arch/x86/lib/zimage.c         |   54 +++++++++++++++++++++++++++++++----------
 3 files changed, 47 insertions(+), 17 deletions(-)
arch/x86/include/asm/zimage.h +2 -2
index a7adfbf..3a68bb0 100644
@@ -51,8 +51,8 @@ unsigned install_e820_map(unsigned max_entries, struct e820entry *);
 
 void *load_zimage(char *image, unsigned long kernel_size,
 		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot);
+		  int auto_boot, void **load_address);
 
-void boot_zimage(void *setup_base);
+void boot_zimage(void *setup_base, void *load_address);
 
 #endif
arch/x86/lib/bootm.c +4 -2
index bac7b4f..ba3875b 100644
@@ -38,6 +38,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	void		*base_ptr = NULL;
 	ulong		os_data, os_len;
 	image_header_t	*hdr;
+	void		*load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,7 +76,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 
 #ifdef CONFIG_CMD_ZBOOT
 	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start, 0);
+			images->rd_start, images->rd_end - images->rd_start,
+			0, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
@@ -92,7 +94,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	/* we assume that the kernel is in place */
 	printf("\nStarting kernel ...\n\n");
 
-	boot_zimage(base_ptr);
+	boot_zimage(base_ptr, load_address);
 	/* does not return */
 
 error:
arch/x86/lib/zimage.c +41 -13

120 lines not on this page · raw message

Signature · 1 line
1.7.3.1
author
#3 lore raw

PATCH 3/4 x86: Refactor the zboot innards so they can be reused with a vboot image

In reply to Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning, and because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line goes before the zeropage table in vboot which is somewhat incompatible with the normal protocol, where to put the command line is a now a parameter instead of being hard coded.

---
 arch/x86/include/asm/zimage.h |    8 +-
 arch/x86/lib/bootm.c          |   21 +++--
 arch/x86/lib/zimage.c         |  183 +++++++++++++++++++++++------------------
 3 files changed, 122 insertions(+), 90 deletions(-)
arch/x86/include/asm/zimage.h +5 -3
index 3a68bb0..f03ea80 100644
@@ -24,6 +24,7 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/bootparam.h>
 #include <asm/e820.h>
 
 /* linux i386 zImage/bzImage header. Offsets relative to
@@ -49,9 +50,10 @@
 /* Implementation defined function to install an e820 map. */
 unsigned install_e820_map(unsigned max_entries, struct e820entry *);
 
-void *load_zimage(char *image, unsigned long kernel_size,
-		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot, void **load_address);
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+				void **load_address);
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+		 unsigned long initrd_addr, unsigned long initrd_size);
 
 void boot_zimage(void *setup_base, void *load_address);
 
arch/x86/lib/bootm.c +14 -7
index ba3875b..83caf6b 100644
@@ -28,17 +28,20 @@
 #include <command.h>
 #include <image.h>
 #include <u-boot/zlib.h>
+#include <asm/bootparam.h>
 #include <asm/byteorder.h>
 #include <asm/zimage.h>
 
+#define COMMAND_LINE_OFFSET 0x9000
+
 /*cmd_boot.c*/
 int do_bootm_linux(int flag, int argc, char * const argv[],
 		bootm_headers_t *images)
 {
-	void		*base_ptr = NULL;
-	ulong		os_data, os_len;
-	image_header_t	*hdr;
-	void		*load_address;
+	struct boot_params *base_ptr = NULL;
+	ulong os_data, os_len;
+	image_header_t *hdr;
+	void *load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,15 +78,19 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	}
 
 #ifdef CONFIG_CMD_ZBOOT
-	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start,
-			0, &load_address);
+	base_ptr = load_zimage((void *)os_data, os_len, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
 		printf("## Kernel loading failed ...\n");
 		goto error;
+	}
 
+	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+			0, images->rd_start,
+			images->rd_end - images->rd_start)) {
+		printf("## Setting up boot parameters failed ...\n");
+		goto error;
 	}
 
 #ifdef DEBUG
arch/x86/lib/zimage.c +103 -80

262 lines not on this page · raw message

Signature · 1 line
1.7.3.1
#4 lore raw

PATCH 3/4 x86: Refactor the zboot innards so they can be reused with a vboot image

Hi Gabe,

Quoted 10 lines · Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning, and because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line goes before the zeropage table in vboot which is somewhat incompatible with the normal protocol, where to put the command line is a now a parameter instead of being hard coded.

What exactly is vboot? Is this something new you a looking to introduce to U-Boot later, or is it something entirely separate?

Regards,

Graeme

author
#5 lore raw

PATCH 3/4 x86: Refactor the zboot innards so they can be reused with a vboot image

Quoted 16 lines · Graeme Russ

Hi Gabe,

Quoted 3 lines · Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning,

and

Quoted 4 lines

because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line

goes

Quoted 1 line

before the zeropage table in vboot which is somewhat incompatible with

the

Quoted 1 line

normal protocol, where to put the command line is a now a parameter

instead

Quoted 9 lines
Quoted 1 line

of being hard coded.

What exactly is vboot? Is this something new you a looking to introduce to U-Boot later, or is it something entirely separate?

Regards,

Graeme

Vboot is verified boot, a separate ChromeOS thing which is linked into u-boot and calls into its functions.

Gabe

author
#6 lore raw

PATCH 4/4 x86: Add support for specifying an initrd with the zboot command

In reply to Gabe Black

This change finishes plumbing the initrd support built into the zboot mechanism out to the command interface.

It also fixes a bug in the command declaration where the kernel size could be passed as an optional second parameter but not enough arguments were allowed.

---
 arch/x86/lib/zimage.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)
arch/x86/lib/zimage.c +11 -3
index 0cbb571..ef34c23 100644
@@ -321,6 +321,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	void *load_address;
 	char *s;
 	ulong bzImage_size = 0;
+	ulong initrd_addr = 0;
+	ulong initrd_size = 0;
 
 	disable_interrupts();
 
@@ -337,9 +339,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	if (s)
 		bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
 
-	if (argc >= 3)
+	if (argc >= 3) {
 		/* argv[2] holds the size of the bzImage */
 		bzImage_size = simple_strtoul(argv[2], NULL, 16);
+	}
+
+	if (argc >= 4)
+		initrd_addr = simple_strtoul(argv[3], NULL, 16);
+	if (argc >= 5)
+		initrd_size = simple_strtoul(argv[4], NULL, 16);
 
 	/* Lets look for */
 	base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
@@ -349,7 +357,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		return -1;
 	}
 	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
-			0, 0, 0)) {
+			0, initrd_addr, initrd_size)) {
 		printf("Setting up boot parameters failed ...\n");
 		return -1;
 	}
@@ -366,7 +374,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 }
 
 U_BOOT_CMD(
-	zboot, 2, 0,	do_zboot,
+	zboot, 5, 0,	do_zboot,
 	"Boot bzImage",
 	""
 );
Signature · 1 line
1.7.3.1
#7 lore raw

PATCH 4/4 x86: Add support for specifying an initrd with the zboot command

Hi Gabe,

Quoted 26 lines · Gabe Black

This change finishes plumbing the initrd support built into the zboot mechanism out to the command interface.

It also fixes a bug in the command declaration where the kernel size could be passed as an optional second parameter but not enough arguments were allowed.

---
 arch/x86/lib/zimage.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)
arch/x86/lib/zimage.c +2 -0
index 0cbb571..ef34c23 100644
@@ -321,6 +321,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	void *load_address;
 	char *s;
 	ulong bzImage_size = 0;
+	ulong initrd_addr = 0;
+	ulong initrd_size = 0;
 
 	disable_interrupts();
 

arch/x86/lib/zimage.c int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) · line 345

Quoted 8 lines
arch/x86/lib/zimage.c +2 -1
@@ -337,9 +339,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	if (s)
 		bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
 
-	if (argc >= 3)
+	if (argc >= 3) {
 		/* argv[2] holds the size of the bzImage */
 		bzImage_size = simple_strtoul(argv[2], NULL, 16);
+	}

No braces for single-line statements - the comment is unnecessary as the code is obvious

Quoted 18 lines
arch/x86/lib/zimage.c +6 -1
+
+	if (argc >= 4)
+		initrd_addr = simple_strtoul(argv[3], NULL, 16);
+	if (argc >= 5)
+		initrd_size = simple_strtoul(argv[4], NULL, 16);
 
 	/* Lets look for */
 	base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
@@ -349,7 +357,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		return -1;
 	}
 	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
-			0, 0, 0)) {
+			0, initrd_addr, initrd_size)) {
 		printf("Setting up boot parameters failed ...\n");
 		return -1;
 	}

arch/x86/lib/zimage.c int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) · line 379

Quoted 7 lines
arch/x86/lib/zimage.c +1 -1
@@ -366,7 +374,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 }
 
 U_BOOT_CMD(
-	zboot, 2, 0,	do_zboot,
+	zboot, 5, 0,	do_zboot,
 	"Boot bzImage",
 	""

I think it is about time it got a help message :)

arch/x86/lib/zimage.c int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) · line 380

Quoted 1 line
arch/x86/lib/zimage.c +0 -0
 );

Regards,

Graeme

#8 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

In reply to Gabe Black

Hi Gabe,

Quoted 11 lines · Gabe Black

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

Quoted 4 lines
 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257 ++++++++++++++++++++++++++---------------
 3 files changed, 183 insertions(+), 126 deletions(-)

The only real concern I have right now is that this series, which is purely x86, relies on functionality introduced in the "Add code to read in the
coreboot tables and fill in memory info" series. Specifically,
install_e820_map() is in only in arch/x86/cpu/coreboot/sdram.c

Of course, you need to define CONFIG_ZBOOT_32 to make use of the functionality, so maybe this is OK, but I do wonder if a default e829 map is possible...

All that aside, I am going to have a good play with it all right now :)

Regards,

Graeme

#9 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

Hi Gabe,

Quoted 19 lines · Graeme Russ

Hi Gabe,

Quoted 11 lines · Gabe Black

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

Quoted 4 lines
 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257 ++++++++++++++++++++++++++---------------
 3 files changed, 183 insertions(+), 126 deletions(-)
Quoted 4 lines

The only real concern I have right now is that this series, which is purely x86, relies on functionality introduced in the "Add code to read in the
coreboot tables and fill in memory info" series. Specifically,
install_e820_map() is in only in arch/x86/cpu/coreboot/sdram.c

Ignore me ;) - I realise now that there is a weak stub function

Can you please move the changes to arch/x86/include/asm/zimage.h and arch/x86/lib/zimage.c from the "x86: Add infrastructure to extract an e820 table from the coreboot tables" patch into this series - That, I think, will make them stand-alone and make the other series coreboot only

Regards,

Graeme

#10 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

In reply to Gabe Black

Hi Gabe,

Quoted 11 lines · Gabe Black

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

Quoted 4 lines
 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257 ++++++++++++++++++++++++++---------------
 3 files changed, 183 insertions(+), 126 deletions(-)

Well I managed to bolt it all together (you have other changes to arch/x86/include/asm/zimage.h so one of the patches had to be applied manually)

But I cannot get the e820 map setup right for Linux - I tried to create a single 2GB entry (I have no reserved memory, it's all free for Linux to do what it wishes) with:

unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)

{
	entries[0].addr = 0x00000000;
	entries[0].size = 0x80000000;
	entries[0].type = E820_RAM;

	return 1;
}

But Linux throws back:

[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0 (graeme at helios) (gcc version 4.5.2
(Ubuntu/Linaro 4.5.2-8ubuntu4) ) #4 Sun Nov 20 20:38:20 EST 2011
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000] Disabled fast string operations
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e801: 0000000000000000 - 000000000009f000 (usable)
[    0.000000]  BIOS-e801: 0000000000100000 - 0000000000100000 (usable)
[    0.000000] bootconsole [earlyser0] enabled
[    0.000000] Notice: NX (Execute Disable) protection cannot be enabled:
non-PAE kernel!
[    0.000000] DMI not present or invalid.
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000
(usable) ==> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
[    0.000000] last_pfn = 0x9f max_arch_pfn = 0x100000
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000]   00000-FFFFF uncachable
[    0.000000] MTRR variable ranges enabled:
[    0.000000]   0 base 000000000 mask 0C0000000 write-back
[    0.000000]   1 base 0FFFB0000 mask 0FFFF0000 write-protect
[    0.000000]   2 disabled
[    0.000000]   3 disabled
[    0.000000]   4 disabled
[    0.000000]   5 disabled
[    0.000000]   6 disabled
[    0.000000]   7 disabled
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[    0.000000] initial memory mapped : 0 - 01800000
[    0.000000] Base memory trampoline at [c009e000] 9e000 size 4096
[    0.000000] init_memory_mapping: 0000000000000000-000000000009f000
[    0.000000]  0000000000 - 000009f000 page 4k
[    0.000000] kernel direct mapping tables up to 9f000 @ 99000-9e000
[    0.000000] 0MB HIGHMEM available.
[    0.000000] 0MB LOWMEM available.
[    0.000000]   mapped low ram: 0 - 0009f000
[    0.000000]   low ram: 0 - 0009f000

Any ideas?

Regards,

Graeme

#11 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

Quoted 80 lines · Graeme Russ

Hi Gabe,

Quoted 11 lines · Gabe Black

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

Quoted 3 lines
 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257

++++++++++++++++++++++++++---------------

Quoted 1 line
 3 files changed, 183 insertions(+), 126 deletions(-)

Well I managed to bolt it all together (you have other changes to arch/x86/include/asm/zimage.h so one of the patches had to be applied manually)

But I cannot get the e820 map setup right for Linux - I tried to create a single 2GB entry (I have no reserved memory, it's all free for Linux to do what it wishes) with:

unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)

{
       entries[0].addr = 0x00000000;
       entries[0].size = 0x80000000;
       entries[0].type = E820_RAM;

       return 1;
}

But Linux throws back:

[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0 (graeme at helios) (gcc version 4.5.2
(Ubuntu/Linaro 4.5.2-8ubuntu4) ) #4 Sun Nov 20 20:38:20 EST 2011
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000] Disabled fast string operations
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e801: 0000000000000000 - 000000000009f000 (usable)
[    0.000000]  BIOS-e801: 0000000000100000 - 0000000000100000 (usable)
[    0.000000] bootconsole [earlyser0] enabled
[    0.000000] Notice: NX (Execute Disable) protection cannot be enabled:
non-PAE kernel!
[    0.000000] DMI not present or invalid.
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000
(usable) ==> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000
(usable)
[    0.000000] last_pfn = 0x9f max_arch_pfn = 0x100000
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000]   00000-FFFFF uncachable
[    0.000000] MTRR variable ranges enabled:
[    0.000000]   0 base 000000000 mask 0C0000000 write-back
[    0.000000]   1 base 0FFFB0000 mask 0FFFF0000 write-protect
[    0.000000]   2 disabled
[    0.000000]   3 disabled
[    0.000000]   4 disabled
[    0.000000]   5 disabled
[    0.000000]   6 disabled
[    0.000000]   7 disabled
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new
0x7010600070106
[    0.000000] initial memory mapped : 0 - 01800000
[    0.000000] Base memory trampoline at [c009e000] 9e000 size 4096
[    0.000000] init_memory_mapping: 0000000000000000-000000000009f000
[    0.000000]  0000000000 - 000009f000 page 4k
[    0.000000] kernel direct mapping tables up to 9f000 @ 99000-9e000
[    0.000000] 0MB HIGHMEM available.
[    0.000000] 0MB LOWMEM available.
[    0.000000]   mapped low ram: 0 - 0009f000
[    0.000000]   low ram: 0 - 0009f000
Quoted 8 lines

Any ideas?

Regards,

Graeme

If you use the old 16 bit boot protocol Linux will attempt to figure out the memory size using calls into the BIOS itself and ignore e820 (or attempt to call it itself?). One of those BIOS calls is e801 which, if I remember correctly, is handled by u-boot and returns the total size of memory which is stored in the global data structure. If you're using the 32 bit protocol, it skips all the BIOS stuff and uses the e820 map passed in the zero page structure.

Gabe

#12 lore raw

cover Add support for the 32 bit boot protocol to the x86 zboot command.

Hi Gabe,

Quoted 3 lines · Gabe Black

On Wed, Nov 30, 2011 at 4:13 AM, Graeme Russ <[email protected]>

Quoted 5 lines · wrote:
Quoted 5 lines

Hi Gabe,

Quoted 1 line · Gabe Black

These four patches add support for the 32 bit Linux boot protocol to

the

Quoted 10 lines
Quoted 10 lines
Quoted 10 lines

zboot command. They also add support for an initrd.

Gabe Black (4):
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
 arch/x86/include/asm/zimage.h |   31 +----
 arch/x86/lib/bootm.c          |   21 +++-
 arch/x86/lib/zimage.c         |  257

++++++++++++++++++++++++++---------------

Quoted 4 lines
Quoted 4 lines
Quoted 1 line
 3 files changed, 183 insertions(+), 126 deletions(-)

Well I managed to bolt it all together (you have other changes to arch/x86/include/asm/zimage.h so one of the patches had to be applied

manually)

Quoted 3 lines
Quoted 3 lines

But I cannot get the e820 map setup right for Linux - I tried to create a single 2GB entry (I have no reserved memory, it's all free for Linux to

do

Quoted 3 lines
Quoted 3 lines

what it wishes) with:

unsigned install_e820_map(unsigned max_entries, struct e820entry

*entries)

Quoted 17 lines
Quoted 17 lines
{
       entries[0].addr = 0x00000000;
       entries[0].size = 0x80000000;
       entries[0].type = E820_RAM;

       return 1;
}

But Linux throws back:

[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0 (graeme at helios) (gcc version 4.5.2
(Ubuntu/Linaro 4.5.2-8ubuntu4) ) #4 Sun Nov 20 20:38:20 EST 2011
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000] Disabled fast string operations
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e801: 0000000000000000 - 000000000009f000 (usable)
Quoted 8 lines
Quoted 8 lines
[    0.000000]  BIOS-e801: 0000000000100000 - 0000000000100000 (usable)
[    0.000000] bootconsole [earlyser0] enabled
[    0.000000] Notice: NX (Execute Disable) protection cannot be enabled:
non-PAE kernel!
[    0.000000] DMI not present or invalid.
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000
(usable) ==> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000

(usable)

Quoted 6 lines
Quoted 6 lines
[    0.000000] last_pfn = 0x9f max_arch_pfn = 0x100000
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000]   00000-FFFFF uncachable
[    0.000000] MTRR variable ranges enabled:
[    0.000000]   0 base 000000000 mask 0C0000000 write-back
Quoted 8 lines
Quoted 8 lines
[    0.000000]   1 base 0FFFB0000 mask 0FFFF0000 write-protect
[    0.000000]   2 disabled
[    0.000000]   3 disabled
[    0.000000]   4 disabled
[    0.000000]   5 disabled
[    0.000000]   6 disabled
[    0.000000]   7 disabled
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new

0x7010600070106

Quoted 12 lines
Quoted 12 lines
[    0.000000] initial memory mapped : 0 - 01800000
[    0.000000] Base memory trampoline at [c009e000] 9e000 size 4096
[    0.000000] init_memory_mapping: 0000000000000000-000000000009f000
[    0.000000]  0000000000 - 000009f000 page 4k
[    0.000000] kernel direct mapping tables up to 9f000 @ 99000-9e000
[    0.000000] 0MB HIGHMEM available.
[    0.000000] 0MB LOWMEM available.
[    0.000000]   mapped low ram: 0 - 0009f000
[    0.000000]   low ram: 0 - 0009f000

Any ideas?

Quoted 8 lines
Quoted 5 lines

Regards,

Graeme

If you use the old 16 bit boot protocol Linux will attempt to figure out

the memory size using calls into the BIOS itself and ignore e820 (or attempt to call it itself?). One of those BIOS calls is e801 which, if I remember correctly, is handled by u-boot and returns the total size of memory which is stored in the global data structure. If you're using the 32 bit protocol, it skips all the BIOS stuff and uses the e820 map passed in the zero page structure.

But I'm using your 32-bit entry point...

Regards,

Graeme

author
#13 lore raw

v2 cover Add support for the 32 bit boot protocol and coreboot table parsing.

In reply to Gabe Black

Add functionality for reading in the coreboot tables and storing their contents in a structure for easy access.

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.
- Moved the coreboot specific e820 function into a different patch.
- Moved the coreboot specfic e820 function into this patch.
- Add a help message to the zboot command.

Gabe Black (6):
x86: Import code from coreboot's libpayload to parse the coreboot
table
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Add infrastructure to extract an e820 table from the coreboot
tables
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

 arch/x86/cpu/coreboot/Makefile                  |    3 +
 arch/x86/cpu/coreboot/ipchecksum.c              |   54 +++++
 arch/x86/cpu/coreboot/sdram.c                   |   38 +++-
 arch/x86/cpu/coreboot/sysinfo.c                 |   39 ++++
 arch/x86/cpu/coreboot/tables.c                  |  183 +++++++++++++++
 arch/x86/include/asm/arch-coreboot/ipchecksum.h |   37 +++
 arch/x86/include/asm/arch-coreboot/sysinfo.h    |   64 ++++++
 arch/x86/include/asm/arch-coreboot/tables.h     |  241 ++++++++++++++++++++
 arch/x86/include/asm/zimage.h                   |   36 +--
 arch/x86/lib/bootm.c                            |   21 ++-
 arch/x86/lib/zimage.c                           |  276 +++++++++++++++--------
 board/chromebook-x86/coreboot/coreboot.c        |   10 +
 12 files changed, 874 insertions(+), 128 deletions(-)
 create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c
 create mode 100644 arch/x86/cpu/coreboot/sysinfo.c
 create mode 100644 arch/x86/cpu/coreboot/tables.c
 create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h
Signature · 1 line
1.7.3.1
author
#14 lore raw

v3 cover Add support for the 32 bit boot protocol and coreboot table parsing.

Add functionality for reading in the coreboot tables and storing their contents in a structure for easy access.

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.
- Moved the coreboot specific e820 function into a different patch.
- Moved the coreboot specific e820 function into this patch.
- Add a help message to the zboot command.

Changes in v3:
- Moved the coreboot specific e820 function declaration out of the header.
- Moved the coreboot specific e820 function declaration into this patch.

Gabe Black (6):
x86: Import code from coreboot's libpayload to parse the coreboot
table
x86: Clean up the x86 zimage code in preparation to extend it
x86: Add support for booting Linux using the 32 bit boot protocol
x86: Add infrastructure to extract an e820 table from the coreboot
tables
x86: Refactor the zboot innards so they can be reused with a vboot
image
x86: Add support for specifying an initrd with the zboot command

 arch/x86/cpu/coreboot/Makefile                  |    3 +
 arch/x86/cpu/coreboot/ipchecksum.c              |   54 +++++
 arch/x86/cpu/coreboot/sdram.c                   |   38 +++-
 arch/x86/cpu/coreboot/sysinfo.c                 |   39 ++++
 arch/x86/cpu/coreboot/tables.c                  |  183 +++++++++++++++
 arch/x86/include/asm/arch-coreboot/ipchecksum.h |   37 +++
 arch/x86/include/asm/arch-coreboot/sysinfo.h    |   64 ++++++
 arch/x86/include/asm/arch-coreboot/tables.h     |  241 ++++++++++++++++++++
 arch/x86/include/asm/zimage.h                   |   36 +--
 arch/x86/lib/bootm.c                            |   21 ++-
 arch/x86/lib/zimage.c                           |  276 +++++++++++++++--------
 board/chromebook-x86/coreboot/coreboot.c        |   10 +
 12 files changed, 874 insertions(+), 128 deletions(-)
 create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c
 create mode 100644 arch/x86/cpu/coreboot/sysinfo.c
 create mode 100644 arch/x86/cpu/coreboot/tables.c
 create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h
Signature · 1 line
1.7.3.1
#15 lore raw

v3 cover Add support for the 32 bit boot protocol and coreboot table parsing.

Hi Gabe,

Quoted 44 lines · Gabe Black

Add functionality for reading in the coreboot tables and storing their contents in a structure for easy access.

These four patches add support for the 32 bit Linux boot protocol to the zboot command. They also add support for an initrd.

Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.
- Moved the coreboot specific e820 function into a different patch.
- Moved the coreboot specific e820 function into this patch.
- Add a help message to the zboot command.

Changes in v3:
- Moved the coreboot specific e820 function declaration out of the header.
- Moved the coreboot specific e820 function declaration into this patch.

Gabe Black (6):
?x86: Import code from coreboot's libpayload to parse the coreboot ? ?table
?x86: Clean up the x86 zimage code in preparation to extend it ?x86: Add support for booting Linux using the 32 bit boot protocol ?x86: Add infrastructure to extract an e820 table from the coreboot ? ?tables
?x86: Refactor the zboot innards so they can be reused with a vboot ? ?image
?x86: Add support for specifying an initrd with the zboot command

?arch/x86/cpu/coreboot/Makefile ? ? ? ? ? ? ? ? ?| ? ?3 +
?arch/x86/cpu/coreboot/ipchecksum.c ? ? ? ? ? ? ?| ? 54 +++++
?arch/x86/cpu/coreboot/sdram.c ? ? ? ? ? ? ? ? ? | ? 38 +++-
?arch/x86/cpu/coreboot/sysinfo.c ? ? ? ? ? ? ? ? | ? 39 ++++
?arch/x86/cpu/coreboot/tables.c ? ? ? ? ? ? ? ? ?| ?183 +++++++++++++++
?arch/x86/include/asm/arch-coreboot/ipchecksum.h | ? 37 +++
?arch/x86/include/asm/arch-coreboot/sysinfo.h ? ?| ? 64 ++++++
?arch/x86/include/asm/arch-coreboot/tables.h ? ? | ?241 ++++++++++++++++++++
?arch/x86/include/asm/zimage.h ? ? ? ? ? ? ? ? ? | ? 36 +--
?arch/x86/lib/bootm.c ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 21 ++-
?arch/x86/lib/zimage.c ? ? ? ? ? ? ? ? ? ? ? ? ? | ?276 +++++++++++++++--------
?board/chromebook-x86/coreboot/coreboot.c ? ? ? ?| ? 10 +
Quoted 7 lines

?12 files changed, 874 insertions(+), 128 deletions(-) ?create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c ?create mode 100644 arch/x86/cpu/coreboot/sysinfo.c ?create mode 100644 arch/x86/cpu/coreboot/tables.c ?create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h ?create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h ?create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h

Thanks, I will apply these to u-boot-x86/next ASAP

Regards,

Graeme

author
#16 lore raw

PATCH v3 1/6 x86: Import code from coreboot's libpayload to parse the coreboot table

In reply to Gabe Black

This change also forces the lib_sysinfo structure to be in the .data section. Otherwise it ends up in the .bss section. U-boot assumes that it doesn't need to copy it over during relocation, and instead fills that whole section with zeroes. If we really were booting from ROM that would be appropriate, but we need some information from the coreboot tables (memory size) before then and have to fill that structure before relocation. We skirt u-boot's assumption by putting this in .data where it assumes there is still read only but non-zero data.

---
Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to
arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.

 arch/x86/cpu/coreboot/Makefile                  |    3 +
 arch/x86/cpu/coreboot/ipchecksum.c              |   54 +++++
 arch/x86/cpu/coreboot/sysinfo.c                 |   39 ++++
 arch/x86/cpu/coreboot/tables.c                  |  183 +++++++++++++++++
 arch/x86/include/asm/arch-coreboot/ipchecksum.h |   37 ++++
 arch/x86/include/asm/arch-coreboot/sysinfo.h    |   64 ++++++
 arch/x86/include/asm/arch-coreboot/tables.h     |  241 +++++++++++++++++++++++
 board/chromebook-x86/coreboot/coreboot.c        |   10 +
 8 files changed, 631 insertions(+), 0 deletions(-)
 create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c
 create mode 100644 arch/x86/cpu/coreboot/sysinfo.c
 create mode 100644 arch/x86/cpu/coreboot/tables.c
 create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h
arch/x86/cpu/coreboot/Makefile +3 -0
index 0444399..13f5f8a 100644
@@ -33,7 +33,10 @@ include $(TOPDIR)/config.mk
 
 LIB	:= $(obj)lib$(SOC).o
 
+COBJS-$(CONFIG_SYS_COREBOOT) += tables.o
+COBJS-$(CONFIG_SYS_COREBOOT) += ipchecksum.o
 COBJS-$(CONFIG_SYS_COREBOOT) += sdram.o
+COBJS-$(CONFIG_SYS_COREBOOT) += sysinfo.o
 
 SOBJS-$(CONFIG_SYS_COREBOOT) += coreboot_car.o
 
arch/x86/cpu/coreboot/ipchecksum.c new file +54 -0

54 lines not on this page · raw message

arch/x86/cpu/coreboot/sysinfo.c new file +39 -0
new file mode 100644
index 0000000..9b3e660
@@ -0,0 +1,39 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2009 coresystems GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <asm/arch-coreboot/sysinfo.h>
+
+/*
+ * This needs to be in the .data section so that it's copied over during
+ * relocation. By default it's put in the .bss section which is simply filled
+ * with zeroes when transitioning from "ROM", which is really RAM, to other
+ * RAM.
+ */
+struct sysinfo_t lib_sysinfo __attribute__((section(".data")));
arch/x86/cpu/coreboot/tables.c new file +183 -0

183 lines not on this page · raw message

arch/x86/include/asm/arch-coreboot/ipchecksum.h new file +37 -0
new file mode 100644
index 0000000..1d73b4d
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * It has originally been taken from the FreeBSD project.
+ *
+ * Copyright (c) 2001 Charles Mott <[email protected]>
+ * Copyright (c) 2008 coresystems GmbH
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _COREBOOT_IPCHECKSUM_H
+#define _COREBOOT_IPCHECKSUM_H
+
+unsigned short ipchksum(const void *vptr, unsigned long nbytes);
+
+#endif
arch/x86/include/asm/arch-coreboot/sysinfo.h new file +64 -0

64 lines not on this page · raw message

arch/x86/include/asm/arch-coreboot/tables.h new file +241 -0

241 lines not on this page · raw message

board/chromebook-x86/coreboot/coreboot.c +10 -0
index 44c6f15..22a643c 100644
@@ -26,6 +26,8 @@
 #include <asm/u-boot-x86.h>
 #include <flash.h>
 #include <netdev.h>
+#include <asm/arch-coreboot/tables.h>
+#include <asm/arch-coreboot/sysinfo.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -34,6 +36,14 @@ unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN;
 /*
  * Miscellaneous platform dependent initializations
  */
+int cpu_init_f(void)
+{
+	int ret = get_coreboot_info(&lib_sysinfo);
+	if (ret != 0)
+		printf("Failed to parse coreboot tables.\n");
+	return ret;
+}
+
 int board_early_init_f(void)
 {
 	return 0;
Signature · 1 line
1.7.3.1
#17 lore raw

PATCH v3 1/6 x86: Import code from coreboot's libpayload to parse the coreboot table

Hi Gabe,

Quoted 16 lines · Gabe Black

This change also forces the lib_sysinfo structure to be in the .data section. Otherwise it ends up in the .bss section. U-boot assumes that it doesn't need to copy it over during relocation, and instead fills that whole section with zeroes. If we really were booting from ROM that would be appropriate, but we need some information from the coreboot tables (memory size) before then and have to fill that structure before relocation. We skirt u-boot's assumption by putting this in .data where it assumes there is still read only but non-zero data.

---
Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to
arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.

Quoted 15 lines
 arch/x86/cpu/coreboot/Makefile                  |    3 +
 arch/x86/cpu/coreboot/ipchecksum.c              |   54 +++++
 arch/x86/cpu/coreboot/sysinfo.c                 |   39 ++++
 arch/x86/cpu/coreboot/tables.c                  |  183 +++++++++++++++++
 arch/x86/include/asm/arch-coreboot/ipchecksum.h |   37 ++++
 arch/x86/include/asm/arch-coreboot/sysinfo.h    |   64 ++++++
 arch/x86/include/asm/arch-coreboot/tables.h     |  241 +++++++++++++++++++++++
 board/chromebook-x86/coreboot/coreboot.c        |   10 +
 8 files changed, 631 insertions(+), 0 deletions(-)
 create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c
 create mode 100644 arch/x86/cpu/coreboot/sysinfo.c
 create mode 100644 arch/x86/cpu/coreboot/tables.c
 create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h

Applied to u-boot-x86/next

Regards,

Graeme

author
#18 lore raw

PATCH v3 2/6 x86: Clean up the x86 zimage code in preparation to extend it

In reply to Gabe Black

This change cleans up some formatting issues in the zimage handling code, and converts it from using offsets added to a base pointer to using the available structure definitions which were already being included.

---
Changes in v2:
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.

 arch/x86/include/asm/zimage.h |   21 ----------
 arch/x86/lib/zimage.c         |   82 ++++++++++++++++++++++------------------
 2 files changed, 45 insertions(+), 58 deletions(-)
arch/x86/include/asm/zimage.h +0 -21
index a02637f..1a77e00 100644
@@ -27,27 +27,6 @@
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 
-#define CMD_LINE_MAGIC_OFF  0x020 /* Magic 0xa33f if the offset below is valid */
-#define CMD_LINE_OFFSET_OFF 0x022 /* Offset to comandline */
-#define SETUP_SECTS_OFF     0x1F1 /* The size of the setup in sectors */
-#define ROOT_FLAGS_OFF      0x1F2 /* If set, the root is mounted readonly */
-#define VID_MODE_OFF        0x1FA /* Video mode control */
-#define ROOT_DEV_OFF        0x1FC /* Default root device number */
-#define BOOT_FLAG_OFF       0x1FE /* 0xAA55 magic number */
-#define HEADER_OFF          0x202 /* Magic signature "HdrS" */
-#define VERSION_OFF         0x206 /* Boot protocol version supported */
-#define REALMODE_SWTCH_OFF  0x208 /* Boot loader hook (see below) */
-#define START_SYS_OFF       0x20C /* Points to kernel version string */
-#define TYPE_OF_LOADER_OFF  0x210 /* Boot loader identifier */
-#define LOADFLAGS_OFF       0x211 /* Boot protocol option flags */
-#define SETUP_MOVE_SIZE_OFF 0x212 /* Move to high memory size (used with hooks) */
-#define CODE32_START_OFF    0x214 /* Boot loader hook (see below) */
-#define RAMDISK_IMAGE_OFF   0x218 /* initrd load address (set by boot loader) */
-#define RAMDISK_SIZE_OFF    0x21C /* initrd size (set by boot loader) */
-#define HEAP_END_PTR_OFF    0x224 /* Free memory after setup end */
-#define CMD_LINE_PTR_OFF    0x228 /* 32-bit pointer to the kernel command line */
-
-
 #define HEAP_FLAG           0x80
 #define BIG_KERNEL_FLAG     0x01
 
arch/x86/lib/zimage.c +45 -37

182 lines not on this page · raw message

Signature · 1 line
1.7.3.1
#19 lore raw

PATCH v3 2/6 x86: Clean up the x86 zimage code in preparation to extend it

Hi Gabe,

Quoted 11 lines · Gabe Black

This change cleans up some formatting issues in the zimage handling code, and converts it from using offsets added to a base pointer to using the available structure definitions which were already being included.

---
Changes in v2:
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.

Quoted 4 lines
 arch/x86/include/asm/zimage.h |   21 ----------
 arch/x86/lib/zimage.c         |   82 ++++++++++++++++++++++------------------
 2 files changed, 45 insertions(+), 58 deletions(-)

Applied to u-boot-x86/next

Regards,

Graeme

author
#20 lore raw

PATCH v3 3/6 x86: Add support for booting Linux using the 32 bit boot protocol

In reply to Gabe Black

This change conditionally modifies the zboot command so that it can use the 32 bit boot protocol. This is necessary because the 16 bit realmode entry point assumes that it can call BIOS services which neither coreboot nor u-boot provide.

---
Changes in v2:
- Moved the coreboot specific e820 function into a different patch.

Changes in v3:
- Moved the coreboot specific e820 function declaration out of the header.

 arch/x86/include/asm/zimage.h |    9 ++++-
 arch/x86/lib/bootm.c          |    6 ++-
 arch/x86/lib/zimage.c         |   64 ++++++++++++++++++++++++++++++++--------
 3 files changed, 62 insertions(+), 17 deletions(-)
arch/x86/include/asm/zimage.h +7 -2
index 1a77e00..3a68bb0 100644
@@ -24,6 +24,8 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/e820.h>
+
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 
@@ -44,10 +46,13 @@
 #define BZIMAGE_LOAD_ADDR  0x100000
 #define ZIMAGE_LOAD_ADDR   0x10000
 
+/* Implementation defined function to install an e820 map. */
+unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+
 void *load_zimage(char *image, unsigned long kernel_size,
 		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot);
+		  int auto_boot, void **load_address);
 
-void boot_zimage(void *setup_base);
+void boot_zimage(void *setup_base, void *load_address);
 
 #endif
arch/x86/lib/bootm.c +4 -2
index bac7b4f..ba3875b 100644
@@ -38,6 +38,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	void		*base_ptr = NULL;
 	ulong		os_data, os_len;
 	image_header_t	*hdr;
+	void		*load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,7 +76,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 
 #ifdef CONFIG_CMD_ZBOOT
 	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start, 0);
+			images->rd_start, images->rd_end - images->rd_start,
+			0, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
@@ -92,7 +94,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	/* we assume that the kernel is in place */
 	printf("\nStarting kernel ...\n\n");
 
-	boot_zimage(base_ptr);
+	boot_zimage(base_ptr, load_address);
 	/* does not return */
 
 error:
arch/x86/lib/zimage.c +51 -13

136 lines not on this page · raw message

Signature · 1 line
1.7.3.1
#21 lore raw

PATCH v3 3/6 x86: Add support for booting Linux using the 32 bit boot protocol

Hi Gabe,

Quoted 10 lines · Gabe Black

This change conditionally modifies the zboot command so that it can use the 32 bit boot protocol. This is necessary because the 16 bit realmode entry point assumes that it can call BIOS services which neither coreboot nor u-boot provide.

---
Changes in v2:
- Moved the coreboot specific e820 function into a different patch.

Quoted 7 lines

Changes in v3:
- Moved the coreboot specific e820 function declaration out of the header.

 arch/x86/include/asm/zimage.h |    9 ++++-
 arch/x86/lib/bootm.c          |    6 ++-
 arch/x86/lib/zimage.c         |   64 ++++++++++++++++++++++++++++++++--------
 3 files changed, 62 insertions(+), 17 deletions(-)

Applied to u-boot-x86/next

Regards,

Graeme

author
#22 lore raw

PATCH v3 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

In reply to Gabe Black

Also approximate the size of RAM using the largest RAM address available in the tables. There may be areas which are marked as reserved which are actually at the end of RAM.

---
Changes in v2:
- Moved the coreboot specific e820 function into this patch.

Changes in v3:
- Moved the coreboot specific e820 function declaration into this patch.

 arch/x86/cpu/coreboot/sdram.c |   38 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 37 insertions(+), 1 deletions(-)
arch/x86/cpu/coreboot/sdram.c +37 -1
index b56085a..f8fdac6 100644
@@ -23,13 +23,49 @@
  */
 
 #include <common.h>
+#include <malloc.h>
+#include <asm/e820.h>
 #include <asm/u-boot-x86.h>
+#include <asm/global_data.h>
+#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch-coreboot/tables.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+{
+	int i;
+
+	unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries);
+	if (num_entries < lib_sysinfo.n_memranges) {
+		printf("Warning: Limiting e820 map to %d entries.\n",
+			num_entries);
+	}
+	for (i = 0; i < num_entries; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+
+		entries[i].addr = memrange->base;
+		entries[i].size = memrange->size;
+		entries[i].type = memrange->type;
+	}
+	return num_entries;
+}
+
 int dram_init_f(void)
 {
-	gd->ram_size = 64*1024*1024;
+	int i;
+	phys_size_t ram_size = 0;
+
+	for (i = 0; i < lib_sysinfo.n_memranges; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+		unsigned long long end = memrange->base + memrange->size;
+
+		if (memrange->type == CB_MEM_RAM && end > ram_size)
+			ram_size = end;
+	}
+	gd->ram_size = ram_size;
+	if (ram_size == 0)
+		return -1;
 	return 0;
 }
 
Signature · 1 line
1.7.3.1
#23 lore raw

PATCH v3 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

Hi Gabe,

Quoted 9 lines · Gabe Black

Also approximate the size of RAM using the largest RAM address available in the tables. There may be areas which are marked as reserved which are actually at the end of RAM.

---
Changes in v2:
- Moved the coreboot specific e820 function into this patch.

Quoted 5 lines

Changes in v3:
- Moved the coreboot specific e820 function declaration into this patch.

 arch/x86/cpu/coreboot/sdram.c |   38 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 37 insertions(+), 1 deletions(-)

Applied to u-boot-x86/next

Regards,

Graeme

author
#24 lore raw

PATCH v3 5/6 x86: Refactor the zboot innards so they can be reused with a vboot image

In reply to Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning, and because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line goes before the zeropage table in vboot which is somewhat incompatible with the normal protocol, where to put the command line is a now a parameter instead of being hard coded.

---
 arch/x86/include/asm/zimage.h |    8 +-
 arch/x86/lib/bootm.c          |   21 +++--
 arch/x86/lib/zimage.c         |  183 +++++++++++++++++++++++------------------
 3 files changed, 122 insertions(+), 90 deletions(-)
arch/x86/include/asm/zimage.h +5 -3
index 3a68bb0..f03ea80 100644
@@ -24,6 +24,7 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/bootparam.h>
 #include <asm/e820.h>
 
 /* linux i386 zImage/bzImage header. Offsets relative to
@@ -49,9 +50,10 @@
 /* Implementation defined function to install an e820 map. */
 unsigned install_e820_map(unsigned max_entries, struct e820entry *);
 
-void *load_zimage(char *image, unsigned long kernel_size,
-		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot, void **load_address);
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+				void **load_address);
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+		 unsigned long initrd_addr, unsigned long initrd_size);
 
 void boot_zimage(void *setup_base, void *load_address);
 
arch/x86/lib/bootm.c +14 -7
index ba3875b..83caf6b 100644
@@ -28,17 +28,20 @@
 #include <command.h>
 #include <image.h>
 #include <u-boot/zlib.h>
+#include <asm/bootparam.h>
 #include <asm/byteorder.h>
 #include <asm/zimage.h>
 
+#define COMMAND_LINE_OFFSET 0x9000
+
 /*cmd_boot.c*/
 int do_bootm_linux(int flag, int argc, char * const argv[],
 		bootm_headers_t *images)
 {
-	void		*base_ptr = NULL;
-	ulong		os_data, os_len;
-	image_header_t	*hdr;
-	void		*load_address;
+	struct boot_params *base_ptr = NULL;
+	ulong os_data, os_len;
+	image_header_t *hdr;
+	void *load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,15 +78,19 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	}
 
 #ifdef CONFIG_CMD_ZBOOT
-	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start,
-			0, &load_address);
+	base_ptr = load_zimage((void *)os_data, os_len, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
 		printf("## Kernel loading failed ...\n");
 		goto error;
+	}
 
+	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+			0, images->rd_start,
+			images->rd_end - images->rd_start)) {
+		printf("## Setting up boot parameters failed ...\n");
+		goto error;
 	}
 
 #ifdef DEBUG
arch/x86/lib/zimage.c +103 -80

262 lines not on this page · raw message

Signature · 1 line
1.7.3.1
#25 lore raw

PATCH v3 5/6 x86: Refactor the zboot innards so they can be reused with a vboot image

Hi Gabe,

Quoted 12 lines · Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning, and because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line goes before the zeropage table in vboot which is somewhat incompatible with the normal protocol, where to put the command line is a now a parameter instead of being hard coded.

Quoted 6 lines
---
 arch/x86/include/asm/zimage.h |    8 +-
 arch/x86/lib/bootm.c          |   21 +++--
 arch/x86/lib/zimage.c         |  183 +++++++++++++++++++++++------------------
 3 files changed, 122 insertions(+), 90 deletions(-)

Applied to u-boot-x86/next

Regards,

Graeme

author
#26 lore raw

PATCH v3 6/6 x86: Add support for specifying an initrd with the zboot command

In reply to Gabe Black

This change finishes plumbing the initrd support built into the zboot mechanism out to the command interface.

It also fixes a bug in the command declaration where the kernel size could be passed as an optional second parameter but not enough arguments were allowed.

---
Changes in v2:
- Add a help message to the zboot command.

 arch/x86/lib/zimage.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)
arch/x86/lib/zimage.c +19 -4
index 0cbb571..bb40517 100644
@@ -321,6 +321,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	void *load_address;
 	char *s;
 	ulong bzImage_size = 0;
+	ulong initrd_addr = 0;
+	ulong initrd_size = 0;
 
 	disable_interrupts();
 
@@ -337,9 +339,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	if (s)
 		bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
 
-	if (argc >= 3)
+	if (argc >= 3) {
 		/* argv[2] holds the size of the bzImage */
 		bzImage_size = simple_strtoul(argv[2], NULL, 16);
+	}
+
+	if (argc >= 4)
+		initrd_addr = simple_strtoul(argv[3], NULL, 16);
+	if (argc >= 5)
+		initrd_size = simple_strtoul(argv[4], NULL, 16);
 
 	/* Lets look for */
 	base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
@@ -349,7 +357,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		return -1;
 	}
 	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
-			0, 0, 0)) {
+			0, initrd_addr, initrd_size)) {
 		printf("Setting up boot parameters failed ...\n");
 		return -1;
 	}
@@ -366,7 +374,14 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 }
 
 U_BOOT_CMD(
-	zboot, 2, 0,	do_zboot,
+	zboot, 5, 0,	do_zboot,
 	"Boot bzImage",
-	""
+	"[addr] [size] [initrd addr] [initrd size]\n"
+	"      addr -        The optional starting address of the bzimage.\n"
+	"                    If not set it defaults to the environment\n"
+	"                    variable \"fileaddr\".\n"
+	"      size -        The optional size of the bzimage. Defaults to\n"
+	"                    zero.\n"
+	"      initrd addr - The address of the initrd image to use, if any.\n"
+	"      initrd size - The size of the initrd image to use, if any.\n"
 );
Signature · 1 line
1.7.3.1
#27 lore raw

PATCH v3 6/6 x86: Add support for specifying an initrd with the zboot command

Hi Gabe,

Quoted 7 lines · Gabe Black

This change finishes plumbing the initrd support built into the zboot mechanism out to the command interface.

It also fixes a bug in the command declaration where the kernel size could be passed as an optional second parameter but not enough arguments were allowed.

Quoted 7 lines

---
Changes in v2:
- Add a help message to the zboot command.

 arch/x86/lib/zimage.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)

Applied to u-boot-x86/next

Regards,

Graeme

author
#28 lore raw

PATCH v2 1/6 x86: Import code from coreboot's libpayload to parse the coreboot table

In reply to Gabe Black

This change also forces the lib_sysinfo structure to be in the .data section. Otherwise it ends up in the .bss section. U-boot assumes that it doesn't need to copy it over during relocation, and instead fills that whole section with zeroes. If we really were booting from ROM that would be appropriate, but we need some information from the coreboot tables (memory size) before then and have to fill that structure before relocation. We skirt u-boot's assumption by putting this in .data where it assumes there is still read only but non-zero data.

---
Changes in v2:
- Move arch/x86/include/asm/ic/coreboot/* to
arch/x86/include/asm/arch-coreboot/*
- Merge the lib_sysinfo change into this one.

 arch/x86/cpu/coreboot/Makefile                  |    3 +
 arch/x86/cpu/coreboot/ipchecksum.c              |   54 +++++
 arch/x86/cpu/coreboot/sysinfo.c                 |   39 ++++
 arch/x86/cpu/coreboot/tables.c                  |  183 +++++++++++++++++
 arch/x86/include/asm/arch-coreboot/ipchecksum.h |   37 ++++
 arch/x86/include/asm/arch-coreboot/sysinfo.h    |   64 ++++++
 arch/x86/include/asm/arch-coreboot/tables.h     |  241 +++++++++++++++++++++++
 board/chromebook-x86/coreboot/coreboot.c        |   10 +
 8 files changed, 631 insertions(+), 0 deletions(-)
 create mode 100644 arch/x86/cpu/coreboot/ipchecksum.c
 create mode 100644 arch/x86/cpu/coreboot/sysinfo.c
 create mode 100644 arch/x86/cpu/coreboot/tables.c
 create mode 100644 arch/x86/include/asm/arch-coreboot/ipchecksum.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/sysinfo.h
 create mode 100644 arch/x86/include/asm/arch-coreboot/tables.h
arch/x86/cpu/coreboot/Makefile +3 -0
index 0444399..13f5f8a 100644
@@ -33,7 +33,10 @@ include $(TOPDIR)/config.mk
 
 LIB	:= $(obj)lib$(SOC).o
 
+COBJS-$(CONFIG_SYS_COREBOOT) += tables.o
+COBJS-$(CONFIG_SYS_COREBOOT) += ipchecksum.o
 COBJS-$(CONFIG_SYS_COREBOOT) += sdram.o
+COBJS-$(CONFIG_SYS_COREBOOT) += sysinfo.o
 
 SOBJS-$(CONFIG_SYS_COREBOOT) += coreboot_car.o
 
arch/x86/cpu/coreboot/ipchecksum.c new file +54 -0

54 lines not on this page · raw message

arch/x86/cpu/coreboot/sysinfo.c new file +39 -0
new file mode 100644
index 0000000..9b3e660
@@ -0,0 +1,39 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ * Copyright (C) 2009 coresystems GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <asm/arch-coreboot/sysinfo.h>
+
+/*
+ * This needs to be in the .data section so that it's copied over during
+ * relocation. By default it's put in the .bss section which is simply filled
+ * with zeroes when transitioning from "ROM", which is really RAM, to other
+ * RAM.
+ */
+struct sysinfo_t lib_sysinfo __attribute__((section(".data")));
arch/x86/cpu/coreboot/tables.c new file +183 -0

183 lines not on this page · raw message

arch/x86/include/asm/arch-coreboot/ipchecksum.h new file +37 -0
new file mode 100644
index 0000000..1d73b4d
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * It has originally been taken from the FreeBSD project.
+ *
+ * Copyright (c) 2001 Charles Mott <[email protected]>
+ * Copyright (c) 2008 coresystems GmbH
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _COREBOOT_IPCHECKSUM_H
+#define _COREBOOT_IPCHECKSUM_H
+
+unsigned short ipchksum(const void *vptr, unsigned long nbytes);
+
+#endif
arch/x86/include/asm/arch-coreboot/sysinfo.h new file +64 -0

64 lines not on this page · raw message

arch/x86/include/asm/arch-coreboot/tables.h new file +241 -0

241 lines not on this page · raw message

board/chromebook-x86/coreboot/coreboot.c +10 -0
index 44c6f15..22a643c 100644
@@ -26,6 +26,8 @@
 #include <asm/u-boot-x86.h>
 #include <flash.h>
 #include <netdev.h>
+#include <asm/arch-coreboot/tables.h>
+#include <asm/arch-coreboot/sysinfo.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -34,6 +36,14 @@ unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN;
 /*
  * Miscellaneous platform dependent initializations
  */
+int cpu_init_f(void)
+{
+	int ret = get_coreboot_info(&lib_sysinfo);
+	if (ret != 0)
+		printf("Failed to parse coreboot tables.\n");
+	return ret;
+}
+
 int board_early_init_f(void)
 {
 	return 0;
Signature · 1 line
1.7.3.1
author
#29 lore raw

PATCH v2 2/6 x86: Clean up the x86 zimage code in preparation to extend it

In reply to Gabe Black

This change cleans up some formatting issues in the zimage handling code, and converts it from using offsets added to a base pointer to using the available structure definitions which were already being included.

---
Changes in v2:
- Changed includes to match ic/coreboot => arch-coreboot move.
- Merged a previous change that used the coreboot tables to approximate total RAM size into this one.

 arch/x86/include/asm/zimage.h |   21 ----------
 arch/x86/lib/zimage.c         |   82 ++++++++++++++++++++++------------------
 2 files changed, 45 insertions(+), 58 deletions(-)
arch/x86/include/asm/zimage.h +0 -21
index a02637f..1a77e00 100644
@@ -27,27 +27,6 @@
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 
-#define CMD_LINE_MAGIC_OFF  0x020 /* Magic 0xa33f if the offset below is valid */
-#define CMD_LINE_OFFSET_OFF 0x022 /* Offset to comandline */
-#define SETUP_SECTS_OFF     0x1F1 /* The size of the setup in sectors */
-#define ROOT_FLAGS_OFF      0x1F2 /* If set, the root is mounted readonly */
-#define VID_MODE_OFF        0x1FA /* Video mode control */
-#define ROOT_DEV_OFF        0x1FC /* Default root device number */
-#define BOOT_FLAG_OFF       0x1FE /* 0xAA55 magic number */
-#define HEADER_OFF          0x202 /* Magic signature "HdrS" */
-#define VERSION_OFF         0x206 /* Boot protocol version supported */
-#define REALMODE_SWTCH_OFF  0x208 /* Boot loader hook (see below) */
-#define START_SYS_OFF       0x20C /* Points to kernel version string */
-#define TYPE_OF_LOADER_OFF  0x210 /* Boot loader identifier */
-#define LOADFLAGS_OFF       0x211 /* Boot protocol option flags */
-#define SETUP_MOVE_SIZE_OFF 0x212 /* Move to high memory size (used with hooks) */
-#define CODE32_START_OFF    0x214 /* Boot loader hook (see below) */
-#define RAMDISK_IMAGE_OFF   0x218 /* initrd load address (set by boot loader) */
-#define RAMDISK_SIZE_OFF    0x21C /* initrd size (set by boot loader) */
-#define HEAP_END_PTR_OFF    0x224 /* Free memory after setup end */
-#define CMD_LINE_PTR_OFF    0x228 /* 32-bit pointer to the kernel command line */
-
-
 #define HEAP_FLAG           0x80
 #define BIG_KERNEL_FLAG     0x01
 
arch/x86/lib/zimage.c +45 -37

182 lines not on this page · raw message

Signature · 1 line
1.7.3.1
author
#30 lore raw

PATCH v2 3/6 x86: Add support for booting Linux using the 32 bit boot protocol

In reply to Gabe Black

This change conditionally modifies the zboot command so that it can use the 32 bit boot protocol. This is necessary because the 16 bit realmode entry point assumes that it can call BIOS services which neither coreboot nor u-boot provide.

---
Changes in v2:
- Moved the coreboot specific e820 function into a different patch.

 arch/x86/include/asm/zimage.h |    4 +-
 arch/x86/lib/bootm.c          |    6 ++-
 arch/x86/lib/zimage.c         |   64 ++++++++++++++++++++++++++++++++--------
 3 files changed, 57 insertions(+), 17 deletions(-)
arch/x86/include/asm/zimage.h +2 -2
index 1a77e00..8ee6a74 100644
@@ -46,8 +46,8 @@
 
 void *load_zimage(char *image, unsigned long kernel_size,
 		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot);
+		  int auto_boot, void **load_address);
 
-void boot_zimage(void *setup_base);
+void boot_zimage(void *setup_base, void *load_address);
 
 #endif
arch/x86/lib/bootm.c +4 -2
index bac7b4f..ba3875b 100644
@@ -38,6 +38,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	void		*base_ptr = NULL;
 	ulong		os_data, os_len;
 	image_header_t	*hdr;
+	void		*load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,7 +76,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 
 #ifdef CONFIG_CMD_ZBOOT
 	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start, 0);
+			images->rd_start, images->rd_end - images->rd_start,
+			0, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
@@ -92,7 +94,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	/* we assume that the kernel is in place */
 	printf("\nStarting kernel ...\n\n");
 
-	boot_zimage(base_ptr);
+	boot_zimage(base_ptr, load_address);
 	/* does not return */
 
 error:
arch/x86/lib/zimage.c +51 -13

136 lines not on this page · raw message

Signature · 1 line
1.7.3.1
author
#31 lore raw

PATCH v2 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

In reply to Gabe Black

Also approximate the size of RAM using the largest RAM address available in the tables. There may be areas which are marked as reserved which are actually at the end of RAM.

---
Changes in v2:
- Moved the coreboot specfic e820 function into this patch.

 arch/x86/cpu/coreboot/sdram.c |   38 +++++++++++++++++++++++++++++++++++++-
 arch/x86/include/asm/zimage.h |    5 +++++
 2 files changed, 42 insertions(+), 1 deletions(-)
arch/x86/cpu/coreboot/sdram.c +37 -1
index b56085a..f8fdac6 100644
@@ -23,13 +23,49 @@
  */
 
 #include <common.h>
+#include <malloc.h>
+#include <asm/e820.h>
 #include <asm/u-boot-x86.h>
+#include <asm/global_data.h>
+#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch-coreboot/tables.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+{
+	int i;
+
+	unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries);
+	if (num_entries < lib_sysinfo.n_memranges) {
+		printf("Warning: Limiting e820 map to %d entries.\n",
+			num_entries);
+	}
+	for (i = 0; i < num_entries; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+
+		entries[i].addr = memrange->base;
+		entries[i].size = memrange->size;
+		entries[i].type = memrange->type;
+	}
+	return num_entries;
+}
+
 int dram_init_f(void)
 {
-	gd->ram_size = 64*1024*1024;
+	int i;
+	phys_size_t ram_size = 0;
+
+	for (i = 0; i < lib_sysinfo.n_memranges; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+		unsigned long long end = memrange->base + memrange->size;
+
+		if (memrange->type == CB_MEM_RAM && end > ram_size)
+			ram_size = end;
+	}
+	gd->ram_size = ram_size;
+	if (ram_size == 0)
+		return -1;
 	return 0;
 }
 
arch/x86/include/asm/zimage.h +5 -0
index 8ee6a74..3a68bb0 100644
@@ -24,6 +24,8 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/e820.h>
+
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 
@@ -44,6 +46,9 @@
 #define BZIMAGE_LOAD_ADDR  0x100000
 #define ZIMAGE_LOAD_ADDR   0x10000
 
+/* Implementation defined function to install an e820 map. */
+unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+
 void *load_zimage(char *image, unsigned long kernel_size,
 		  unsigned long initrd_addr, unsigned long initrd_size,
 		  int auto_boot, void **load_address);
Signature · 1 line
1.7.3.1
#32 lore raw

PATCH v2 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

Hi Gabe,

Last nit, I promise, and then I'll apply it all to u-boot-x86/next

arch/x86/include/asm/zimage.h

Quoted 72 lines · Gabe Black

Also approximate the size of RAM using the largest RAM address available in the tables. There may be areas which are marked as reserved which are actually at the end of RAM.

---
Changes in v2:
- Moved the coreboot specfic e820 function into this patch.

 arch/x86/cpu/coreboot/sdram.c |   38 +++++++++++++++++++++++++++++++++++++-
 arch/x86/include/asm/zimage.h |    5 +++++
 2 files changed, 42 insertions(+), 1 deletions(-)
arch/x86/cpu/coreboot/sdram.c +37 -1
index b56085a..f8fdac6 100644
@@ -23,13 +23,49 @@
  */
 
 #include <common.h>
+#include <malloc.h>
+#include <asm/e820.h>
 #include <asm/u-boot-x86.h>
+#include <asm/global_data.h>
+#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch-coreboot/tables.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+{
+	int i;
+
+	unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries);
+	if (num_entries < lib_sysinfo.n_memranges) {
+		printf("Warning: Limiting e820 map to %d entries.\n",
+			num_entries);
+	}
+	for (i = 0; i < num_entries; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+
+		entries[i].addr = memrange->base;
+		entries[i].size = memrange->size;
+		entries[i].type = memrange->type;
+	}
+	return num_entries;
+}
+
 int dram_init_f(void)
 {
-	gd->ram_size = 64*1024*1024;
+	int i;
+	phys_size_t ram_size = 0;
+
+	for (i = 0; i < lib_sysinfo.n_memranges; i++) {
+		struct memrange *memrange = &lib_sysinfo.memrange[i];
+		unsigned long long end = memrange->base + memrange->size;
+
+		if (memrange->type == CB_MEM_RAM && end > ram_size)
+			ram_size = end;
+	}
+	gd->ram_size = ram_size;
+	if (ram_size == 0)
+		return -1;
 	return 0;
 }
 
arch/x86/include/asm/zimage.h +0 -0
index 8ee6a74..3a68bb0 100644

The zimage.h changes belong in patch 3

Quoted 10 lines
arch/x86/include/asm/zimage.h +2 -0
@@ -24,6 +24,8 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/e820.h>
+
 /* linux i386 zImage/bzImage header. Offsets relative to
  * the start of the image */
 

arch/x86/include/asm/zimage.h line 51

Quoted 6 lines
arch/x86/include/asm/zimage.h +3 -0
@@ -44,6 +46,9 @@
 #define BZIMAGE_LOAD_ADDR  0x100000
 #define ZIMAGE_LOAD_ADDR   0x10000
 
+/* Implementation defined function to install an e820 map. */
+unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+

Should be u8 as boot_params.e820_entries is u8 (__u8 really, but we don't use the kernel data types)

arch/x86/include/asm/zimage.h line 54

Quoted 3 lines
arch/x86/include/asm/zimage.h +0 -0
 void *load_zimage(char *image, unsigned long kernel_size,
 		  unsigned long initrd_addr, unsigned long initrd_size,
 		  int auto_boot, void **load_address);

Regards,

Graeme

#33 lore raw

PATCH v2 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

Quoted 12 lines · Graeme Russ

Hi Gabe,

Last nit, I promise, and then I'll apply it all to u-boot-x86/next

arch/x86/include/asm/zimage.h line 51

Quoted 4 lines
arch/x86/include/asm/zimage.h +3 -0
+/* Implementation defined function to install an e820 map. */
+unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+

Should be u8 as boot_params.e820_entries is u8 (__u8 really, but we don't use the kernel data types)

I don't think this is a good idea. The value here isn't consumed by the boot_params structure, it's taken from the size of the e820 array there and consumed by whatever function is written to copy over e820 entries. That function doesn't really care about the boot_params structure at all. It could be used to fill in entries for, say, some future boot protocol, debugging where you want to see all entries beyond the first 256 (a lot, but EFI tends to have a lot), or maybe I want to boot some other OS that doesn't use a u8 to determine the size of the e820 table. There isn't any danger of the size being mismatched because it's called with the size of the array being filled, and the boot_params structure is smart enough to use a data type that's sized appropriately for the array.

Gabe

#34 lore raw

PATCH v2 4/6 x86: Add infrastructure to extract an e820 table from the coreboot tables

Hi Gabe,

Quoted 16 lines · Gabe Black
Quoted 12 lines · Graeme Russ

Hi Gabe,

Last nit, I promise, and then I'll apply it all to u-boot-x86/next

arch/x86/include/asm/zimage.h line 51

Quoted 4 lines
arch/x86/include/asm/zimage.h +3 -0
+/* Implementation defined function to install an e820 map. */
+unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+

Should be u8 as boot_params.e820_entries is u8 (__u8 really, but we don't use the kernel data types)

Quoted 11 lines

I don't think this is a good idea. The value here isn't consumed by the boot_params structure, it's taken from the size of the e820 array there and consumed by whatever function is written to copy over e820 entries. That function doesn't really care about the boot_params structure at all. It could be used to fill in entries for, say, some future boot protocol, debugging where you want to see all entries beyond the first 256 (a lot, but EFI tends to have a lot), or maybe I want to boot some other OS that doesn't use a u8 to determine the size of the e820 table. There isn't any danger of the size being mismatched because it's called with the size of the array being filled, and the boot_params structure is smart enough to use a data type that's sized appropriately for the array.

Good point - I'm happy for you to leave as is

I must say, I am somewhat suprised that the memory map would ever need to be split into so many pieces...

Regards,

Graeme

author
#35 lore raw

PATCH v2 5/6 x86: Refactor the zboot innards so they can be reused with a vboot image

In reply to Gabe Black

If vboot successfully verifies a kernel, it will leave it in place and basically ready to boot. The zeropage table which is part of the x86 boot protocol is at the end of the kernel, though, instead of the beginning, and because the image is already in place there's no need to copy it around. This change refactors the code which implements the zboot command so that the configuration of the zeropage table and loading the pieces of the kernel into memory are done separately. Also, because the command line goes before the zeropage table in vboot which is somewhat incompatible with the normal protocol, where to put the command line is a now a parameter instead of being hard coded.

---
 arch/x86/include/asm/zimage.h |    8 +-
 arch/x86/lib/bootm.c          |   21 +++--
 arch/x86/lib/zimage.c         |  183 +++++++++++++++++++++++------------------
 3 files changed, 122 insertions(+), 90 deletions(-)
arch/x86/include/asm/zimage.h +5 -3
index 3a68bb0..f03ea80 100644
@@ -24,6 +24,7 @@
 #ifndef _ASM_ZIMAGE_H_
 #define _ASM_ZIMAGE_H_
 
+#include <asm/bootparam.h>
 #include <asm/e820.h>
 
 /* linux i386 zImage/bzImage header. Offsets relative to
@@ -49,9 +50,10 @@
 /* Implementation defined function to install an e820 map. */
 unsigned install_e820_map(unsigned max_entries, struct e820entry *);
 
-void *load_zimage(char *image, unsigned long kernel_size,
-		  unsigned long initrd_addr, unsigned long initrd_size,
-		  int auto_boot, void **load_address);
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+				void **load_address);
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+		 unsigned long initrd_addr, unsigned long initrd_size);
 
 void boot_zimage(void *setup_base, void *load_address);
 
arch/x86/lib/bootm.c +14 -7
index ba3875b..83caf6b 100644
@@ -28,17 +28,20 @@
 #include <command.h>
 #include <image.h>
 #include <u-boot/zlib.h>
+#include <asm/bootparam.h>
 #include <asm/byteorder.h>
 #include <asm/zimage.h>
 
+#define COMMAND_LINE_OFFSET 0x9000
+
 /*cmd_boot.c*/
 int do_bootm_linux(int flag, int argc, char * const argv[],
 		bootm_headers_t *images)
 {
-	void		*base_ptr = NULL;
-	ulong		os_data, os_len;
-	image_header_t	*hdr;
-	void		*load_address;
+	struct boot_params *base_ptr = NULL;
+	ulong os_data, os_len;
+	image_header_t *hdr;
+	void *load_address;
 
 #if defined(CONFIG_FIT)
 	const void	*data;
@@ -75,15 +78,19 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 	}
 
 #ifdef CONFIG_CMD_ZBOOT
-	base_ptr = load_zimage((void *)os_data, os_len,
-			images->rd_start, images->rd_end - images->rd_start,
-			0, &load_address);
+	base_ptr = load_zimage((void *)os_data, os_len, &load_address);
 #endif
 
 	if (NULL == base_ptr) {
 		printf("## Kernel loading failed ...\n");
 		goto error;
+	}
 
+	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+			0, images->rd_start,
+			images->rd_end - images->rd_start)) {
+		printf("## Setting up boot parameters failed ...\n");
+		goto error;
 	}
 
 #ifdef DEBUG
arch/x86/lib/zimage.c +103 -80

262 lines not on this page · raw message

Signature · 1 line
1.7.3.1
author
#36 lore raw

PATCH v2 6/6 x86: Add support for specifying an initrd with the zboot command

In reply to Gabe Black

This change finishes plumbing the initrd support built into the zboot mechanism out to the command interface.

It also fixes a bug in the command declaration where the kernel size could be passed as an optional second parameter but not enough arguments were allowed.

---
Changes in v2:
- Add a help message to the zboot command.

 arch/x86/lib/zimage.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)
arch/x86/lib/zimage.c +19 -4
index 0cbb571..bb40517 100644
@@ -321,6 +321,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	void *load_address;
 	char *s;
 	ulong bzImage_size = 0;
+	ulong initrd_addr = 0;
+	ulong initrd_size = 0;
 
 	disable_interrupts();
 
@@ -337,9 +339,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	if (s)
 		bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
 
-	if (argc >= 3)
+	if (argc >= 3) {
 		/* argv[2] holds the size of the bzImage */
 		bzImage_size = simple_strtoul(argv[2], NULL, 16);
+	}
+
+	if (argc >= 4)
+		initrd_addr = simple_strtoul(argv[3], NULL, 16);
+	if (argc >= 5)
+		initrd_size = simple_strtoul(argv[4], NULL, 16);
 
 	/* Lets look for */
 	base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
@@ -349,7 +357,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		return -1;
 	}
 	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
-			0, 0, 0)) {
+			0, initrd_addr, initrd_size)) {
 		printf("Setting up boot parameters failed ...\n");
 		return -1;
 	}
@@ -366,7 +374,14 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 }
 
 U_BOOT_CMD(
-	zboot, 2, 0,	do_zboot,
+	zboot, 5, 0,	do_zboot,
 	"Boot bzImage",
-	""
+	"[addr] [size] [initrd addr] [initrd size]\n"
+	"      addr -        The optional starting address of the bzimage.\n"
+	"                    If not set it defaults to the environment\n"
+	"                    variable \"fileaddr\".\n"
+	"      size -        The optional size of the bzimage. Defaults to\n"
+	"                    zero.\n"
+	"      initrd addr - The address of the initrd image to use, if any.\n"
+	"      initrd size - The size of the initrd image to use, if any.\n"
 );
Signature · 1 line
1.7.3.1