* [U-Boot] [PATCH 1/4] x86: Clean up the x86 zimage code in preparation to extend it
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
@ 2011-11-30 9:17 ` Gabe Black
2011-11-30 9:17 ` [U-Boot] [PATCH 2/4] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
` (11 subsequent siblings)
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-11-30 9:17 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
arch/x86/include/asm/zimage.h | 21 ----------
arch/x86/lib/zimage.c | 82 ++++++++++++++++++++++------------------
2 files changed, 45 insertions(+), 58 deletions(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index b172048..a7adfbf 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 74a10bc..8995c58 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2011 The Chromium OS Authors.
* (C) Copyright 2002
* Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
*
@@ -92,21 +93,22 @@ void *load_zimage(char *image, unsigned long kernel_size,
unsigned long initrd_addr, unsigned long initrd_size,
int auto_boot)
{
- void *setup_base;
+ struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
void *load_address;
- struct setup_header *hdr;
- hdr = (struct setup_header *)(image + SETUP_SECTS_OFF);
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
/* base address for real-mode segment */
- setup_base = (void *)DEFAULT_SETUP_BASE;
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
if (KERNEL_MAGIC != hdr->boot_flag) {
- printf("Error: Invalid Boot Flag (found 0x%04x, expected 0x%04x)\n",
- hdr->boot_flag, KERNEL_MAGIC);
+ printf("Error: Invalid Boot Flag "
+ "(found 0x%04x, expected 0x%04x)\n",
+ hdr->boot_flag, KERNEL_MAGIC);
return 0;
} else {
printf("Valid Boot Flag\n");
@@ -141,9 +143,10 @@ void *load_zimage(char *image, unsigned long kernel_size,
(hdr->loadflags & BIG_KERNEL_FLAG);
/* Determine load address */
- load_address = (void *)(big_image ?
- BZIMAGE_LOAD_ADDR :
- ZIMAGE_LOAD_ADDR);
+ if (big_image)
+ load_address = (void *)BZIMAGE_LOAD_ADDR;
+ else
+ load_address = (void *)ZIMAGE_LOAD_ADDR;
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -154,8 +157,8 @@ void *load_zimage(char *image, unsigned long kernel_size,
(bootproto & 0xff00) >> 8, bootproto & 0xff);
if (bootproto == 0x0100) {
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
/*
* A very old kernel MUST have its real-mode code
@@ -167,33 +170,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Copy the command line */
memmove((void *)0x99000,
- setup_base + COMMAND_LINE_OFFSET,
+ (u8 *)setup_base + COMMAND_LINE_OFFSET,
COMMAND_LINE_SIZE);
/* Relocated */
- setup_base = (void *)0x90000;
+ setup_base = (struct boot_params *)0x90000;
}
/* It is recommended to clear memory up to the 32K mark */
- memset((void *)0x90000 + setup_size, 0,
- SETUP_MAX_SIZE-setup_size);
+ memset((u8 *)0x90000 + setup_size, 0,
+ SETUP_MAX_SIZE - setup_size);
}
/* We are now setting up the real-mode version of the header */
- hdr = (struct setup_header *)(setup_base + SETUP_SECTS_OFF);
+ hdr = &setup_base->hdr;
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15)
+ if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)(setup_base +
- (hdr->kernel_version + 0x200)));
- else
- printf("Setup Sectors < 15 - Cannot print kernel version.\n");
+ (char *)setup_base +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
if (initrd_addr) {
- printf("Initial RAM disk at linear address 0x%08lx, size %ld bytes\n",
+ printf("Initial RAM disk@linear address "
+ "0x%08lx, size %ld bytes\n",
initrd_addr, initrd_size);
hdr->ramdisk_image = initrd_addr;
@@ -207,11 +213,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr = (u32)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr =
+ (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
} else if (bootproto >= 0x0200) {
-
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
hdr->setup_move_size = 0x9100;
}
@@ -224,11 +230,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (big_image) {
if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
return 0;
}
-
} else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
kernel_size, ZIMAGE_MAX_SIZE);
@@ -236,7 +242,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line(setup_base + COMMAND_LINE_OFFSET, auto_boot);
+ build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
big_image ? 'b' : ' ', (u32)load_address, kernel_size);
@@ -258,8 +264,8 @@ void boot_zimage(void *setup_base)
regs.xss = regs.xds;
regs.esp = 0x9000;
regs.eflags = 0;
- enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, ®s,
- ®s);
+ enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
+ ®s, ®s);
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
@@ -274,11 +280,12 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* Setup board for maximum PC/AT Compatibility */
setup_pcat_compatibility();
- if (argc >= 2)
+ if (argc >= 2) {
/* argv[1] holds the address of the bzImage */
s = argv[1];
- else
+ } else {
s = getenv("fileaddr");
+ }
if (s)
bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
@@ -287,14 +294,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* argv[2] holds the size of the bzImage */
bzImage_size = simple_strtoul(argv[2], NULL, 16);
- /* Lets look for*/
+ /* Lets look for */
base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
} else {
- printf("## Transferring control to Linux (at address %08x) ...\n",
- (u32)base_ptr);
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
/* we assume that the kernel is in place */
printf("\nStarting kernel ...\n\n");
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 2/4] x86: Add support for booting Linux using the 32 bit boot protocol
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
2011-11-30 9:17 ` [U-Boot] [PATCH 1/4] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
@ 2011-11-30 9:17 ` Gabe Black
2011-11-30 9:17 ` [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
` (10 subsequent siblings)
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-11-30 9:17 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index a7adfbf..3a68bb0 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index bac7b4f..ba3875b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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:
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 8995c58..b5597ec 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -91,13 +91,12 @@ static void build_command_line(char *command_line, int auto_boot)
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)
{
struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
- void *load_address;
struct boot_params *params = (struct boot_params *)image;
struct setup_header *hdr = ¶ms->hdr;
@@ -144,14 +143,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Determine load address */
if (big_image)
- load_address = (void *)BZIMAGE_LOAD_ADDR;
+ *load_address = (void *)BZIMAGE_LOAD_ADDR;
else
- load_address = (void *)ZIMAGE_LOAD_ADDR;
+ *load_address = (void *)ZIMAGE_LOAD_ADDR;
+
+#if defined CONFIG_ZBOOT_32
+ printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
+ memset(setup_base, 0, sizeof(*setup_base));
+ setup_base->hdr = params->hdr;
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
(ulong)setup_base, setup_size);
memmove(setup_base, image, setup_size);
+#endif
printf("Using boot protocol version %x.%02x\n",
(bootproto & 0xff00) >> 8, bootproto & 0xff);
@@ -190,7 +198,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)setup_base +
+ (char *)params +
hdr->kernel_version + 0x200);
} else {
printf("Setup Sectors < 15 - "
@@ -245,17 +253,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage@address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)load_address, kernel_size);
-
+ big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
- memmove(load_address, image + setup_size, kernel_size);
+ memmove(*load_address, image + setup_size, kernel_size);
/* ready for booting */
return setup_base;
}
-void boot_zimage(void *setup_base)
+void boot_zimage(void *setup_base, void *load_address)
{
+ printf("\nStarting kernel ...\n\n");
+
+#if defined CONFIG_ZBOOT_32
+ /*
+ * Set %ebx, %ebp, and %edi to 0, %esi to point to the boot_params
+ * structure, and then jump to the kernel. We assume that %cs is
+ * 0x10, 4GB flat, and read/execute, and the data segments are 0x18,
+ * 4GB flat, and read/write. U-boot is setting them up that way for
+ * itself in arch/i386/cpu/cpu.c.
+ */
+ __asm__ __volatile__ (
+ "movl $0, %%ebp \n"
+ "cli \n"
+ "jmp %[kernel_entry] \n"
+ :: [kernel_entry]"a"(load_address),
+ [boot_params] "S"(setup_base),
+ "b"(0), "D"(0)
+ : "%ebp"
+ );
+#else
struct pt_regs regs;
memset(®s, 0, sizeof(struct pt_regs));
@@ -266,12 +293,14 @@ void boot_zimage(void *setup_base)
regs.eflags = 0;
enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
®s, ®s);
+#endif
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
void *base_ptr;
void *bzImage_addr = NULL;
+ void *load_address;
char *s;
ulong bzImage_size = 0;
@@ -295,7 +324,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
+ &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
@@ -305,9 +335,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
(u32)base_ptr);
/* 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 */
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
2011-11-30 9:17 ` [U-Boot] [PATCH 1/4] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
2011-11-30 9:17 ` [U-Boot] [PATCH 2/4] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
@ 2011-11-30 9:17 ` Gabe Black
2011-12-02 21:43 ` Graeme Russ
2011-11-30 9:17 ` [U-Boot] [PATCH 4/4] x86: Add support for specifying an initrd with the zboot command Gabe Black
` (9 subsequent siblings)
12 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-11-30 9:17 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 3a68bb0..f03ea80 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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);
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index ba3875b..83caf6b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index b5597ec..0cbb571 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -89,21 +89,8 @@ static void build_command_line(char *command_line, int auto_boot)
printf("Kernel command line: \"%s\"\n", command_line);
}
-void *load_zimage(char *image, unsigned long kernel_size,
- unsigned long initrd_addr, unsigned long initrd_size,
- int auto_boot, void **load_address)
+static int kernel_magic_ok(struct setup_header *hdr)
{
- struct boot_params *setup_base;
- int setup_size;
- int bootproto;
- int big_image;
-
- struct boot_params *params = (struct boot_params *)image;
- struct setup_header *hdr = ¶ms->hdr;
-
- /* base address for real-mode segment */
- setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
-
if (KERNEL_MAGIC != hdr->boot_flag) {
printf("Error: Invalid Boot Flag "
"(found 0x%04x, expected 0x%04x)\n",
@@ -111,18 +98,38 @@ void *load_zimage(char *image, unsigned long kernel_size,
return 0;
} else {
printf("Valid Boot Flag\n");
+ return 1;
}
+}
- /* determine boot protocol version */
- if (KERNEL_V2_MAGIC == hdr->header) {
+static int get_boot_protocol(struct setup_header *hdr)
+{
+ if (hdr->header == KERNEL_V2_MAGIC) {
printf("Magic signature found\n");
-
- bootproto = hdr->version;
+ return hdr->version;
} else {
/* Very old kernel */
printf("Magic signature not found\n");
- bootproto = 0x0100;
+ return 0x0100;
}
+}
+
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+ void **load_address)
+{
+ struct boot_params *setup_base;
+ int setup_size;
+ int bootproto;
+ int big_image;
+
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
+
+ /* base address for real-mode segment */
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
+
+ if (!kernel_magic_ok(hdr))
+ return 0;
/* determine size of setup */
if (0 == hdr->setup_sects) {
@@ -137,6 +144,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (setup_size > SETUP_MAX_SIZE)
printf("Error: Setup is too large (%d bytes)\n", setup_size);
+ /* determine boot protocol version */
+ bootproto = get_boot_protocol(hdr);
+
+ printf("Using boot protocol version %x.%02x\n",
+ (bootproto & 0xff00) >> 8, bootproto & 0xff);
+
+ if (bootproto >= 0x0200) {
+ if (hdr->setup_sects >= 15) {
+ printf("Linux kernel version %s\n",
+ (char *)params +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
+ }
+
/* Determine image type */
big_image = (bootproto >= 0x0200) &&
(hdr->loadflags & BIG_KERNEL_FLAG);
@@ -151,9 +175,6 @@ void *load_zimage(char *image, unsigned long kernel_size,
printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
memset(setup_base, 0, sizeof(*setup_base));
setup_base->hdr = params->hdr;
-
- setup_base->e820_entries = install_e820_map(
- ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -161,13 +182,12 @@ void *load_zimage(char *image, unsigned long kernel_size,
memmove(setup_base, image, setup_size);
#endif
- printf("Using boot protocol version %x.%02x\n",
- (bootproto & 0xff00) >> 8, bootproto & 0xff);
+ if (bootproto >= 0x0204)
+ kernel_size = hdr->syssize * 16;
+ else
+ kernel_size -= setup_size;
if (bootproto == 0x0100) {
- setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
-
/*
* A very old kernel MUST have its real-mode code
* loaded at 0x90000
@@ -190,21 +210,45 @@ void *load_zimage(char *image, unsigned long kernel_size,
SETUP_MAX_SIZE - setup_size);
}
- /* We are now setting up the real-mode version of the header */
- hdr = &setup_base->hdr;
+ if (big_image) {
+ if (kernel_size > BZIMAGE_MAX_SIZE) {
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
+ return 0;
+ }
+ } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
+ printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
+ kernel_size, ZIMAGE_MAX_SIZE);
+ return 0;
+ }
+
+ printf("Loading %s at address %p (%ld bytes)\n",
+ big_image ? "bzImage" : "zImage", *load_address, kernel_size);
+
+ memmove(*load_address, image + setup_size, kernel_size);
+
+ return setup_base;
+}
+
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+ unsigned long initrd_addr, unsigned long initrd_size)
+{
+ struct setup_header *hdr = &setup_base->hdr;
+ int bootproto = get_boot_protocol(hdr);
+
+#if defined CONFIG_ZBOOT_32
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#endif
+ if (bootproto == 0x0100) {
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ }
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15) {
- printf("Linux kernel version %s\n",
- (char *)params +
- hdr->kernel_version + 0x200);
- } else {
- printf("Setup Sectors < 15 - "
- "Cannot print kernel version.\n");
- }
-
if (initrd_addr) {
printf("Initial RAM disk@linear address "
"0x%08lx, size %ld bytes\n",
@@ -221,44 +265,18 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr =
- (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr = (uintptr_t)cmd_line;
} else if (bootproto >= 0x0200) {
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_offset =
+ (uintptr_t)cmd_line - (uintptr_t)setup_base;
hdr->setup_move_size = 0x9100;
}
- if (bootproto >= 0x0204)
- kernel_size = hdr->syssize * 16;
- else
- kernel_size -= setup_size;
-
-
- if (big_image) {
- if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! "
- "(size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
- return 0;
- }
- } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
- printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, ZIMAGE_MAX_SIZE);
- return 0;
- }
-
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
-
- printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
-
- memmove(*load_address, image + setup_size, kernel_size);
-
- /* ready for booting */
- return setup_base;
+ build_command_line(cmd_line, auto_boot);
+ return 0;
}
void boot_zimage(void *setup_base, void *load_address)
@@ -298,7 +316,7 @@ void boot_zimage(void *setup_base, void *load_address)
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
- void *base_ptr;
+ struct boot_params *base_ptr;
void *bzImage_addr = NULL;
void *load_address;
char *s;
@@ -324,20 +342,25 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
- &load_address);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
- } else {
- printf("## Transferring control to Linux "
- "(at address %08x) ...\n",
- (u32)base_ptr);
-
- /* we assume that the kernel is in place */
- boot_zimage(base_ptr, load_address);
- /* does not return */
+ return -1;
}
+ if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+ 0, 0, 0)) {
+ printf("Setting up boot parameters failed ...\n");
+ return -1;
+ }
+
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
+
+ /* we assume that the kernel is in place */
+ boot_zimage(base_ptr, load_address);
+ /* does not return */
return -1;
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-11-30 9:17 ` [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
@ 2011-12-02 21:43 ` Graeme Russ
2011-12-02 21:47 ` Gabe Black
0 siblings, 1 reply; 37+ messages in thread
From: Graeme Russ @ 2011-12-02 21:43 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 30/11/11 20:17, Gabe Black wrote:
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-12-02 21:43 ` Graeme Russ
@ 2011-12-02 21:47 ` Gabe Black
0 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-02 21:47 UTC (permalink / raw)
To: u-boot
On Fri, Dec 2, 2011 at 1:43 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Gabe,
>
> On 30/11/11 20:17, Gabe Black wrote:
> > 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
>
Vboot is verified boot, a separate ChromeOS thing which is linked into
u-boot and calls into its functions.
Gabe
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH 4/4] x86: Add support for specifying an initrd with the zboot command
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (2 preceding siblings ...)
2011-11-30 9:17 ` [U-Boot] [PATCH 3/4] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
@ 2011-11-30 9:17 ` Gabe Black
2011-12-02 21:40 ` Graeme Russ
2011-11-30 9:28 ` [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 " Graeme Russ
` (8 subsequent siblings)
12 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-11-30 9:17 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
arch/x86/lib/zimage.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 0cbb571..ef34c23 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -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",
""
);
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 4/4] x86: Add support for specifying an initrd with the zboot command
2011-11-30 9:17 ` [U-Boot] [PATCH 4/4] x86: Add support for specifying an initrd with the zboot command Gabe Black
@ 2011-12-02 21:40 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-02 21:40 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 30/11/11 20:17, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> arch/x86/lib/zimage.c | 14 +++++++++++---
> 1 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
> index 0cbb571..ef34c23 100644
> --- a/arch/x86/lib/zimage.c
> +++ b/arch/x86/lib/zimage.c
> @@ -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);
> + }
No braces for single-line statements - the comment is unnecessary as the
code is obvious
> +
> + 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",
> ""
I think it is about time it got a help message :)
> );
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (3 preceding siblings ...)
2011-11-30 9:17 ` [U-Boot] [PATCH 4/4] x86: Add support for specifying an initrd with the zboot command Gabe Black
@ 2011-11-30 9:28 ` Graeme Russ
2011-11-30 22:04 ` Graeme Russ
2011-11-30 12:13 ` Graeme Russ
` (7 subsequent siblings)
12 siblings, 1 reply; 37+ messages in thread
From: Graeme Russ @ 2011-11-30 9:28 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 30/11/11 20:17, Gabe Black wrote:
> 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(-)
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
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.
2011-11-30 9:28 ` [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 " Graeme Russ
@ 2011-11-30 22:04 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-11-30 22:04 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On Wed, Nov 30, 2011 at 8:28 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Gabe,
>
> On 30/11/11 20:17, Gabe Black wrote:
>> 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(-)
>
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (4 preceding siblings ...)
2011-11-30 9:28 ` [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 " Graeme Russ
@ 2011-11-30 12:13 ` Graeme Russ
2011-11-30 17:46 ` Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
` (6 subsequent siblings)
12 siblings, 1 reply; 37+ messages in thread
From: Graeme Russ @ 2011-11-30 12:13 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 30/11/11 20:17, Gabe Black wrote:
> 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(-)
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
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.
2011-11-30 12:13 ` Graeme Russ
@ 2011-11-30 17:46 ` Gabe Black
2011-11-30 20:19 ` Graeme Russ
0 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-11-30 17:46 UTC (permalink / raw)
To: u-boot
On Wed, Nov 30, 2011 at 4:13 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Gabe,
>
> On 30/11/11 20:17, Gabe Black wrote:
> > 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(-)
>
> 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
>
>
>
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
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.
2011-11-30 17:46 ` Gabe Black
@ 2011-11-30 20:19 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-11-30 20:19 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On Thursday, December 1, 2011, Gabe Black <gabeblack@google.com> wrote:
>
>
> On Wed, Nov 30, 2011 at 4:13 AM, Graeme Russ <graeme.russ@gmail.com>
wrote:
>>
>> Hi Gabe,
>>
>> On 30/11/11 20:17, Gabe Black wrote:
>> > 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(-)
>>
>> 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
>>
>>
>
>
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing.
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (5 preceding siblings ...)
2011-11-30 12:13 ` Graeme Russ
@ 2011-12-03 11:18 ` Gabe Black
2011-12-05 22:09 ` [U-Boot] [PATCH v3 " Gabe Black
` (6 more replies)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table Gabe Black
` (5 subsequent siblings)
12 siblings, 7 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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
--
1.7.3.1
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 0/6] Add support for the 32 bit boot protocol and coreboot table parsing.
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-05 22:12 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table Gabe Black
` (5 subsequent siblings)
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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
--
1.7.3.1
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 0/6] Add support for the 32 bit boot protocol and coreboot table parsing.
2011-12-05 22:09 ` [U-Boot] [PATCH v3 " Gabe Black
@ 2011-12-05 22:12 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-05 22:12 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On Tue, Dec 6, 2011 at 9:09 AM, Gabe Black <gabeblack@chromium.org> wrote:
> 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
Thanks, I will apply these to u-boot-x86/next ASAP
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
2011-12-05 22:09 ` [U-Boot] [PATCH v3 " Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:35 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 2/6] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
` (4 subsequent siblings)
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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
diff --git a/arch/x86/cpu/coreboot/Makefile b/arch/x86/cpu/coreboot/Makefile
index 0444399..13f5f8a 100644
--- a/arch/x86/cpu/coreboot/Makefile
+++ b/arch/x86/cpu/coreboot/Makefile
@@ -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
diff --git a/arch/x86/cpu/coreboot/ipchecksum.c b/arch/x86/cpu/coreboot/ipchecksum.c
new file mode 100644
index 0000000..57733d8
--- /dev/null
+++ b/arch/x86/cpu/coreboot/ipchecksum.c
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * It has originally been taken from the FreeBSD project.
+ *
+ * Copyright (c) 2001 Charles Mott <cm@linktel.net>
+ * 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.
+ */
+
+#include <compiler.h>
+#include <asm/arch-coreboot/ipchecksum.h>
+
+unsigned short ipchksum(const void *vptr, unsigned long nbytes)
+{
+ int sum, oddbyte;
+ const unsigned short *ptr = vptr;
+
+ sum = 0;
+ while (nbytes > 1) {
+ sum += *ptr++;
+ nbytes -= 2;
+ }
+ if (nbytes == 1) {
+ oddbyte = 0;
+ ((u8 *)&oddbyte)[0] = *(u8 *) ptr;
+ ((u8 *)&oddbyte)[1] = 0;
+ sum += oddbyte;
+ }
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16);
+ return ~sum;
+}
diff --git a/arch/x86/cpu/coreboot/sysinfo.c b/arch/x86/cpu/coreboot/sysinfo.c
new file mode 100644
index 0000000..9b3e660
--- /dev/null
+++ b/arch/x86/cpu/coreboot/sysinfo.c
@@ -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")));
diff --git a/arch/x86/cpu/coreboot/tables.c b/arch/x86/cpu/coreboot/tables.c
new file mode 100644
index 0000000..0e3451b
--- /dev/null
+++ b/arch/x86/cpu/coreboot/tables.c
@@ -0,0 +1,183 @@
+/*
+ * 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/ipchecksum.h>
+#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch-coreboot/tables.h>
+
+/*
+ * Some of this is x86 specific, and the rest of it is generic. Right now,
+ * since we only support x86, we'll avoid trying to make lots of infrastructure
+ * we don't need. If in the future, we want to use coreboot on some other
+ * architecture, then take out the generic parsing code and move it elsewhere.
+ */
+
+/* === Parsing code === */
+/* This is the generic parsing code. */
+
+static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_memory *mem = (struct cb_memory *)ptr;
+ int count = MEM_RANGE_COUNT(mem);
+ int i;
+
+ if (count > SYSINFO_MAX_MEM_RANGES)
+ count = SYSINFO_MAX_MEM_RANGES;
+
+ info->n_memranges = 0;
+
+ for (i = 0; i < count; i++) {
+ struct cb_memory_range *range =
+ (struct cb_memory_range *)MEM_RANGE_PTR(mem, i);
+
+ info->memrange[info->n_memranges].base =
+ UNPACK_CB64(range->start);
+
+ info->memrange[info->n_memranges].size =
+ UNPACK_CB64(range->size);
+
+ info->memrange[info->n_memranges].type = range->type;
+
+ info->n_memranges++;
+ }
+}
+
+static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_serial *ser = (struct cb_serial *)ptr;
+ if (ser->type != CB_SERIAL_TYPE_IO_MAPPED)
+ return;
+ info->ser_ioport = ser->baseaddr;
+}
+
+static void cb_parse_optiontable(unsigned char *ptr, struct sysinfo_t *info)
+{
+ info->option_table = (struct cb_cmos_option_table *)ptr;
+}
+
+static void cb_parse_checksum(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_cmos_checksum *cmos_cksum = (struct cb_cmos_checksum *)ptr;
+ info->cmos_range_start = cmos_cksum->range_start;
+ info->cmos_range_end = cmos_cksum->range_end;
+ info->cmos_checksum_location = cmos_cksum->location;
+}
+
+static void cb_parse_framebuffer(unsigned char *ptr, struct sysinfo_t *info)
+{
+ info->framebuffer = (struct cb_framebuffer *)ptr;
+}
+
+static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
+{
+ struct cb_header *header;
+ unsigned char *ptr = (unsigned char *)addr;
+ int i;
+
+ for (i = 0; i < len; i += 16, ptr += 16) {
+ header = (struct cb_header *)ptr;
+ if (!strncmp((const char *)header->signature, "LBIO", 4))
+ break;
+ }
+
+ /* We walked the entire space and didn't find anything. */
+ if (i >= len)
+ return -1;
+
+ if (!header->table_bytes)
+ return 0;
+
+ /* Make sure the checksums match. */
+ if (ipchksum((u16 *) header, sizeof(*header)) != 0)
+ return -1;
+
+ if (ipchksum((u16 *) (ptr + sizeof(*header)),
+ header->table_bytes) != header->table_checksum)
+ return -1;
+
+ /* Now, walk the tables. */
+ ptr += header->header_bytes;
+
+ for (i = 0; i < header->table_entries; i++) {
+ struct cb_record *rec = (struct cb_record *)ptr;
+
+ /* We only care about a few tags here (maybe more later). */
+ switch (rec->tag) {
+ case CB_TAG_FORWARD:
+ return cb_parse_header(
+ (void *)(unsigned long)
+ ((struct cb_forward *)rec)->forward,
+ len, info);
+ continue;
+ case CB_TAG_MEMORY:
+ cb_parse_memory(ptr, info);
+ break;
+ case CB_TAG_SERIAL:
+ cb_parse_serial(ptr, info);
+ break;
+ case CB_TAG_CMOS_OPTION_TABLE:
+ cb_parse_optiontable(ptr, info);
+ break;
+ case CB_TAG_OPTION_CHECKSUM:
+ cb_parse_checksum(ptr, info);
+ break;
+ /*
+ * FIXME we should warn on serial if coreboot set up a
+ * framebuffer buf the payload does not know about it.
+ */
+ case CB_TAG_FRAMEBUFFER:
+ cb_parse_framebuffer(ptr, info);
+ break;
+ }
+
+ ptr += rec->size;
+ }
+
+ return 1;
+}
+
+/* == Architecture specific == */
+/* This is the x86 specific stuff. */
+
+/* Assume no translation or that memory is identity mapped. */
+static void *phys_to_virt(unsigned long virt)
+{
+ return (void *)(uintptr_t)virt;
+}
+
+int get_coreboot_info(struct sysinfo_t *info)
+{
+ int ret = cb_parse_header(phys_to_virt(0x00000000), 0x1000, info);
+
+ if (ret != 1)
+ ret = cb_parse_header(phys_to_virt(0x000f0000), 0x1000, info);
+
+ return (ret == 1) ? 0 : -1;
+}
diff --git a/arch/x86/include/asm/arch-coreboot/ipchecksum.h b/arch/x86/include/asm/arch-coreboot/ipchecksum.h
new file mode 100644
index 0000000..1d73b4d
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/ipchecksum.h
@@ -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 <cm@linktel.net>
+ * 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
diff --git a/arch/x86/include/asm/arch-coreboot/sysinfo.h b/arch/x86/include/asm/arch-coreboot/sysinfo.h
new file mode 100644
index 0000000..612342b
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/sysinfo.h
@@ -0,0 +1,64 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * 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.
+ */
+
+#ifndef _COREBOOT_SYSINFO_H
+#define _COREBOOT_SYSINFO_H
+
+#include <compiler.h>
+
+/* Allow a maximum of 16 memory range definitions. */
+#define SYSINFO_MAX_MEM_RANGES 16
+
+struct sysinfo_t {
+ unsigned int cpu_khz;
+ unsigned short ser_ioport;
+ unsigned long ser_base; /* for mmapped serial */
+
+ int n_memranges;
+
+ struct memrange {
+ unsigned long long base;
+ unsigned long long size;
+ unsigned int type;
+ } memrange[SYSINFO_MAX_MEM_RANGES];
+
+ struct cb_cmos_option_table *option_table;
+ u32 cmos_range_start;
+ u32 cmos_range_end;
+ u32 cmos_checksum_location;
+
+ struct cb_framebuffer *framebuffer;
+
+ unsigned long *mbtable; /** Pointer to the multiboot table */
+};
+
+extern struct sysinfo_t lib_sysinfo;
+
+#endif
+
diff --git a/arch/x86/include/asm/arch-coreboot/tables.h b/arch/x86/include/asm/arch-coreboot/tables.h
new file mode 100644
index 0000000..c286973
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/tables.h
@@ -0,0 +1,241 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * 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.
+ */
+
+#ifndef _COREBOOT_TABLES_H
+#define _COREBOOT_TABLES_H
+
+#include <compiler.h>
+
+struct cbuint64 {
+ u32 lo;
+ u32 hi;
+};
+
+struct cb_header {
+ u8 signature[4];
+ u32 header_bytes;
+ u32 header_checksum;
+ u32 table_bytes;
+ u32 table_checksum;
+ u32 table_entries;
+};
+
+struct cb_record {
+ u32 tag;
+ u32 size;
+};
+
+#define CB_TAG_UNUSED 0x0000
+#define CB_TAG_MEMORY 0x0001
+
+struct cb_memory_range {
+ struct cbuint64 start;
+ struct cbuint64 size;
+ u32 type;
+};
+
+#define CB_MEM_RAM 1
+#define CB_MEM_RESERVED 2
+#define CB_MEM_ACPI 3
+#define CB_MEM_NVS 4
+#define CB_MEM_UNUSABLE 5
+#define CB_MEM_VENDOR_RSVD 6
+#define CB_MEM_TABLE 16
+
+struct cb_memory {
+ u32 tag;
+ u32 size;
+ struct cb_memory_range map[0];
+};
+
+#define CB_TAG_HWRPB 0x0002
+
+struct cb_hwrpb {
+ u32 tag;
+ u32 size;
+ u64 hwrpb;
+};
+
+#define CB_TAG_MAINBOARD 0x0003
+
+struct cb_mainboard {
+ u32 tag;
+ u32 size;
+ u8 vendor_idx;
+ u8 part_number_idx;
+ u8 strings[0];
+};
+
+#define CB_TAG_VERSION 0x0004
+#define CB_TAG_EXTRA_VERSION 0x0005
+#define CB_TAG_BUILD 0x0006
+#define CB_TAG_COMPILE_TIME 0x0007
+#define CB_TAG_COMPILE_BY 0x0008
+#define CB_TAG_COMPILE_HOST 0x0009
+#define CB_TAG_COMPILE_DOMAIN 0x000a
+#define CB_TAG_COMPILER 0x000b
+#define CB_TAG_LINKER 0x000c
+#define CB_TAG_ASSEMBLER 0x000d
+
+struct cb_string {
+ u32 tag;
+ u32 size;
+ u8 string[0];
+};
+
+#define CB_TAG_SERIAL 0x000f
+
+struct cb_serial {
+ u32 tag;
+ u32 size;
+#define CB_SERIAL_TYPE_IO_MAPPED 1
+#define CB_SERIAL_TYPE_MEMORY_MAPPED 2
+ u32 type;
+ u32 baseaddr;
+ u32 baud;
+};
+
+#define CB_TAG_CONSOLE 0x00010
+
+struct cb_console {
+ u32 tag;
+ u32 size;
+ u16 type;
+};
+
+#define CB_TAG_CONSOLE_SERIAL8250 0
+#define CB_TAG_CONSOLE_VGA 1 /* OBSOLETE */
+#define CB_TAG_CONSOLE_BTEXT 2 /* OBSOLETE */
+#define CB_TAG_CONSOLE_LOGBUF 3
+#define CB_TAG_CONSOLE_SROM 4 /* OBSOLETE */
+#define CB_TAG_CONSOLE_EHCI 5
+
+#define CB_TAG_FORWARD 0x00011
+
+struct cb_forward {
+ u32 tag;
+ u32 size;
+ u64 forward;
+};
+
+#define CB_TAG_FRAMEBUFFER 0x0012
+struct cb_framebuffer {
+ u32 tag;
+ u32 size;
+
+ u64 physical_address;
+ u32 x_resolution;
+ u32 y_resolution;
+ u32 bytes_per_line;
+ u8 bits_per_pixel;
+ u8 red_mask_pos;
+ u8 red_mask_size;
+ u8 green_mask_pos;
+ u8 green_mask_size;
+ u8 blue_mask_pos;
+ u8 blue_mask_size;
+ u8 reserved_mask_pos;
+ u8 reserved_mask_size;
+};
+
+#define CB_TAG_CMOS_OPTION_TABLE 0x00c8
+struct cb_cmos_option_table {
+ u32 tag;
+ u32 size;
+ u32 header_length;
+};
+
+#define CB_TAG_OPTION 0x00c9
+#define CMOS_MAX_NAME_LENGTH 32
+struct cb_cmos_entries {
+ u32 tag;
+ u32 size;
+ u32 bit;
+ u32 length;
+ u32 config;
+ u32 config_id;
+ u8 name[CMOS_MAX_NAME_LENGTH];
+};
+
+
+#define CB_TAG_OPTION_ENUM 0x00ca
+#define CMOS_MAX_TEXT_LENGTH 32
+struct cb_cmos_enums {
+ u32 tag;
+ u32 size;
+ u32 config_id;
+ u32 value;
+ u8 text[CMOS_MAX_TEXT_LENGTH];
+};
+
+#define CB_TAG_OPTION_DEFAULTS 0x00cb
+#define CMOS_IMAGE_BUFFER_SIZE 128
+struct cb_cmos_defaults {
+ u32 tag;
+ u32 size;
+ u32 name_length;
+ u8 name[CMOS_MAX_NAME_LENGTH];
+ u8 default_set[CMOS_IMAGE_BUFFER_SIZE];
+};
+
+#define CB_TAG_OPTION_CHECKSUM 0x00cc
+#define CHECKSUM_NONE 0
+#define CHECKSUM_PCBIOS 1
+struct cb_cmos_checksum {
+ u32 tag;
+ u32 size;
+ u32 range_start;
+ u32 range_end;
+ u32 location;
+ u32 type;
+};
+
+/* Helpful macros */
+
+#define MEM_RANGE_COUNT(_rec) \
+ (((_rec)->size - sizeof(*(_rec))) / sizeof((_rec)->map[0]))
+
+#define MEM_RANGE_PTR(_rec, _idx) \
+ (((u8 *) (_rec)) + sizeof(*(_rec)) \
+ + (sizeof((_rec)->map[0]) * (_idx)))
+
+#define MB_VENDOR_STRING(_mb) \
+ (((unsigned char *) ((_mb)->strings)) + (_mb)->vendor_idx)
+
+#define MB_PART_STRING(_mb) \
+ (((unsigned char *) ((_mb)->strings)) + (_mb)->part_number_idx)
+
+#define UNPACK_CB64(_in) \
+ ((((u64) _in.hi) << 32) | _in.lo)
+
+struct sysinfo_t;
+
+int get_coreboot_info(struct sysinfo_t *info);
+
+#endif
diff --git a/board/chromebook-x86/coreboot/coreboot.c b/board/chromebook-x86/coreboot/coreboot.c
index 44c6f15..22a643c 100644
--- a/board/chromebook-x86/coreboot/coreboot.c
+++ b/board/chromebook-x86/coreboot/coreboot.c
@@ -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;
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table
2011-12-05 22:09 ` [U-Boot] [PATCH v3 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table Gabe Black
@ 2011-12-06 10:35 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:35 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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
Applied to u-boot-x86/next
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 2/6] x86: Clean up the x86 zimage code in preparation to extend it
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
2011-12-05 22:09 ` [U-Boot] [PATCH v3 " Gabe Black
2011-12-05 22:09 ` [U-Boot] [PATCH v3 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:36 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 3/6] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
` (3 subsequent siblings)
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index a02637f..1a77e00 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 8b42b5c..98e7507 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2011 The Chromium OS Authors.
* (C) Copyright 2002
* Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
*
@@ -82,21 +83,22 @@ void *load_zimage(char *image, unsigned long kernel_size,
unsigned long initrd_addr, unsigned long initrd_size,
int auto_boot)
{
- void *setup_base;
+ struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
void *load_address;
- struct setup_header *hdr;
- hdr = (struct setup_header *)(image + SETUP_SECTS_OFF);
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
/* base address for real-mode segment */
- setup_base = (void *)DEFAULT_SETUP_BASE;
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
if (KERNEL_MAGIC != hdr->boot_flag) {
- printf("Error: Invalid Boot Flag (found 0x%04x, expected 0x%04x)\n",
- hdr->boot_flag, KERNEL_MAGIC);
+ printf("Error: Invalid Boot Flag "
+ "(found 0x%04x, expected 0x%04x)\n",
+ hdr->boot_flag, KERNEL_MAGIC);
return 0;
} else {
printf("Valid Boot Flag\n");
@@ -131,9 +133,10 @@ void *load_zimage(char *image, unsigned long kernel_size,
(hdr->loadflags & BIG_KERNEL_FLAG);
/* Determine load address */
- load_address = (void *)(big_image ?
- BZIMAGE_LOAD_ADDR :
- ZIMAGE_LOAD_ADDR);
+ if (big_image)
+ load_address = (void *)BZIMAGE_LOAD_ADDR;
+ else
+ load_address = (void *)ZIMAGE_LOAD_ADDR;
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -144,8 +147,8 @@ void *load_zimage(char *image, unsigned long kernel_size,
(bootproto & 0xff00) >> 8, bootproto & 0xff);
if (bootproto == 0x0100) {
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
/*
* A very old kernel MUST have its real-mode code
@@ -157,33 +160,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Copy the command line */
memmove((void *)0x99000,
- setup_base + COMMAND_LINE_OFFSET,
+ (u8 *)setup_base + COMMAND_LINE_OFFSET,
COMMAND_LINE_SIZE);
/* Relocated */
- setup_base = (void *)0x90000;
+ setup_base = (struct boot_params *)0x90000;
}
/* It is recommended to clear memory up to the 32K mark */
- memset((void *)0x90000 + setup_size, 0,
- SETUP_MAX_SIZE-setup_size);
+ memset((u8 *)0x90000 + setup_size, 0,
+ SETUP_MAX_SIZE - setup_size);
}
/* We are now setting up the real-mode version of the header */
- hdr = (struct setup_header *)(setup_base + SETUP_SECTS_OFF);
+ hdr = &setup_base->hdr;
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15)
+ if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)(setup_base +
- (hdr->kernel_version + 0x200)));
- else
- printf("Setup Sectors < 15 - Cannot print kernel version.\n");
+ (char *)setup_base +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
if (initrd_addr) {
- printf("Initial RAM disk at linear address 0x%08lx, size %ld bytes\n",
+ printf("Initial RAM disk@linear address "
+ "0x%08lx, size %ld bytes\n",
initrd_addr, initrd_size);
hdr->ramdisk_image = initrd_addr;
@@ -197,11 +203,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr = (u32)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr =
+ (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
} else if (bootproto >= 0x0200) {
-
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
hdr->setup_move_size = 0x9100;
}
@@ -214,11 +220,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (big_image) {
if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
return 0;
}
-
} else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
kernel_size, ZIMAGE_MAX_SIZE);
@@ -226,7 +232,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line(setup_base + COMMAND_LINE_OFFSET, auto_boot);
+ build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
big_image ? 'b' : ' ', (u32)load_address, kernel_size);
@@ -248,8 +254,8 @@ void boot_zimage(void *setup_base)
regs.xss = regs.xds;
regs.esp = 0x9000;
regs.eflags = 0;
- enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, ®s,
- ®s);
+ enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
+ ®s, ®s);
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
@@ -264,11 +270,12 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* Setup board for maximum PC/AT Compatibility */
setup_pcat_compatibility();
- if (argc >= 2)
+ if (argc >= 2) {
/* argv[1] holds the address of the bzImage */
s = argv[1];
- else
+ } else {
s = getenv("fileaddr");
+ }
if (s)
bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
@@ -277,14 +284,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* argv[2] holds the size of the bzImage */
bzImage_size = simple_strtoul(argv[2], NULL, 16);
- /* Lets look for*/
+ /* Lets look for */
base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
} else {
- printf("## Transferring control to Linux (at address %08x) ...\n",
- (u32)base_ptr);
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
/* we assume that the kernel is in place */
printf("\nStarting kernel ...\n\n");
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 2/6] x86: Clean up the x86 zimage code in preparation to extend it
2011-12-05 22:09 ` [U-Boot] [PATCH v3 2/6] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
@ 2011-12-06 10:36 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:36 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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(-)
>
Applied to u-boot-x86/next
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 3/6] x86: Add support for booting Linux using the 32 bit boot protocol
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
` (2 preceding siblings ...)
2011-12-05 22:09 ` [U-Boot] [PATCH v3 2/6] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:36 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
` (2 subsequent siblings)
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 1a77e00..3a68bb0 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index bac7b4f..ba3875b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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:
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 98e7507..b5597ec 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -52,6 +52,16 @@
#define COMMAND_LINE_SIZE 2048
+unsigned generic_install_e820_map(unsigned max_entries,
+ struct e820entry *entries)
+{
+ return 0;
+}
+
+unsigned install_e820_map(unsigned max_entries,
+ struct e820entry *entries)
+ __attribute__((weak, alias("generic_install_e820_map")));
+
static void build_command_line(char *command_line, int auto_boot)
{
char *env_command_line;
@@ -81,13 +91,12 @@ static void build_command_line(char *command_line, int auto_boot)
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)
{
struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
- void *load_address;
struct boot_params *params = (struct boot_params *)image;
struct setup_header *hdr = ¶ms->hdr;
@@ -134,14 +143,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Determine load address */
if (big_image)
- load_address = (void *)BZIMAGE_LOAD_ADDR;
+ *load_address = (void *)BZIMAGE_LOAD_ADDR;
else
- load_address = (void *)ZIMAGE_LOAD_ADDR;
+ *load_address = (void *)ZIMAGE_LOAD_ADDR;
+#if defined CONFIG_ZBOOT_32
+ printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
+ memset(setup_base, 0, sizeof(*setup_base));
+ setup_base->hdr = params->hdr;
+
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
(ulong)setup_base, setup_size);
memmove(setup_base, image, setup_size);
+#endif
printf("Using boot protocol version %x.%02x\n",
(bootproto & 0xff00) >> 8, bootproto & 0xff);
@@ -180,7 +198,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)setup_base +
+ (char *)params +
hdr->kernel_version + 0x200);
} else {
printf("Setup Sectors < 15 - "
@@ -235,17 +253,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage@address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)load_address, kernel_size);
-
+ big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
- memmove(load_address, image + setup_size, kernel_size);
+ memmove(*load_address, image + setup_size, kernel_size);
/* ready for booting */
return setup_base;
}
-void boot_zimage(void *setup_base)
+void boot_zimage(void *setup_base, void *load_address)
{
+ printf("\nStarting kernel ...\n\n");
+
+#if defined CONFIG_ZBOOT_32
+ /*
+ * Set %ebx, %ebp, and %edi to 0, %esi to point to the boot_params
+ * structure, and then jump to the kernel. We assume that %cs is
+ * 0x10, 4GB flat, and read/execute, and the data segments are 0x18,
+ * 4GB flat, and read/write. U-boot is setting them up that way for
+ * itself in arch/i386/cpu/cpu.c.
+ */
+ __asm__ __volatile__ (
+ "movl $0, %%ebp \n"
+ "cli \n"
+ "jmp %[kernel_entry] \n"
+ :: [kernel_entry]"a"(load_address),
+ [boot_params] "S"(setup_base),
+ "b"(0), "D"(0)
+ : "%ebp"
+ );
+#else
struct pt_regs regs;
memset(®s, 0, sizeof(struct pt_regs));
@@ -256,12 +293,14 @@ void boot_zimage(void *setup_base)
regs.eflags = 0;
enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
®s, ®s);
+#endif
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
void *base_ptr;
void *bzImage_addr = NULL;
+ void *load_address;
char *s;
ulong bzImage_size = 0;
@@ -285,7 +324,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
+ &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
@@ -295,9 +335,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
(u32)base_ptr);
/* 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 */
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 3/6] x86: Add support for booting Linux using the 32 bit boot protocol
2011-12-05 22:09 ` [U-Boot] [PATCH v3 3/6] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
@ 2011-12-06 10:36 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:36 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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(-)
Applied to u-boot-x86/next
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
` (3 preceding siblings ...)
2011-12-05 22:09 ` [U-Boot] [PATCH v3 3/6] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:37 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
2011-12-05 22:09 ` [U-Boot] [PATCH v3 6/6] x86: Add support for specifying an initrd with the zboot command Gabe Black
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c
index b56085a..f8fdac6 100644
--- a/arch/x86/cpu/coreboot/sdram.c
+++ b/arch/x86/cpu/coreboot/sdram.c
@@ -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;
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-12-05 22:09 ` [U-Boot] [PATCH v3 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
@ 2011-12-06 10:37 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:37 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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(-)
Applied to u-boot-x86/next
Regards,
Graeme
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
` (4 preceding siblings ...)
2011-12-05 22:09 ` [U-Boot] [PATCH v3 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:37 ` Graeme Russ
2011-12-05 22:09 ` [U-Boot] [PATCH v3 6/6] x86: Add support for specifying an initrd with the zboot command Gabe Black
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 3a68bb0..f03ea80 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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);
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index ba3875b..83caf6b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index b5597ec..0cbb571 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -89,21 +89,8 @@ static void build_command_line(char *command_line, int auto_boot)
printf("Kernel command line: \"%s\"\n", command_line);
}
-void *load_zimage(char *image, unsigned long kernel_size,
- unsigned long initrd_addr, unsigned long initrd_size,
- int auto_boot, void **load_address)
+static int kernel_magic_ok(struct setup_header *hdr)
{
- struct boot_params *setup_base;
- int setup_size;
- int bootproto;
- int big_image;
-
- struct boot_params *params = (struct boot_params *)image;
- struct setup_header *hdr = ¶ms->hdr;
-
- /* base address for real-mode segment */
- setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
-
if (KERNEL_MAGIC != hdr->boot_flag) {
printf("Error: Invalid Boot Flag "
"(found 0x%04x, expected 0x%04x)\n",
@@ -111,18 +98,38 @@ void *load_zimage(char *image, unsigned long kernel_size,
return 0;
} else {
printf("Valid Boot Flag\n");
+ return 1;
}
+}
- /* determine boot protocol version */
- if (KERNEL_V2_MAGIC == hdr->header) {
+static int get_boot_protocol(struct setup_header *hdr)
+{
+ if (hdr->header == KERNEL_V2_MAGIC) {
printf("Magic signature found\n");
-
- bootproto = hdr->version;
+ return hdr->version;
} else {
/* Very old kernel */
printf("Magic signature not found\n");
- bootproto = 0x0100;
+ return 0x0100;
}
+}
+
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+ void **load_address)
+{
+ struct boot_params *setup_base;
+ int setup_size;
+ int bootproto;
+ int big_image;
+
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
+
+ /* base address for real-mode segment */
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
+
+ if (!kernel_magic_ok(hdr))
+ return 0;
/* determine size of setup */
if (0 == hdr->setup_sects) {
@@ -137,6 +144,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (setup_size > SETUP_MAX_SIZE)
printf("Error: Setup is too large (%d bytes)\n", setup_size);
+ /* determine boot protocol version */
+ bootproto = get_boot_protocol(hdr);
+
+ printf("Using boot protocol version %x.%02x\n",
+ (bootproto & 0xff00) >> 8, bootproto & 0xff);
+
+ if (bootproto >= 0x0200) {
+ if (hdr->setup_sects >= 15) {
+ printf("Linux kernel version %s\n",
+ (char *)params +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
+ }
+
/* Determine image type */
big_image = (bootproto >= 0x0200) &&
(hdr->loadflags & BIG_KERNEL_FLAG);
@@ -151,9 +175,6 @@ void *load_zimage(char *image, unsigned long kernel_size,
printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
memset(setup_base, 0, sizeof(*setup_base));
setup_base->hdr = params->hdr;
-
- setup_base->e820_entries = install_e820_map(
- ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -161,13 +182,12 @@ void *load_zimage(char *image, unsigned long kernel_size,
memmove(setup_base, image, setup_size);
#endif
- printf("Using boot protocol version %x.%02x\n",
- (bootproto & 0xff00) >> 8, bootproto & 0xff);
+ if (bootproto >= 0x0204)
+ kernel_size = hdr->syssize * 16;
+ else
+ kernel_size -= setup_size;
if (bootproto == 0x0100) {
- setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
-
/*
* A very old kernel MUST have its real-mode code
* loaded at 0x90000
@@ -190,21 +210,45 @@ void *load_zimage(char *image, unsigned long kernel_size,
SETUP_MAX_SIZE - setup_size);
}
- /* We are now setting up the real-mode version of the header */
- hdr = &setup_base->hdr;
+ if (big_image) {
+ if (kernel_size > BZIMAGE_MAX_SIZE) {
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
+ return 0;
+ }
+ } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
+ printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
+ kernel_size, ZIMAGE_MAX_SIZE);
+ return 0;
+ }
+
+ printf("Loading %s at address %p (%ld bytes)\n",
+ big_image ? "bzImage" : "zImage", *load_address, kernel_size);
+
+ memmove(*load_address, image + setup_size, kernel_size);
+
+ return setup_base;
+}
+
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+ unsigned long initrd_addr, unsigned long initrd_size)
+{
+ struct setup_header *hdr = &setup_base->hdr;
+ int bootproto = get_boot_protocol(hdr);
+
+#if defined CONFIG_ZBOOT_32
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#endif
+ if (bootproto == 0x0100) {
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ }
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15) {
- printf("Linux kernel version %s\n",
- (char *)params +
- hdr->kernel_version + 0x200);
- } else {
- printf("Setup Sectors < 15 - "
- "Cannot print kernel version.\n");
- }
-
if (initrd_addr) {
printf("Initial RAM disk@linear address "
"0x%08lx, size %ld bytes\n",
@@ -221,44 +265,18 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr =
- (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr = (uintptr_t)cmd_line;
} else if (bootproto >= 0x0200) {
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_offset =
+ (uintptr_t)cmd_line - (uintptr_t)setup_base;
hdr->setup_move_size = 0x9100;
}
- if (bootproto >= 0x0204)
- kernel_size = hdr->syssize * 16;
- else
- kernel_size -= setup_size;
-
-
- if (big_image) {
- if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! "
- "(size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
- return 0;
- }
- } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
- printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, ZIMAGE_MAX_SIZE);
- return 0;
- }
-
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
-
- printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
-
- memmove(*load_address, image + setup_size, kernel_size);
-
- /* ready for booting */
- return setup_base;
+ build_command_line(cmd_line, auto_boot);
+ return 0;
}
void boot_zimage(void *setup_base, void *load_address)
@@ -298,7 +316,7 @@ void boot_zimage(void *setup_base, void *load_address)
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
- void *base_ptr;
+ struct boot_params *base_ptr;
void *bzImage_addr = NULL;
void *load_address;
char *s;
@@ -324,20 +342,25 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
- &load_address);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
- } else {
- printf("## Transferring control to Linux "
- "(at address %08x) ...\n",
- (u32)base_ptr);
-
- /* we assume that the kernel is in place */
- boot_zimage(base_ptr, load_address);
- /* does not return */
+ return -1;
}
+ if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+ 0, 0, 0)) {
+ printf("Setting up boot parameters failed ...\n");
+ return -1;
+ }
+
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
+
+ /* we assume that the kernel is in place */
+ boot_zimage(base_ptr, load_address);
+ /* does not return */
return -1;
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-12-05 22:09 ` [U-Boot] [PATCH v3 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
@ 2011-12-06 10:37 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:37 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v3 6/6] x86: Add support for specifying an initrd with the zboot command
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
` (5 preceding siblings ...)
2011-12-05 22:09 ` [U-Boot] [PATCH v3 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
@ 2011-12-05 22:09 ` Gabe Black
2011-12-06 10:38 ` Graeme Russ
6 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
Changes in v2:
- Add a help message to the zboot command.
arch/x86/lib/zimage.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 0cbb571..bb40517 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -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"
);
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v3 6/6] x86: Add support for specifying an initrd with the zboot command
2011-12-05 22:09 ` [U-Boot] [PATCH v3 6/6] x86: Add support for specifying an initrd with the zboot command Gabe Black
@ 2011-12-06 10:38 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-06 10:38 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On 06/12/11 09:09, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v2 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (6 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 0/6] Add support for the 32 bit boot protocol and coreboot table parsing Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 2/6] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
` (4 subsequent siblings)
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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
diff --git a/arch/x86/cpu/coreboot/Makefile b/arch/x86/cpu/coreboot/Makefile
index 0444399..13f5f8a 100644
--- a/arch/x86/cpu/coreboot/Makefile
+++ b/arch/x86/cpu/coreboot/Makefile
@@ -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
diff --git a/arch/x86/cpu/coreboot/ipchecksum.c b/arch/x86/cpu/coreboot/ipchecksum.c
new file mode 100644
index 0000000..57733d8
--- /dev/null
+++ b/arch/x86/cpu/coreboot/ipchecksum.c
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * It has originally been taken from the FreeBSD project.
+ *
+ * Copyright (c) 2001 Charles Mott <cm@linktel.net>
+ * 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.
+ */
+
+#include <compiler.h>
+#include <asm/arch-coreboot/ipchecksum.h>
+
+unsigned short ipchksum(const void *vptr, unsigned long nbytes)
+{
+ int sum, oddbyte;
+ const unsigned short *ptr = vptr;
+
+ sum = 0;
+ while (nbytes > 1) {
+ sum += *ptr++;
+ nbytes -= 2;
+ }
+ if (nbytes == 1) {
+ oddbyte = 0;
+ ((u8 *)&oddbyte)[0] = *(u8 *) ptr;
+ ((u8 *)&oddbyte)[1] = 0;
+ sum += oddbyte;
+ }
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16);
+ return ~sum;
+}
diff --git a/arch/x86/cpu/coreboot/sysinfo.c b/arch/x86/cpu/coreboot/sysinfo.c
new file mode 100644
index 0000000..9b3e660
--- /dev/null
+++ b/arch/x86/cpu/coreboot/sysinfo.c
@@ -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")));
diff --git a/arch/x86/cpu/coreboot/tables.c b/arch/x86/cpu/coreboot/tables.c
new file mode 100644
index 0000000..0e3451b
--- /dev/null
+++ b/arch/x86/cpu/coreboot/tables.c
@@ -0,0 +1,183 @@
+/*
+ * 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/ipchecksum.h>
+#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch-coreboot/tables.h>
+
+/*
+ * Some of this is x86 specific, and the rest of it is generic. Right now,
+ * since we only support x86, we'll avoid trying to make lots of infrastructure
+ * we don't need. If in the future, we want to use coreboot on some other
+ * architecture, then take out the generic parsing code and move it elsewhere.
+ */
+
+/* === Parsing code === */
+/* This is the generic parsing code. */
+
+static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_memory *mem = (struct cb_memory *)ptr;
+ int count = MEM_RANGE_COUNT(mem);
+ int i;
+
+ if (count > SYSINFO_MAX_MEM_RANGES)
+ count = SYSINFO_MAX_MEM_RANGES;
+
+ info->n_memranges = 0;
+
+ for (i = 0; i < count; i++) {
+ struct cb_memory_range *range =
+ (struct cb_memory_range *)MEM_RANGE_PTR(mem, i);
+
+ info->memrange[info->n_memranges].base =
+ UNPACK_CB64(range->start);
+
+ info->memrange[info->n_memranges].size =
+ UNPACK_CB64(range->size);
+
+ info->memrange[info->n_memranges].type = range->type;
+
+ info->n_memranges++;
+ }
+}
+
+static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_serial *ser = (struct cb_serial *)ptr;
+ if (ser->type != CB_SERIAL_TYPE_IO_MAPPED)
+ return;
+ info->ser_ioport = ser->baseaddr;
+}
+
+static void cb_parse_optiontable(unsigned char *ptr, struct sysinfo_t *info)
+{
+ info->option_table = (struct cb_cmos_option_table *)ptr;
+}
+
+static void cb_parse_checksum(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct cb_cmos_checksum *cmos_cksum = (struct cb_cmos_checksum *)ptr;
+ info->cmos_range_start = cmos_cksum->range_start;
+ info->cmos_range_end = cmos_cksum->range_end;
+ info->cmos_checksum_location = cmos_cksum->location;
+}
+
+static void cb_parse_framebuffer(unsigned char *ptr, struct sysinfo_t *info)
+{
+ info->framebuffer = (struct cb_framebuffer *)ptr;
+}
+
+static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
+{
+ struct cb_header *header;
+ unsigned char *ptr = (unsigned char *)addr;
+ int i;
+
+ for (i = 0; i < len; i += 16, ptr += 16) {
+ header = (struct cb_header *)ptr;
+ if (!strncmp((const char *)header->signature, "LBIO", 4))
+ break;
+ }
+
+ /* We walked the entire space and didn't find anything. */
+ if (i >= len)
+ return -1;
+
+ if (!header->table_bytes)
+ return 0;
+
+ /* Make sure the checksums match. */
+ if (ipchksum((u16 *) header, sizeof(*header)) != 0)
+ return -1;
+
+ if (ipchksum((u16 *) (ptr + sizeof(*header)),
+ header->table_bytes) != header->table_checksum)
+ return -1;
+
+ /* Now, walk the tables. */
+ ptr += header->header_bytes;
+
+ for (i = 0; i < header->table_entries; i++) {
+ struct cb_record *rec = (struct cb_record *)ptr;
+
+ /* We only care about a few tags here (maybe more later). */
+ switch (rec->tag) {
+ case CB_TAG_FORWARD:
+ return cb_parse_header(
+ (void *)(unsigned long)
+ ((struct cb_forward *)rec)->forward,
+ len, info);
+ continue;
+ case CB_TAG_MEMORY:
+ cb_parse_memory(ptr, info);
+ break;
+ case CB_TAG_SERIAL:
+ cb_parse_serial(ptr, info);
+ break;
+ case CB_TAG_CMOS_OPTION_TABLE:
+ cb_parse_optiontable(ptr, info);
+ break;
+ case CB_TAG_OPTION_CHECKSUM:
+ cb_parse_checksum(ptr, info);
+ break;
+ /*
+ * FIXME we should warn on serial if coreboot set up a
+ * framebuffer buf the payload does not know about it.
+ */
+ case CB_TAG_FRAMEBUFFER:
+ cb_parse_framebuffer(ptr, info);
+ break;
+ }
+
+ ptr += rec->size;
+ }
+
+ return 1;
+}
+
+/* == Architecture specific == */
+/* This is the x86 specific stuff. */
+
+/* Assume no translation or that memory is identity mapped. */
+static void *phys_to_virt(unsigned long virt)
+{
+ return (void *)(uintptr_t)virt;
+}
+
+int get_coreboot_info(struct sysinfo_t *info)
+{
+ int ret = cb_parse_header(phys_to_virt(0x00000000), 0x1000, info);
+
+ if (ret != 1)
+ ret = cb_parse_header(phys_to_virt(0x000f0000), 0x1000, info);
+
+ return (ret == 1) ? 0 : -1;
+}
diff --git a/arch/x86/include/asm/arch-coreboot/ipchecksum.h b/arch/x86/include/asm/arch-coreboot/ipchecksum.h
new file mode 100644
index 0000000..1d73b4d
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/ipchecksum.h
@@ -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 <cm@linktel.net>
+ * 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
diff --git a/arch/x86/include/asm/arch-coreboot/sysinfo.h b/arch/x86/include/asm/arch-coreboot/sysinfo.h
new file mode 100644
index 0000000..612342b
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/sysinfo.h
@@ -0,0 +1,64 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * 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.
+ */
+
+#ifndef _COREBOOT_SYSINFO_H
+#define _COREBOOT_SYSINFO_H
+
+#include <compiler.h>
+
+/* Allow a maximum of 16 memory range definitions. */
+#define SYSINFO_MAX_MEM_RANGES 16
+
+struct sysinfo_t {
+ unsigned int cpu_khz;
+ unsigned short ser_ioport;
+ unsigned long ser_base; /* for mmapped serial */
+
+ int n_memranges;
+
+ struct memrange {
+ unsigned long long base;
+ unsigned long long size;
+ unsigned int type;
+ } memrange[SYSINFO_MAX_MEM_RANGES];
+
+ struct cb_cmos_option_table *option_table;
+ u32 cmos_range_start;
+ u32 cmos_range_end;
+ u32 cmos_checksum_location;
+
+ struct cb_framebuffer *framebuffer;
+
+ unsigned long *mbtable; /** Pointer to the multiboot table */
+};
+
+extern struct sysinfo_t lib_sysinfo;
+
+#endif
+
diff --git a/arch/x86/include/asm/arch-coreboot/tables.h b/arch/x86/include/asm/arch-coreboot/tables.h
new file mode 100644
index 0000000..c286973
--- /dev/null
+++ b/arch/x86/include/asm/arch-coreboot/tables.h
@@ -0,0 +1,241 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * 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.
+ */
+
+#ifndef _COREBOOT_TABLES_H
+#define _COREBOOT_TABLES_H
+
+#include <compiler.h>
+
+struct cbuint64 {
+ u32 lo;
+ u32 hi;
+};
+
+struct cb_header {
+ u8 signature[4];
+ u32 header_bytes;
+ u32 header_checksum;
+ u32 table_bytes;
+ u32 table_checksum;
+ u32 table_entries;
+};
+
+struct cb_record {
+ u32 tag;
+ u32 size;
+};
+
+#define CB_TAG_UNUSED 0x0000
+#define CB_TAG_MEMORY 0x0001
+
+struct cb_memory_range {
+ struct cbuint64 start;
+ struct cbuint64 size;
+ u32 type;
+};
+
+#define CB_MEM_RAM 1
+#define CB_MEM_RESERVED 2
+#define CB_MEM_ACPI 3
+#define CB_MEM_NVS 4
+#define CB_MEM_UNUSABLE 5
+#define CB_MEM_VENDOR_RSVD 6
+#define CB_MEM_TABLE 16
+
+struct cb_memory {
+ u32 tag;
+ u32 size;
+ struct cb_memory_range map[0];
+};
+
+#define CB_TAG_HWRPB 0x0002
+
+struct cb_hwrpb {
+ u32 tag;
+ u32 size;
+ u64 hwrpb;
+};
+
+#define CB_TAG_MAINBOARD 0x0003
+
+struct cb_mainboard {
+ u32 tag;
+ u32 size;
+ u8 vendor_idx;
+ u8 part_number_idx;
+ u8 strings[0];
+};
+
+#define CB_TAG_VERSION 0x0004
+#define CB_TAG_EXTRA_VERSION 0x0005
+#define CB_TAG_BUILD 0x0006
+#define CB_TAG_COMPILE_TIME 0x0007
+#define CB_TAG_COMPILE_BY 0x0008
+#define CB_TAG_COMPILE_HOST 0x0009
+#define CB_TAG_COMPILE_DOMAIN 0x000a
+#define CB_TAG_COMPILER 0x000b
+#define CB_TAG_LINKER 0x000c
+#define CB_TAG_ASSEMBLER 0x000d
+
+struct cb_string {
+ u32 tag;
+ u32 size;
+ u8 string[0];
+};
+
+#define CB_TAG_SERIAL 0x000f
+
+struct cb_serial {
+ u32 tag;
+ u32 size;
+#define CB_SERIAL_TYPE_IO_MAPPED 1
+#define CB_SERIAL_TYPE_MEMORY_MAPPED 2
+ u32 type;
+ u32 baseaddr;
+ u32 baud;
+};
+
+#define CB_TAG_CONSOLE 0x00010
+
+struct cb_console {
+ u32 tag;
+ u32 size;
+ u16 type;
+};
+
+#define CB_TAG_CONSOLE_SERIAL8250 0
+#define CB_TAG_CONSOLE_VGA 1 /* OBSOLETE */
+#define CB_TAG_CONSOLE_BTEXT 2 /* OBSOLETE */
+#define CB_TAG_CONSOLE_LOGBUF 3
+#define CB_TAG_CONSOLE_SROM 4 /* OBSOLETE */
+#define CB_TAG_CONSOLE_EHCI 5
+
+#define CB_TAG_FORWARD 0x00011
+
+struct cb_forward {
+ u32 tag;
+ u32 size;
+ u64 forward;
+};
+
+#define CB_TAG_FRAMEBUFFER 0x0012
+struct cb_framebuffer {
+ u32 tag;
+ u32 size;
+
+ u64 physical_address;
+ u32 x_resolution;
+ u32 y_resolution;
+ u32 bytes_per_line;
+ u8 bits_per_pixel;
+ u8 red_mask_pos;
+ u8 red_mask_size;
+ u8 green_mask_pos;
+ u8 green_mask_size;
+ u8 blue_mask_pos;
+ u8 blue_mask_size;
+ u8 reserved_mask_pos;
+ u8 reserved_mask_size;
+};
+
+#define CB_TAG_CMOS_OPTION_TABLE 0x00c8
+struct cb_cmos_option_table {
+ u32 tag;
+ u32 size;
+ u32 header_length;
+};
+
+#define CB_TAG_OPTION 0x00c9
+#define CMOS_MAX_NAME_LENGTH 32
+struct cb_cmos_entries {
+ u32 tag;
+ u32 size;
+ u32 bit;
+ u32 length;
+ u32 config;
+ u32 config_id;
+ u8 name[CMOS_MAX_NAME_LENGTH];
+};
+
+
+#define CB_TAG_OPTION_ENUM 0x00ca
+#define CMOS_MAX_TEXT_LENGTH 32
+struct cb_cmos_enums {
+ u32 tag;
+ u32 size;
+ u32 config_id;
+ u32 value;
+ u8 text[CMOS_MAX_TEXT_LENGTH];
+};
+
+#define CB_TAG_OPTION_DEFAULTS 0x00cb
+#define CMOS_IMAGE_BUFFER_SIZE 128
+struct cb_cmos_defaults {
+ u32 tag;
+ u32 size;
+ u32 name_length;
+ u8 name[CMOS_MAX_NAME_LENGTH];
+ u8 default_set[CMOS_IMAGE_BUFFER_SIZE];
+};
+
+#define CB_TAG_OPTION_CHECKSUM 0x00cc
+#define CHECKSUM_NONE 0
+#define CHECKSUM_PCBIOS 1
+struct cb_cmos_checksum {
+ u32 tag;
+ u32 size;
+ u32 range_start;
+ u32 range_end;
+ u32 location;
+ u32 type;
+};
+
+/* Helpful macros */
+
+#define MEM_RANGE_COUNT(_rec) \
+ (((_rec)->size - sizeof(*(_rec))) / sizeof((_rec)->map[0]))
+
+#define MEM_RANGE_PTR(_rec, _idx) \
+ (((u8 *) (_rec)) + sizeof(*(_rec)) \
+ + (sizeof((_rec)->map[0]) * (_idx)))
+
+#define MB_VENDOR_STRING(_mb) \
+ (((unsigned char *) ((_mb)->strings)) + (_mb)->vendor_idx)
+
+#define MB_PART_STRING(_mb) \
+ (((unsigned char *) ((_mb)->strings)) + (_mb)->part_number_idx)
+
+#define UNPACK_CB64(_in) \
+ ((((u64) _in.hi) << 32) | _in.lo)
+
+struct sysinfo_t;
+
+int get_coreboot_info(struct sysinfo_t *info);
+
+#endif
diff --git a/board/chromebook-x86/coreboot/coreboot.c b/board/chromebook-x86/coreboot/coreboot.c
index 44c6f15..22a643c 100644
--- a/board/chromebook-x86/coreboot/coreboot.c
+++ b/board/chromebook-x86/coreboot/coreboot.c
@@ -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;
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 2/6] x86: Clean up the x86 zimage code in preparation to extend it
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (7 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 1/6] x86: Import code from coreboot's libpayload to parse the coreboot table Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 3/6] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
` (3 subsequent siblings)
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index a02637f..1a77e00 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 8b42b5c..98e7507 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2011 The Chromium OS Authors.
* (C) Copyright 2002
* Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
*
@@ -82,21 +83,22 @@ void *load_zimage(char *image, unsigned long kernel_size,
unsigned long initrd_addr, unsigned long initrd_size,
int auto_boot)
{
- void *setup_base;
+ struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
void *load_address;
- struct setup_header *hdr;
- hdr = (struct setup_header *)(image + SETUP_SECTS_OFF);
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
/* base address for real-mode segment */
- setup_base = (void *)DEFAULT_SETUP_BASE;
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
if (KERNEL_MAGIC != hdr->boot_flag) {
- printf("Error: Invalid Boot Flag (found 0x%04x, expected 0x%04x)\n",
- hdr->boot_flag, KERNEL_MAGIC);
+ printf("Error: Invalid Boot Flag "
+ "(found 0x%04x, expected 0x%04x)\n",
+ hdr->boot_flag, KERNEL_MAGIC);
return 0;
} else {
printf("Valid Boot Flag\n");
@@ -131,9 +133,10 @@ void *load_zimage(char *image, unsigned long kernel_size,
(hdr->loadflags & BIG_KERNEL_FLAG);
/* Determine load address */
- load_address = (void *)(big_image ?
- BZIMAGE_LOAD_ADDR :
- ZIMAGE_LOAD_ADDR);
+ if (big_image)
+ load_address = (void *)BZIMAGE_LOAD_ADDR;
+ else
+ load_address = (void *)ZIMAGE_LOAD_ADDR;
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -144,8 +147,8 @@ void *load_zimage(char *image, unsigned long kernel_size,
(bootproto & 0xff00) >> 8, bootproto & 0xff);
if (bootproto == 0x0100) {
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
/*
* A very old kernel MUST have its real-mode code
@@ -157,33 +160,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Copy the command line */
memmove((void *)0x99000,
- setup_base + COMMAND_LINE_OFFSET,
+ (u8 *)setup_base + COMMAND_LINE_OFFSET,
COMMAND_LINE_SIZE);
/* Relocated */
- setup_base = (void *)0x90000;
+ setup_base = (struct boot_params *)0x90000;
}
/* It is recommended to clear memory up to the 32K mark */
- memset((void *)0x90000 + setup_size, 0,
- SETUP_MAX_SIZE-setup_size);
+ memset((u8 *)0x90000 + setup_size, 0,
+ SETUP_MAX_SIZE - setup_size);
}
/* We are now setting up the real-mode version of the header */
- hdr = (struct setup_header *)(setup_base + SETUP_SECTS_OFF);
+ hdr = &setup_base->hdr;
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15)
+ if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)(setup_base +
- (hdr->kernel_version + 0x200)));
- else
- printf("Setup Sectors < 15 - Cannot print kernel version.\n");
+ (char *)setup_base +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
if (initrd_addr) {
- printf("Initial RAM disk at linear address 0x%08lx, size %ld bytes\n",
+ printf("Initial RAM disk@linear address "
+ "0x%08lx, size %ld bytes\n",
initrd_addr, initrd_size);
hdr->ramdisk_image = initrd_addr;
@@ -197,11 +203,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr = (u32)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr =
+ (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
} else if (bootproto >= 0x0200) {
-
- *(u16 *)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;
- *(u16 *)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
hdr->setup_move_size = 0x9100;
}
@@ -214,11 +220,11 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (big_image) {
if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
return 0;
}
-
} else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
kernel_size, ZIMAGE_MAX_SIZE);
@@ -226,7 +232,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line(setup_base + COMMAND_LINE_OFFSET, auto_boot);
+ build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
big_image ? 'b' : ' ', (u32)load_address, kernel_size);
@@ -248,8 +254,8 @@ void boot_zimage(void *setup_base)
regs.xss = regs.xds;
regs.esp = 0x9000;
regs.eflags = 0;
- enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, ®s,
- ®s);
+ enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
+ ®s, ®s);
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
@@ -264,11 +270,12 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* Setup board for maximum PC/AT Compatibility */
setup_pcat_compatibility();
- if (argc >= 2)
+ if (argc >= 2) {
/* argv[1] holds the address of the bzImage */
s = argv[1];
- else
+ } else {
s = getenv("fileaddr");
+ }
if (s)
bzImage_addr = (void *)simple_strtoul(s, NULL, 16);
@@ -277,14 +284,15 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
/* argv[2] holds the size of the bzImage */
bzImage_size = simple_strtoul(argv[2], NULL, 16);
- /* Lets look for*/
+ /* Lets look for */
base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
} else {
- printf("## Transferring control to Linux (at address %08x) ...\n",
- (u32)base_ptr);
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
/* we assume that the kernel is in place */
printf("\nStarting kernel ...\n\n");
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 3/6] x86: Add support for booting Linux using the 32 bit boot protocol
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (8 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 2/6] x86: Clean up the x86 zimage code in preparation to extend it Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
` (2 subsequent siblings)
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 1a77e00..8ee6a74 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index bac7b4f..ba3875b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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:
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 98e7507..b5597ec 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -52,6 +52,16 @@
#define COMMAND_LINE_SIZE 2048
+unsigned generic_install_e820_map(unsigned max_entries,
+ struct e820entry *entries)
+{
+ return 0;
+}
+
+unsigned install_e820_map(unsigned max_entries,
+ struct e820entry *entries)
+ __attribute__((weak, alias("generic_install_e820_map")));
+
static void build_command_line(char *command_line, int auto_boot)
{
char *env_command_line;
@@ -81,13 +91,12 @@ static void build_command_line(char *command_line, int auto_boot)
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)
{
struct boot_params *setup_base;
int setup_size;
int bootproto;
int big_image;
- void *load_address;
struct boot_params *params = (struct boot_params *)image;
struct setup_header *hdr = ¶ms->hdr;
@@ -134,14 +143,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
/* Determine load address */
if (big_image)
- load_address = (void *)BZIMAGE_LOAD_ADDR;
+ *load_address = (void *)BZIMAGE_LOAD_ADDR;
else
- load_address = (void *)ZIMAGE_LOAD_ADDR;
+ *load_address = (void *)ZIMAGE_LOAD_ADDR;
+#if defined CONFIG_ZBOOT_32
+ printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
+ memset(setup_base, 0, sizeof(*setup_base));
+ setup_base->hdr = params->hdr;
+
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
(ulong)setup_base, setup_size);
memmove(setup_base, image, setup_size);
+#endif
printf("Using boot protocol version %x.%02x\n",
(bootproto & 0xff00) >> 8, bootproto & 0xff);
@@ -180,7 +198,7 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (hdr->setup_sects >= 15) {
printf("Linux kernel version %s\n",
- (char *)setup_base +
+ (char *)params +
hdr->kernel_version + 0x200);
} else {
printf("Setup Sectors < 15 - "
@@ -235,17 +253,36 @@ void *load_zimage(char *image, unsigned long kernel_size,
build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
printf("Loading %czImage@address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)load_address, kernel_size);
-
+ big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
- memmove(load_address, image + setup_size, kernel_size);
+ memmove(*load_address, image + setup_size, kernel_size);
/* ready for booting */
return setup_base;
}
-void boot_zimage(void *setup_base)
+void boot_zimage(void *setup_base, void *load_address)
{
+ printf("\nStarting kernel ...\n\n");
+
+#if defined CONFIG_ZBOOT_32
+ /*
+ * Set %ebx, %ebp, and %edi to 0, %esi to point to the boot_params
+ * structure, and then jump to the kernel. We assume that %cs is
+ * 0x10, 4GB flat, and read/execute, and the data segments are 0x18,
+ * 4GB flat, and read/write. U-boot is setting them up that way for
+ * itself in arch/i386/cpu/cpu.c.
+ */
+ __asm__ __volatile__ (
+ "movl $0, %%ebp \n"
+ "cli \n"
+ "jmp %[kernel_entry] \n"
+ :: [kernel_entry]"a"(load_address),
+ [boot_params] "S"(setup_base),
+ "b"(0), "D"(0)
+ : "%ebp"
+ );
+#else
struct pt_regs regs;
memset(®s, 0, sizeof(struct pt_regs));
@@ -256,12 +293,14 @@ void boot_zimage(void *setup_base)
regs.eflags = 0;
enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
®s, ®s);
+#endif
}
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
void *base_ptr;
void *bzImage_addr = NULL;
+ void *load_address;
char *s;
ulong bzImage_size = 0;
@@ -285,7 +324,8 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
+ &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
@@ -295,9 +335,7 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
(u32)base_ptr);
/* 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 */
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (9 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 3/6] x86: Add support for booting Linux using the 32 bit boot protocol Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
2011-12-04 0:52 ` Graeme Russ
2011-12-03 11:18 ` [U-Boot] [PATCH v2 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 6/6] x86: Add support for specifying an initrd with the zboot command Gabe Black
12 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c
index b56085a..f8fdac6 100644
--- a/arch/x86/cpu/coreboot/sdram.c
+++ b/arch/x86/cpu/coreboot/sdram.c
@@ -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;
}
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 8ee6a74..3a68bb0 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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);
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-12-03 11:18 ` [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
@ 2011-12-04 0:52 ` Graeme Russ
2011-12-05 22:06 ` Gabe Black
0 siblings, 1 reply; 37+ messages in thread
From: Graeme Russ @ 2011-12-04 0:52 UTC (permalink / raw)
To: u-boot
Hi Gabe,
Last nit, I promise, and then I'll apply it all to u-boot-x86/next
On 03/12/11 22:18, Gabe Black wrote:
> 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.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
> 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(-)
>
> diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c
> index b56085a..f8fdac6 100644
> --- a/arch/x86/cpu/coreboot/sdram.c
> +++ b/arch/x86/cpu/coreboot/sdram.c
> @@ -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;
> }
>
> diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
> index 8ee6a74..3a68bb0 100644
> --- a/arch/x86/include/asm/zimage.h
> +++ b/arch/x86/include/asm/zimage.h
The zimage.h changes belong in patch 3
> @@ -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 *);
> +
Should be u8 as boot_params.e820_entries is u8 (__u8 really, but we don't
use the kernel data types)
> 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
^ permalink raw reply [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-12-04 0:52 ` Graeme Russ
@ 2011-12-05 22:06 ` Gabe Black
2011-12-05 22:09 ` Graeme Russ
0 siblings, 1 reply; 37+ messages in thread
From: Gabe Black @ 2011-12-05 22:06 UTC (permalink / raw)
To: u-boot
On Sat, Dec 3, 2011 at 4:52 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Gabe,
>
> Last nit, I promise, and then I'll apply it all to u-boot-x86/next
> >
> > +/* 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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables
2011-12-05 22:06 ` Gabe Black
@ 2011-12-05 22:09 ` Graeme Russ
0 siblings, 0 replies; 37+ messages in thread
From: Graeme Russ @ 2011-12-05 22:09 UTC (permalink / raw)
To: u-boot
Hi Gabe,
On Tue, Dec 6, 2011 at 9:06 AM, Gabe Black <gabeblack@google.com> wrote:
>
>
> On Sat, Dec 3, 2011 at 4:52 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Hi Gabe,
>>
>> Last nit, I promise, and then I'll apply it all to u-boot-x86/next
>> >
>> > +/* 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.
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
^ permalink raw reply [flat|nested] 37+ messages in thread
* [U-Boot] [PATCH v2 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (10 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 4/6] x86: Add infrastructure to extract an e820 table from the coreboot tables Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
2011-12-03 11:18 ` [U-Boot] [PATCH v2 6/6] x86: Add support for specifying an initrd with the zboot command Gabe Black
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
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(-)
diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 3a68bb0..f03ea80 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -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);
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index ba3875b..83caf6b 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -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
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index b5597ec..0cbb571 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -89,21 +89,8 @@ static void build_command_line(char *command_line, int auto_boot)
printf("Kernel command line: \"%s\"\n", command_line);
}
-void *load_zimage(char *image, unsigned long kernel_size,
- unsigned long initrd_addr, unsigned long initrd_size,
- int auto_boot, void **load_address)
+static int kernel_magic_ok(struct setup_header *hdr)
{
- struct boot_params *setup_base;
- int setup_size;
- int bootproto;
- int big_image;
-
- struct boot_params *params = (struct boot_params *)image;
- struct setup_header *hdr = ¶ms->hdr;
-
- /* base address for real-mode segment */
- setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
-
if (KERNEL_MAGIC != hdr->boot_flag) {
printf("Error: Invalid Boot Flag "
"(found 0x%04x, expected 0x%04x)\n",
@@ -111,18 +98,38 @@ void *load_zimage(char *image, unsigned long kernel_size,
return 0;
} else {
printf("Valid Boot Flag\n");
+ return 1;
}
+}
- /* determine boot protocol version */
- if (KERNEL_V2_MAGIC == hdr->header) {
+static int get_boot_protocol(struct setup_header *hdr)
+{
+ if (hdr->header == KERNEL_V2_MAGIC) {
printf("Magic signature found\n");
-
- bootproto = hdr->version;
+ return hdr->version;
} else {
/* Very old kernel */
printf("Magic signature not found\n");
- bootproto = 0x0100;
+ return 0x0100;
}
+}
+
+struct boot_params *load_zimage(char *image, unsigned long kernel_size,
+ void **load_address)
+{
+ struct boot_params *setup_base;
+ int setup_size;
+ int bootproto;
+ int big_image;
+
+ struct boot_params *params = (struct boot_params *)image;
+ struct setup_header *hdr = ¶ms->hdr;
+
+ /* base address for real-mode segment */
+ setup_base = (struct boot_params *)DEFAULT_SETUP_BASE;
+
+ if (!kernel_magic_ok(hdr))
+ return 0;
/* determine size of setup */
if (0 == hdr->setup_sects) {
@@ -137,6 +144,23 @@ void *load_zimage(char *image, unsigned long kernel_size,
if (setup_size > SETUP_MAX_SIZE)
printf("Error: Setup is too large (%d bytes)\n", setup_size);
+ /* determine boot protocol version */
+ bootproto = get_boot_protocol(hdr);
+
+ printf("Using boot protocol version %x.%02x\n",
+ (bootproto & 0xff00) >> 8, bootproto & 0xff);
+
+ if (bootproto >= 0x0200) {
+ if (hdr->setup_sects >= 15) {
+ printf("Linux kernel version %s\n",
+ (char *)params +
+ hdr->kernel_version + 0x200);
+ } else {
+ printf("Setup Sectors < 15 - "
+ "Cannot print kernel version.\n");
+ }
+ }
+
/* Determine image type */
big_image = (bootproto >= 0x0200) &&
(hdr->loadflags & BIG_KERNEL_FLAG);
@@ -151,9 +175,6 @@ void *load_zimage(char *image, unsigned long kernel_size,
printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
memset(setup_base, 0, sizeof(*setup_base));
setup_base->hdr = params->hdr;
-
- setup_base->e820_entries = install_e820_map(
- ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
@@ -161,13 +182,12 @@ void *load_zimage(char *image, unsigned long kernel_size,
memmove(setup_base, image, setup_size);
#endif
- printf("Using boot protocol version %x.%02x\n",
- (bootproto & 0xff00) >> 8, bootproto & 0xff);
+ if (bootproto >= 0x0204)
+ kernel_size = hdr->syssize * 16;
+ else
+ kernel_size -= setup_size;
if (bootproto == 0x0100) {
- setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
-
/*
* A very old kernel MUST have its real-mode code
* loaded at 0x90000
@@ -190,21 +210,45 @@ void *load_zimage(char *image, unsigned long kernel_size,
SETUP_MAX_SIZE - setup_size);
}
- /* We are now setting up the real-mode version of the header */
- hdr = &setup_base->hdr;
+ if (big_image) {
+ if (kernel_size > BZIMAGE_MAX_SIZE) {
+ printf("Error: bzImage kernel too big! "
+ "(size: %ld, max: %d)\n",
+ kernel_size, BZIMAGE_MAX_SIZE);
+ return 0;
+ }
+ } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
+ printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
+ kernel_size, ZIMAGE_MAX_SIZE);
+ return 0;
+ }
+
+ printf("Loading %s at address %p (%ld bytes)\n",
+ big_image ? "bzImage" : "zImage", *load_address, kernel_size);
+
+ memmove(*load_address, image + setup_size, kernel_size);
+
+ return setup_base;
+}
+
+int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
+ unsigned long initrd_addr, unsigned long initrd_size)
+{
+ struct setup_header *hdr = &setup_base->hdr;
+ int bootproto = get_boot_protocol(hdr);
+
+#if defined CONFIG_ZBOOT_32
+ setup_base->e820_entries = install_e820_map(
+ ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
+#endif
+ if (bootproto == 0x0100) {
+ setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
+ setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ }
if (bootproto >= 0x0200) {
hdr->type_of_loader = 8;
- if (hdr->setup_sects >= 15) {
- printf("Linux kernel version %s\n",
- (char *)params +
- hdr->kernel_version + 0x200);
- } else {
- printf("Setup Sectors < 15 - "
- "Cannot print kernel version.\n");
- }
-
if (initrd_addr) {
printf("Initial RAM disk@linear address "
"0x%08lx, size %ld bytes\n",
@@ -221,44 +265,18 @@ void *load_zimage(char *image, unsigned long kernel_size,
}
if (bootproto >= 0x0202) {
- hdr->cmd_line_ptr =
- (uintptr_t)setup_base + COMMAND_LINE_OFFSET;
+ hdr->cmd_line_ptr = (uintptr_t)cmd_line;
} else if (bootproto >= 0x0200) {
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
- setup_base->screen_info.cl_offset = COMMAND_LINE_OFFSET;
+ setup_base->screen_info.cl_offset =
+ (uintptr_t)cmd_line - (uintptr_t)setup_base;
hdr->setup_move_size = 0x9100;
}
- if (bootproto >= 0x0204)
- kernel_size = hdr->syssize * 16;
- else
- kernel_size -= setup_size;
-
-
- if (big_image) {
- if ((kernel_size) > BZIMAGE_MAX_SIZE) {
- printf("Error: bzImage kernel too big! "
- "(size: %ld, max: %d)\n",
- kernel_size, BZIMAGE_MAX_SIZE);
- return 0;
- }
- } else if ((kernel_size) > ZIMAGE_MAX_SIZE) {
- printf("Error: zImage kernel too big! (size: %ld, max: %d)\n",
- kernel_size, ZIMAGE_MAX_SIZE);
- return 0;
- }
-
/* build command line at COMMAND_LINE_OFFSET */
- build_command_line((char *)setup_base + COMMAND_LINE_OFFSET, auto_boot);
-
- printf("Loading %czImage at address 0x%08x (%ld bytes)\n",
- big_image ? 'b' : ' ', (u32)*load_address, kernel_size);
-
- memmove(*load_address, image + setup_size, kernel_size);
-
- /* ready for booting */
- return setup_base;
+ build_command_line(cmd_line, auto_boot);
+ return 0;
}
void boot_zimage(void *setup_base, void *load_address)
@@ -298,7 +316,7 @@ void boot_zimage(void *setup_base, void *load_address)
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
- void *base_ptr;
+ struct boot_params *base_ptr;
void *bzImage_addr = NULL;
void *load_address;
char *s;
@@ -324,20 +342,25 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
bzImage_size = simple_strtoul(argv[2], NULL, 16);
/* Lets look for */
- base_ptr = load_zimage(bzImage_addr, bzImage_size, 0, 0, 0,
- &load_address);
+ base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);
if (!base_ptr) {
printf("## Kernel loading failed ...\n");
- } else {
- printf("## Transferring control to Linux "
- "(at address %08x) ...\n",
- (u32)base_ptr);
-
- /* we assume that the kernel is in place */
- boot_zimage(base_ptr, load_address);
- /* does not return */
+ return -1;
}
+ if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
+ 0, 0, 0)) {
+ printf("Setting up boot parameters failed ...\n");
+ return -1;
+ }
+
+ printf("## Transferring control to Linux "
+ "(at address %08x) ...\n",
+ (u32)base_ptr);
+
+ /* we assume that the kernel is in place */
+ boot_zimage(base_ptr, load_address);
+ /* does not return */
return -1;
}
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread* [U-Boot] [PATCH v2 6/6] x86: Add support for specifying an initrd with the zboot command
2011-11-30 9:17 [U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command Gabe Black
` (11 preceding siblings ...)
2011-12-03 11:18 ` [U-Boot] [PATCH v2 5/6] x86: Refactor the zboot innards so they can be reused with a vboot image Gabe Black
@ 2011-12-03 11:18 ` Gabe Black
12 siblings, 0 replies; 37+ messages in thread
From: Gabe Black @ 2011-12-03 11:18 UTC (permalink / raw)
To: u-boot
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.
Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
Changes in v2:
- Add a help message to the zboot command.
arch/x86/lib/zimage.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 0cbb571..bb40517 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -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"
);
--
1.7.3.1
^ permalink raw reply related [flat|nested] 37+ messages in thread