Hi,

I cleaned up the structures used for Linux booting in FILO, to match
what Linux uses these days and moved the structure definitions to a
separate (include) file.
Also fill in 16MB alignment to fix 2.6.31.. untested...

Best regards,
Stefan

Signed-off-by: Stefan Reinauer <ste...@coresystems.de>

Index: i386/linux_load.c
===================================================================
--- i386/linux_load.c   (revision 131)
+++ i386/linux_load.c   (working copy)
@@ -21,7 +21,6 @@
  *
  * Based on work by Steve Gehlbach.
  * Portions are taken from mkelfImage.
- *
  * 2003-09 by SONE Takeshi
  */
 
@@ -36,145 +35,12 @@
 #define DEBUG_THIS CONFIG_DEBUG_LINUXLOAD
 #include <debug.h>
 
-#define LINUX_PARAM_LOC 0x90000
-#define COMMAND_LINE_LOC 0x91000
-#define GDT_LOC 0x92000
-#define STACK_LOC 0x93000
+#include "linux_load.h"
 
-#define E820MAX        32              /* number of entries in E820MAP */
-struct e820entry {
-       unsigned long long addr;        /* start of memory segment */
-       unsigned long long size;        /* size of memory segment */
-       unsigned long type;     /* type of memory segment */
-#define E820_RAM       1
-#define E820_RESERVED  2
-#define E820_ACPI      3       /* usable as RAM once ACPI tables have been 
read */
-#define E820_NVS       4
-};
-
-/* The header of Linux/i386 kernel */
-struct linux_header {
-       u8 reserved1[0x1f1];    /* 0x000 */
-       u8 setup_sects;         /* 0x1f1 */
-       u16 root_flags;         /* 0x1f2 */
-       u8 reserved2[6];        /* 0x1f4 */
-       u16 vid_mode;           /* 0x1fa */
-       u16 root_dev;           /* 0x1fc */
-       u16 boot_sector_magic;  /* 0x1fe */
-       /* 2.00+ */
-       u8 reserved3[2];        /* 0x200 */
-       u8 header_magic[4];     /* 0x202 */
-       u16 protocol_version;   /* 0x206 */
-       u32 realmode_swtch;     /* 0x208 */
-       u16 start_sys;          /* 0x20c */
-       u16 kver_addr;          /* 0x20e */
-       u8 type_of_loader;      /* 0x210 */
-       u8 loadflags;           /* 0x211 */
-       u16 setup_move_size;    /* 0x212 */
-       u32 code32_start;       /* 0x214 */
-       u32 ramdisk_image;      /* 0x218 */
-       u32 ramdisk_size;       /* 0x21c */
-       u8 reserved4[4];        /* 0x220 */
-       /* 2.01+ */
-       u16 heap_end_ptr;       /* 0x224 */
-       u8 reserved5[2];        /* 0x226 */
-       /* 2.02+ */
-       u32 cmd_line_ptr;       /* 0x228 */
-       /* 2.03+ */
-       u32 initrd_addr_max;    /* 0x22c */
-} __attribute__ ((packed));
-
-/* Paramters passed to 32-bit part of Linux
- * This is another view of the structure above.. */
-struct linux_params {
-       u8 orig_x;              /* 0x00 */
-       u8 orig_y;              /* 0x01 */
-       u16 ext_mem_k;          /* 0x02 -- EXT_MEM_K sits here */
-       u16 orig_video_page;    /* 0x04 */
-       u8 orig_video_mode;     /* 0x06 */
-       u8 orig_video_cols;     /* 0x07 */
-       u16 unused2;            /* 0x08 */
-       u16 orig_video_ega_bx;  /* 0x0a */
-       u16 unused3;            /* 0x0c */
-       u8 orig_video_lines;    /* 0x0e */
-       u8 orig_video_isVGA;    /* 0x0f */
-       u16 orig_video_points;  /* 0x10 */
-
-       /* VESA graphic mode -- linear frame buffer */
-       u16 lfb_width;          /* 0x12 */
-       u16 lfb_height;         /* 0x14 */
-       u16 lfb_depth;          /* 0x16 */
-       u32 lfb_base;           /* 0x18 */
-       u32 lfb_size;           /* 0x1c */
-       u16 cl_magic;           /* 0x20 */
-#define CL_MAGIC_VALUE 0xA33F
-       u16 cl_offset;          /* 0x22 */
-       u16 lfb_linelength;     /* 0x24 */
-       u8 red_size;            /* 0x26 */
-       u8 red_pos;             /* 0x27 */
-       u8 green_size;          /* 0x28 */
-       u8 green_pos;           /* 0x29 */
-       u8 blue_size;           /* 0x2a */
-       u8 blue_pos;            /* 0x2b */
-       u8 rsvd_size;           /* 0x2c */
-       u8 rsvd_pos;            /* 0x2d */
-       u16 vesapm_seg;         /* 0x2e */
-       u16 vesapm_off;         /* 0x30 */
-       u16 pages;              /* 0x32 */
-       u8 reserved4[12];       /* 0x34 -- 0x3f reserved for future expansion */
-
-       //struct apm_bios_info apm_bios_info;   /* 0x40 */
-       u8 apm_bios_info[0x40];
-       //struct drive_info_struct drive_info;  /* 0x80 */
-       u8 drive_info[0x20];
-       //struct sys_desc_table sys_desc_table; /* 0xa0 */
-       u8 sys_desc_table[0x140];
-       u32 alt_mem_k;          /* 0x1e0 */
-       u8 reserved5[4];        /* 0x1e4 */
-       u8 e820_map_nr;         /* 0x1e8 */
-       u8 reserved6[9];        /* 0x1e9 */
-       u16 mount_root_rdonly;  /* 0x1f2 */
-       u8 reserved7[4];        /* 0x1f4 */
-       u16 ramdisk_flags;      /* 0x1f8 */
-#define RAMDISK_IMAGE_START_MASK       0x07FF
-#define RAMDISK_PROMPT_FLAG            0x8000
-#define RAMDISK_LOAD_FLAG              0x4000
-       u8 reserved8[2];        /* 0x1fa */
-       u16 orig_root_dev;      /* 0x1fc */
-       u8 reserved9[1];        /* 0x1fe */
-       u8 aux_device_info;     /* 0x1ff */
-       u8 reserved10[2];       /* 0x200 */
-       u8 param_block_signature[4];    /* 0x202 */
-       u16 param_block_version;        /* 0x206 */
-       u8 reserved11[8];       /* 0x208 */
-       u8 loader_type;         /* 0x210 */
-#define LOADER_TYPE_LOADLIN         1
-#define LOADER_TYPE_BOOTSECT_LOADER 2
-#define LOADER_TYPE_SYSLINUX        3
-#define LOADER_TYPE_ETHERBOOT       4
-#define LOADER_TYPE_KERNEL          5
-       u8 loader_flags;        /* 0x211 */
-       u8 reserved12[2];       /* 0x212 */
-       u32 kernel_start;       /* 0x214 */
-       u32 initrd_start;       /* 0x218 */
-       u32 initrd_size;        /* 0x21c */
-       u8 reserved12_5[8];     /* 0x220 */
-       u32 cmd_line_ptr;       /* 0x228 */
-       u8 reserved13[164];     /* 0x22c */
-       struct e820entry e820_map[E820MAX];     /* 0x2d0 */
-       u8 reserved16[688];     /* 0x550 */
-#define COMMAND_LINE_SIZE 256
-       /* Command line is copied here by 32-bit i386/kernel/head.S.
-        * So I will follow the boot protocol, rather than putting it
-        * directly here. --ts1 */
-       u8 command_line[COMMAND_LINE_SIZE];     /* 0x800 */
-       u8 reserved17[1792];    /* 0x900 - 0x1000 */
-};
-
 u64 forced_memsize;
 
 /* Load the first part the file and check if it's Linux */
-static u32 load_linux_header(struct linux_header *hdr)
+static u32 load_linux_header(struct linux_params *hdr)
 {
        int load_high;
        u32 kern_addr;
@@ -184,16 +50,16 @@
                return 0;
        }
 
-       if (hdr->boot_sector_magic != 0xaa55) {
+       if (hdr->hdr.boot_flag != 0xaa55) {
                printf("Not a Linux kernel image\n");
                return 0;
        }
 
        /* Linux is found. Print some information */
-       if (memcmp(hdr->header_magic, "HdrS", 4) != 0) {
+       if (memcmp(hdr->hdr.header, "HdrS", 4) != 0) {
                /* This may be floppy disk image or something.
                 * Perform a simple (incomplete) sanity check. */
-               if (hdr->setup_sects >= 16 || file_size() - (hdr->setup_sects 
<< 9) >= 512 << 10) {
+               if (hdr->hdr.setup_sects >= 16 || file_size() - 
(hdr->hdr.setup_sects << 9) >= 512 << 10) {
                        printf("This looks like a bootdisk image but not like 
Linux...\n");
                        return 0;
                }
@@ -201,14 +67,14 @@
                printf("Possible very old Linux");
                /* This kernel does not even have a protocol version.
                 * Force the value. */
-               hdr->protocol_version = 0;      /* pre-2.00 */
+               hdr->hdr.version = 0;   /* pre-2.00 */
        } else {
                printf("Found Linux");
        }
 
-       if (hdr->protocol_version >= 0x200 && hdr->kver_addr) {
+       if (hdr->hdr.version >= 0x200 && hdr->hdr.kernel_version) {
                char kver[256];
-               file_seek(hdr->kver_addr + 0x200);
+               file_seek(hdr->hdr.kernel_version + 0x200);
                if (file_read(kver, sizeof kver) != 0) {
                        kver[255] = 0;
                        printf(" version %s", kver);
@@ -217,9 +83,9 @@
        debug(" (protocol %#x)", hdr->protocol_version);
 
        load_high = 0;
-       if (hdr->protocol_version >= 0x200) {
-               debug(" (loadflags %#x)", hdr->loadflags);
-               load_high = hdr->loadflags & 1;
+       if (hdr->hdr.version >= 0x200) {
+               debug(" (loadflags %#x)", hdr->hdr.loadflags);
+               load_high = hdr->hdr.loadflags & 1;
        }
        if (load_high) {
                printf(" bzImage");
@@ -236,27 +102,30 @@
 
 /* Set up parameters for 32-bit kernel */
 static void
-init_linux_params(struct linux_params *params, struct linux_header *hdr)
+init_linux_params(struct linux_params *params, struct linux_params *hdr)
 {
        debug("Setting up paramters at %#lx\n", virt_to_phys(params));
        memset(params, 0, sizeof *params);
 
        /* Copy some useful values from header */
-       params->mount_root_rdonly = hdr->root_flags;
-       params->orig_root_dev = hdr->root_dev;
+       params->hdr.root_flags = hdr->hdr.root_flags;
+       params->hdr.root_dev = hdr->hdr.root_dev;
 
        /* Video parameters.
         * This assumes we have VGA in standard 80x25 text mode,
         * just like our vga.c does.
         * Cursor position is filled later to allow some more printf's.
         */
-       params->orig_video_mode = 3;
-       params->orig_video_cols = 80;
-       params->orig_video_lines = 25;
-       params->orig_video_isVGA = 1;
-       params->orig_video_points = 16;
+       params->screen_info.orig_video_mode = 3;
+       params->screen_info.orig_video_cols = 80;
+       params->screen_info.orig_video_lines = 25;
+       params->screen_info.orig_video_isVGA = 1;
+       params->screen_info.orig_video_points = 16;
 
-       params->loader_type = 0xff;     /* Unregistered Linux loader */
+       params->hdr.loader_type = 0xff; /* Unregistered Linux loader */
+
+       /* Set it to 16M instead of 4G */
+       params->hdr.kernel_alignment = 16*1024*1024;
 }
 
 /* Memory map */
@@ -280,7 +149,7 @@
                        debug("%016Lx - %016Lx (%d)\n", linux_map->addr,
                              linux_map->addr + linux_map->size,
                              linux_map->type);
-                       params->e820_map_nr = i + 1;
+                       params->e820_entries = i + 1;
                }
 
                /* Find out top of RAM. XXX This ignores hole above 1MB */
@@ -296,37 +165,39 @@
        params->alt_mem_k = (ramtop - (1 << 20)) >> 10;
        /* old style, 64MB max */
        if (ramtop >= (64 << 20))
-               params->ext_mem_k = (63 << 10);
+               params->screen_info.ext_mem_k = (63 << 10);
        else
-               params->ext_mem_k = params->alt_mem_k;
-       debug("ext_mem_k=%d, alt_mem_k=%d\n", params->ext_mem_k,
-             params->alt_mem_k);
+               params->screen_info.ext_mem_k = params->alt_mem_k;
+       debug("ext_mem_k=%d, alt_mem_k=%d\n", params->screen_info.ext_mem_k,
+             params->screen_info.alt_mem_k);
 }
 
 /* Video mode */
 static void set_video_mode(struct linux_params *params)
 {
 #if CONFIG_COREBOOT_VIDEO_CONSOLE
+       struct screen_info *screen_info = &params->screen_info;
+
        /* Are we running on a framebuffer console? */
        if (!lib_sysinfo.framebuffer)
                return;
 
-       params->lfb_width = lib_sysinfo.framebuffer->x_resolution;
-       params->lfb_height = lib_sysinfo.framebuffer->y_resolution;
-       params->lfb_depth = lib_sysinfo.framebuffer->bits_per_pixel;
-       params->lfb_linelength = lib_sysinfo.framebuffer->bytes_per_line;
-       params->lfb_base = lib_sysinfo.framebuffer->physical_address;
+       screen_info->lfb_width = lib_sysinfo.framebuffer->x_resolution;
+       screen_info->lfb_height = lib_sysinfo.framebuffer->y_resolution;
+       screen_info->lfb_depth = lib_sysinfo.framebuffer->bits_per_pixel;
+       screen_info->lfb_linelength = lib_sysinfo.framebuffer->bytes_per_line;
+       screen_info->lfb_base = lib_sysinfo.framebuffer->physical_address;
        // prolly not enough for the boot splash?!
-       params->lfb_size =
-           (params->lfb_linelength * params->lfb_height + 65535) >> 16;
-       params->red_size = lib_sysinfo.framebuffer->red_mask_size;
-       params->red_pos = lib_sysinfo.framebuffer->red_mask_pos;
-       params->green_size = lib_sysinfo.framebuffer->green_mask_size;
-       params->green_pos = lib_sysinfo.framebuffer->green_mask_pos;
-       params->blue_size = lib_sysinfo.framebuffer->blue_mask_size;
-       params->blue_pos = lib_sysinfo.framebuffer->blue_mask_pos;
-       params->rsvd_size = lib_sysinfo.framebuffer->reserved_mask_size;
-       params->rsvd_pos = lib_sysinfo.framebuffer->reserved_mask_pos;
+       screen_info->lfb_size =
+           (screen_info->lfb_linelength * screen_info->lfb_height + 65535) >> 
16;
+       screen_info->red_size = lib_sysinfo.framebuffer->red_mask_size;
+       screen_info->red_pos = lib_sysinfo.framebuffer->red_mask_pos;
+       screen_info->green_size = lib_sysinfo.framebuffer->green_mask_size;
+       screen_info->green_pos = lib_sysinfo.framebuffer->green_mask_pos;
+       screen_info->blue_size = lib_sysinfo.framebuffer->blue_mask_size;
+       screen_info->blue_pos = lib_sysinfo.framebuffer->blue_mask_pos;
+       screen_info->rsvd_size = lib_sysinfo.framebuffer->reserved_mask_size;
+       screen_info->rsvd_pos = lib_sysinfo.framebuffer->reserved_mask_pos;
 #endif
 }
 
@@ -455,26 +326,26 @@
 
 /* Set command line location */
 static void set_command_line_loc(struct linux_params *params,
-                                struct linux_header *hdr)
+                                struct linux_params *hdr)
 {
-       if (hdr->protocol_version >= 0x202) {
+       if (hdr->hdr.version >= 0x202) {
                /* new style */
-               params->cmd_line_ptr = COMMAND_LINE_LOC;
+               params->hdr.cmd_line_ptr = COMMAND_LINE_LOC;
        } else {
                /* old style */
-               params->cl_magic = CL_MAGIC_VALUE;
-               params->cl_offset = COMMAND_LINE_LOC - LINUX_PARAM_LOC;
+               params->screen_info.cl_magic = CL_MAGIC_VALUE;
+               params->screen_info.cl_offset = COMMAND_LINE_LOC - 
LINUX_PARAM_LOC;
        }
 }
 
 /* Load 32-bit part of kernel */
-static int load_linux_kernel(struct linux_header *hdr, u32 kern_addr)
+static int load_linux_kernel(struct linux_params *hdr, u32 kern_addr)
 {
        u32 kern_offset, kern_size;
 
-       if (hdr->setup_sects == 0)
-               hdr->setup_sects = 4;
-       kern_offset = (hdr->setup_sects + 1) * 512;
+       if (hdr->hdr.setup_sects == 0)
+               hdr->hdr.setup_sects = 4;
+       kern_offset = (hdr->hdr.setup_sects + 1) * 512;
        file_seek(kern_offset);
        kern_size = file_size() - kern_offset;
        debug("offset=%#x addr=%#x size=%#x\n", kern_offset, kern_addr,
@@ -496,7 +367,7 @@
        return kern_size;
 }
 
-static int load_initrd(struct linux_header *hdr,
+static int load_initrd(struct linux_params *hdr,
                       u32 kern_end, struct linux_params *params,
                       const char *initrd_file)
 {
@@ -522,8 +393,8 @@
 
        /* Find out the kernel's restriction on how high the initrd can be
         * placed */
-       if (hdr->protocol_version >= 0x203)
-               max = hdr->initrd_addr_max;
+       if (hdr->hdr.version >= 0x203)
+               max = hdr->hdr.ramdisk_max;
        else
                max = 0x38000000;       /* Hardcoded value for older kernels */
 
@@ -586,8 +457,8 @@
        }
        printf("ok\n");
 
-       params->initrd_start = start;
-       params->initrd_size = size;
+       params->hdr.ramdisk_start = start;
+       params->hdr.ramdisk_size = size;
 
        return 0;
 }
@@ -680,8 +551,8 @@
        /* Update VGA cursor position.
         * This must be here because the printf changes the value! */
        video_console_get_cursor(&cursor_x, &cursor_y, &cursor_en);
-       params->orig_x = cursor_x;
-       params->orig_y = cursor_y;
+       params->screen_info.orig_x = cursor_x;
+       params->screen_info.orig_y = cursor_y;
 #endif
 
 #ifdef CONFIG_PCMCIA_CF
@@ -701,7 +572,7 @@
 
 int linux_load(const char *file, const char *cmdline)
 {
-       struct linux_header hdr;
+       static struct linux_params hdr;
        struct linux_params *params;
        u32 kern_addr, kern_size;
        char *initrd_file = 0;
Index: i386/linux_load.h
===================================================================
--- i386/linux_load.h   (revision 0)
+++ i386/linux_load.h   (revision 0)
@@ -0,0 +1,213 @@
+/*
+ * This file is part of FILO.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#include <libpayload.h>
+
+#define COMMAND_LINE_SIZE 256
+
+#define LINUX_PARAM_LOC  0x90000
+#define COMMAND_LINE_LOC 0x91000
+#define GDT_LOC                 0x92000
+#define STACK_LOC       0x93000
+
+#define EDD_MBR_SIG_MAX        16      
+#define E820MAX                128     /* number of entries in E820MAP */
+struct e820entry {
+       u64 addr;       /* start of memory segment */
+       u64 size;       /* size of memory segment */
+       u32 type;       /* type of memory segment */
+#define E820_RAM       1
+#define E820_RESERVED  2
+#define E820_ACPI      3       /* usable as RAM once ACPI tables have been 
read */
+#define E820_NVS       4
+#define E820_UNUSABLE  5
+};
+
+struct screen_info {
+       u8  orig_x;                     /* 0x00 */
+       u8  orig_y;                     /* 0x01 */
+       u16 ext_mem_k;                  /* 0x02 */
+       u16 orig_video_page;            /* 0x04 */
+       u8  orig_video_mode;            /* 0x06 */
+       u8  orig_video_cols;            /* 0x07 */
+       u16 unused2;                    /* 0x08 */
+       u16 orig_video_ega_bx;          /* 0x0a */
+       u16 unused3;                    /* 0x0c */
+       u8  orig_video_lines;           /* 0x0e */
+       u8  orig_video_isVGA;           /* 0x0f */
+       u16 orig_video_points;          /* 0x10 */
+
+       /* VESA graphic mode -- linear frame buffer */
+       u16 lfb_width;                  /* 0x12 */
+       u16 lfb_height;                 /* 0x14 */
+       u16 lfb_depth;                  /* 0x16 */
+       u32 lfb_base;                   /* 0x18 */
+       u32 lfb_size;                   /* 0x1c */
+       u16 cl_magic;                   /* 0x20 */
+#define CL_MAGIC_VALUE 0xA33F
+       u16 cl_offset;                  /* 0x22 */
+       u16 lfb_linelength;             /* 0x24 */
+       u8  red_size;                   /* 0x26 */
+       u8  red_pos;                    /* 0x27 */
+       u8  green_size;                 /* 0x28 */
+       u8  green_pos;                  /* 0x29 */
+       u8  blue_size;                  /* 0x2a */
+       u8  blue_pos;                   /* 0x2b */
+       u8  rsvd_size;                  /* 0x2c */
+       u8  rsvd_pos;                   /* 0x2d */
+       u16 vesapm_seg;                 /* 0x2e */
+       u16 vesapm_off;                 /* 0x30 */
+       u16 pages;                      /* 0x32 */
+       u16 vesa_attributes;            /* 0x34 */
+       u32 capabilities;               /* 0x36 */
+       u8  reserved[6];                /* 0x3a -- 0x3f reserved for future 
expansion */
+} __attribute__((packed));
+
+struct apm_bios_info {
+       u8  reserved[0x14];
+} __attribute__((packed));
+
+struct ist_info {
+       u8  reserved[0x10];
+} __attribute__((packed));
+
+struct sys_desc_table {
+       u16 length;
+       u8  reserved[14];
+} __attribute__((packed));
+
+struct edid_info {
+       u8  reserved[0x1c0 - 0x140];
+} __attribute__((packed));
+
+struct efi_info {
+       u32 efi_loader_signature;
+       u32 efi_systab;
+       u32 efi_memdesc_size;
+       u32 efi_memdesc_version;
+       u32 efi_memmap;
+       u32 efi_memmap_size;
+       u32 efi_systab_hi;
+       u32 efi_memmap_hi;
+} __attribute__((packed));
+
+struct edd_device_params {
+       u8 reserved[74];
+} __attribute__((packed));
+
+#define EDDMAXNR 6
+struct edd_info {
+       u8  device;
+       u8  version;
+       u16 interface_support;
+       u16 legacy_max_cylinder;
+       u8  legacy_max_head;
+       u8  legacy_sectors_per_track;
+       struct edd_device_params params;
+} __attribute__((packed));
+
+struct setup_header {
+       /* Documentation/x86/boot.txt starts here */
+       u8  setup_sects;                /* 0x1f1 */
+       u16 root_flags;                 /* 0x1f2 */
+       u32 syssize;                    /* 0x1f4 */
+       u16 ram_size;                   /* 0x1f8 */
+#define RAMDISK_IMAGE_START_MASK       0x07FF
+#define RAMDISK_PROMPT_FLAG            0x8000
+#define RAMDISK_LOAD_FLAG              0x4000
+       u16 vid_mode;                   /* 0x1fa */
+       u16 root_dev;                   /* 0x1fc */
+       u16 boot_flag;                  /* 0x1fe */
+       u16 jump;                       /* 0x200 */
+       u8  header[4];                  /* 0x202 */
+       u16 version;                    /* 0x206 */
+       u32 realmode_swtch;             /* 0x208 */
+       u16 start_sys_seg;              /* 0x20c */
+       u16 kernel_version;             /* 0x20e */
+       u8  loader_type;                /* 0x210 */
+#define LOADER_TYPE_LOADLIN            0x1
+#define LOADER_TYPE_BOOTSECT_LOADER    0x2
+#define LOADER_TYPE_SYSLINUX           0x3
+#define LOADER_TYPE_ETHERBOOT          0x4
+#define LOADER_TYPE_KERNEL             0x5
+       u8  loadflags;                  /* 0x211 */
+#define LOADED_HIGH                    (1 << 0)
+#define QUIET_FLAG                     (1 << 5)
+#define KEEP_SEGMENTS                  (1 << 6)
+#define CAN_USE_HEAP                   (1 << 7)
+       u16 setup_move_size;            /* 0x212 */
+       u32 code32_start;               /* 0x214 */
+       u32 ramdisk_start;              /* 0x218 */
+       u32 ramdisk_size;               /* 0x21c */
+       u32 bootsect_kludge;            /* 0x220 */
+       /* 2.01+ */
+       u16 heap_end_ptr;               /* 0x224 */
+       /* 2.02+ */
+       u8  ext_loader_ver;             /* 0x226 */
+       u8  ext_loader_type;            /* 0x227 */
+       u32 cmd_line_ptr;               /* 0x228 */
+       /* 2.03+ */
+       u32 ramdisk_max;                /* 0x22c */
+       /* 2.05+ */
+       u32 kernel_alignment;           /* 0x230 */
+       u8  relocatable_kernel;         /* 0x234 */
+       /* 2.10+ */
+       u8 min_alignment;               /* 0x235 */
+       u8 reserved[2];                 /* 0x236 */
+       /* 2.06+ */
+       u32 cmdlinux_size;              /* 0x238 */
+       /* 2.07+ */
+       u32 hardware_subarch;           /* 0x23c */
+       u64  hardware_subarch_data;     /* 0x240 */
+       /* 2.08+ */
+       u32 payload_offset;             /* 0x248 */
+       u32 payload_length;             /* 0x24c */
+       /* 2.09+ */
+       u64 setup_data;                 /* 0x250 */
+       /* 2.10+ */
+       u64 pref_address;               /* 0x258 */
+       u32 init_size;                  /* 0x260 */
+} __attribute__((packed));
+
+/* Paramters passed to 32-bit part of Linux */
+struct linux_params {
+       struct screen_info screen_info;         /* 0x000 */
+       struct apm_bios_info apm_bios_info;     /* 0x040 */
+       u8  reserved1[0x60 - 0x54];
+       struct ist_info ist_info;               /* 0x060 */
+       u8  reserved2[0x80 - 0x70];
+       u8  hd0_info[0x10];                     /* 0x080 */
+       u8  hd1_info[0x10];                     /* 0x090 */
+       struct sys_desc_table sys_desc_table;   /* 0x0a0 */
+       u8  reserved3[0x140 - 0xb0];
+       struct edid_info edid_info;             /* 0x140 */
+       struct efi_info efi_info;               /* 0x1c0 */
+       u32 alt_mem_k;                          /* 0x1e0 */
+       u32 scratch;                            /* 0x1e4 */
+       u8  e820_entries;                       /* 0x1e8 */
+       u8  eddbuf_entries;                     /* 0x1e9 */
+       u8  edd_mbr_sig_buf_entries;            /* 0x1ea */
+       u8  reserved4[0x1f1-0x1eb];
+       struct setup_header hdr;                /* 0x1f1 */
+       u8  reserved5[0x290-0x1f1-sizeof(struct setup_header)];
+       u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];/* 0x290 */
+       struct e820entry e820_map[E820MAX];     /* 0x2d0 */
+       u8  reserved7[0xd00 - 0xcd0];
+       struct edd_info eddbuf[EDDMAXNR];       /* 0xd00 */
+       u8  reserved8[0x1000 - 0xeec];
+} __attribute__((packed));
+
-- 
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to