grub_mmap_iterate (count_hook, &count);
- mmap_size = count * sizeof (struct grub_e820_mmap);
+ mmap_size = count * sizeof (struct grub_boot_e820_entry);
/* Increase the size a bit for safety, because GRUB allocates more on
later. */
}
static grub_err_t
-grub_e820_add_region (struct grub_e820_mmap *e820_map, int *e820_num,
+grub_e820_add_region (struct grub_boot_e820_entry *e820_entry, int *e820_num,
grub_uint64_t start, grub_uint64_t size,
grub_uint32_t type)
{
int n = *e820_num;
- if ((n > 0) && (e820_map[n - 1].addr + e820_map[n - 1].size == start) &&
- (e820_map[n - 1].type == type))
- e820_map[n - 1].size += size;
+ if ((n > 0) && (e820_entry[n - 1].addr + e820_entry[n - 1].size == start) &&
+ (e820_entry[n - 1].type == type))
+ e820_entry[n - 1].size += size;
else
{
- e820_map[n].addr = start;
- e820_map[n].size = size;
- e820_map[n].type = type;
+ e820_entry[n].addr = start;
+ e820_entry[n].size = size;
+ e820_entry[n].type = type;
(*e820_num)++;
}
return GRUB_ERR_NONE;
return 1;
}
- params->lfb_width = mode_info.width;
- params->lfb_height = mode_info.height;
- params->lfb_depth = mode_info.bpp;
- params->lfb_line_len = mode_info.pitch;
+ params->screen_info.lfb_width = mode_info.width;
+ params->screen_info.lfb_height = mode_info.height;
+ params->screen_info.lfb_depth = mode_info.bpp;
+ params->screen_info.lfb_linelength = mode_info.pitch;
- params->lfb_base = (grub_size_t) framebuffer;
+ params->screen_info.lfb_base = (grub_size_t) framebuffer;
#if defined (GRUB_MACHINE_EFI) && defined (__x86_64__)
- params->ext_lfb_base = (grub_size_t) (((grub_uint64_t)(grub_size_t) framebuffer) >> 32);
- params->capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
+ params->screen_info.ext_lfb_base = (grub_size_t) (((grub_uint64_t)(grub_size_t) framebuffer) >> 32);
+ params->screen_info.capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
#endif
- params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height, 65536);
+ params->screen_info.lfb_size = ALIGN_UP (params->screen_info.lfb_linelength * params->screen_info.lfb_height, 65536);
- params->red_mask_size = mode_info.red_mask_size;
- params->red_field_pos = mode_info.red_field_pos;
- params->green_mask_size = mode_info.green_mask_size;
- params->green_field_pos = mode_info.green_field_pos;
- params->blue_mask_size = mode_info.blue_mask_size;
- params->blue_field_pos = mode_info.blue_field_pos;
- params->reserved_mask_size = mode_info.reserved_mask_size;
- params->reserved_field_pos = mode_info.reserved_field_pos;
+ params->screen_info.red_size = mode_info.red_mask_size;
+ params->screen_info.red_pos = mode_info.red_field_pos;
+ params->screen_info.green_size = mode_info.green_mask_size;
+ params->screen_info.green_pos = mode_info.green_field_pos;
+ params->screen_info.blue_size = mode_info.blue_mask_size;
+ params->screen_info.blue_pos = mode_info.blue_field_pos;
+ params->screen_info.rsvd_size = mode_info.reserved_mask_size;
+ params->screen_info.rsvd_pos = mode_info.reserved_field_pos;
if (gfxlfbvar && (gfxlfbvar[0] == '1' || gfxlfbvar[0] == 'y'))
- params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
+ params->screen_info.orig_video_isVGA = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
else
{
switch (driver_id)
{
case GRUB_VIDEO_DRIVER_VBE:
- params->lfb_size >>= 16;
- params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
+ params->screen_info.lfb_size >>= 16;
+ params->screen_info.orig_video_isVGA = GRUB_VIDEO_LINUX_TYPE_VESA;
break;
case GRUB_VIDEO_DRIVER_EFI_UGA:
case GRUB_VIDEO_DRIVER_EFI_GOP:
- params->have_vga = GRUB_VIDEO_LINUX_TYPE_EFIFB;
+ params->screen_info.orig_video_isVGA = GRUB_VIDEO_LINUX_TYPE_EFIFB;
break;
/* FIXME: check if better id is available. */
case GRUB_VIDEO_DRIVER_SDL:
case GRUB_VIDEO_DRIVER_NONE:
case GRUB_VIDEO_ADAPTER_CAPTURE:
- params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
+ params->screen_info.orig_video_isVGA = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
break;
}
}
/* 6 is default after mode reset. */
width = 6;
- params->red_mask_size = params->green_mask_size
- = params->blue_mask_size = width;
- params->reserved_mask_size = 0;
+ params->screen_info.red_size = params->screen_info.green_size
+ = params->screen_info.blue_size = width;
+ params->screen_info.rsvd_size = 0;
}
#endif
{
struct grub_linux_boot_ctx *ctx = data;
- if (grub_e820_add_region (ctx->params->e820_map, &ctx->e820_num,
+ if (grub_e820_add_region (ctx->params->e820_table, &ctx->e820_num,
addr, size, type))
return 1;
"bootpath", bootpath,
grub_strlen (bootpath) + 1,
&len);
- linux_params.ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
- linux_params.ofw_num_items = 1;
- linux_params.ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
- linux_params.ofw_idt = 0;
+ linux_params.olpc_ofw_header.ofw_magic = GRUB_LINUX_OFW_SIGNATURE;
+ linux_params.olpc_ofw_header.ofw_version = 1;
+ linux_params.olpc_ofw_header.cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
+ linux_params.olpc_ofw_header.irq_desc_table = 0;
}
#endif
if (grub_linux_setup_video (&linux_params))
{
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
- linux_params.have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
- linux_params.video_mode = 0x3;
+ linux_params.screen_info.orig_video_isVGA = GRUB_VIDEO_LINUX_TYPE_TEXT;
+ linux_params.screen_info.orig_video_mode = 0x3;
#else
- linux_params.have_vga = 0;
- linux_params.video_mode = 0;
- linux_params.video_width = 0;
- linux_params.video_height = 0;
+ linux_params.screen_info.orig_video_isVGA = 0;
+ linux_params.screen_info.orig_video_mode = 0;
+ linux_params.screen_info.orig_video_cols = 0;
+ linux_params.screen_info.orig_video_lines = 0;
#endif
}
#ifndef GRUB_MACHINE_IEEE1275
- if (linux_params.have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT)
+ if (linux_params.screen_info.orig_video_isVGA == GRUB_VIDEO_LINUX_TYPE_TEXT)
#endif
{
grub_term_output_t term;
|| grub_strcmp (term->name, "ofconsole") == 0)
{
struct grub_term_coordinate pos = grub_term_getxy (term);
- linux_params.video_cursor_x = pos.x;
- linux_params.video_cursor_y = pos.y;
- linux_params.video_width = grub_term_width (term);
- linux_params.video_height = grub_term_height (term);
+ linux_params.screen_info.orig_x = pos.x;
+ linux_params.screen_info.orig_y = pos.y;
+ linux_params.screen_info.orig_video_cols = grub_term_width (term);
+ linux_params.screen_info.orig_video_lines = grub_term_height (term);
found = 1;
break;
}
if (!found)
{
- linux_params.video_cursor_x = 0;
- linux_params.video_cursor_y = 0;
- linux_params.video_width = 80;
- linux_params.video_height = 25;
+ linux_params.screen_info.orig_x = 0;
+ linux_params.screen_info.orig_y = 0;
+ linux_params.screen_info.orig_video_cols = 80;
+ linux_params.screen_info.orig_video_lines = 25;
}
}
mmap_size = find_mmap_size ();
/* Make sure that each size is aligned to a page boundary. */
cl_offset = ALIGN_UP (mmap_size + sizeof (linux_params), 4096);
- if (cl_offset < ((grub_size_t) linux_params.setup_sects << GRUB_DISK_SECTOR_BITS))
- cl_offset = ALIGN_UP ((grub_size_t) (linux_params.setup_sects
+ if (cl_offset < ((grub_size_t) linux_params.hdr.setup_sects << GRUB_DISK_SECTOR_BITS))
+ cl_offset = ALIGN_UP ((grub_size_t) (linux_params.hdr.setup_sects
<< GRUB_DISK_SECTOR_BITS), 4096);
ctx.real_size = ALIGN_UP (cl_offset + maximal_cmdline_size, 4096);
ctx.params = real_mode_mem;
*ctx.params = linux_params;
- ctx.params->cmd_line_ptr = ctx.real_mode_target + cl_offset;
+ ctx.params->hdr.cmd_line_ptr = ctx.real_mode_target + cl_offset;
grub_memcpy ((char *) ctx.params + cl_offset, linux_cmdline,
maximal_cmdline_size);
grub_dprintf ("linux", "code32_start = %x\n",
- (unsigned) ctx.params->code32_start);
+ (unsigned) ctx.params->hdr.code32_start);
ctx.e820_num = 0;
if (grub_mmap_iterate (grub_linux_boot_mmap_fill, &ctx))
return grub_errno;
- ctx.params->mmap_size = ctx.e820_num;
+ ctx.params->e820_entries = ctx.e820_num;
#ifdef GRUB_MACHINE_EFI
{
efi_mmap_target = ctx.real_mode_target
+ ((grub_uint8_t *) efi_mmap_buf - (grub_uint8_t *) real_mode_mem);
/* Pass EFI parameters. */
- if (grub_le_to_cpu16 (ctx.params->version) >= 0x0208)
+ if (grub_le_to_cpu16 (ctx.params->hdr.version) >= 0x0208)
{
- ctx.params->v0208.efi_mem_desc_size = efi_desc_size;
- ctx.params->v0208.efi_mem_desc_version = efi_desc_version;
- ctx.params->v0208.efi_mmap = efi_mmap_target;
- ctx.params->v0208.efi_mmap_size = efi_mmap_size;
+ ctx.params->efi_info.v0208.efi_memdesc_size = efi_desc_size;
+ ctx.params->efi_info.v0208.efi_memdesc_version = efi_desc_version;
+ ctx.params->efi_info.v0208.efi_memmap = efi_mmap_target;
+ ctx.params->efi_info.v0208.efi_memmap_size = efi_mmap_size;
#ifdef __x86_64__
- ctx.params->v0208.efi_mmap_hi = (efi_mmap_target >> 32);
+ ctx.params->efi_info.v0208.efi_memmap_hi = (efi_mmap_target >> 32);
#endif
}
- else if (grub_le_to_cpu16 (ctx.params->version) >= 0x0206)
+ else if (grub_le_to_cpu16 (ctx.params->hdr.version) >= 0x0206)
{
- ctx.params->v0206.efi_mem_desc_size = efi_desc_size;
- ctx.params->v0206.efi_mem_desc_version = efi_desc_version;
- ctx.params->v0206.efi_mmap = efi_mmap_target;
- ctx.params->v0206.efi_mmap_size = efi_mmap_size;
+ ctx.params->efi_info.v0206.efi_memdesc_size = efi_desc_size;
+ ctx.params->efi_info.v0206.efi_memdesc_version = efi_desc_version;
+ ctx.params->efi_info.v0206.efi_memmap = efi_mmap_target;
+ ctx.params->efi_info.v0206.efi_memmap_size = efi_mmap_size;
}
- else if (grub_le_to_cpu16 (ctx.params->version) >= 0x0204)
+ else if (grub_le_to_cpu16 (ctx.params->hdr.version) >= 0x0204)
{
- ctx.params->v0204.efi_mem_desc_size = efi_desc_size;
- ctx.params->v0204.efi_mem_desc_version = efi_desc_version;
- ctx.params->v0204.efi_mmap = efi_mmap_target;
- ctx.params->v0204.efi_mmap_size = efi_mmap_size;
+ ctx.params->efi_info.v0204.efi_memdesc_size = efi_desc_size;
+ ctx.params->efi_info.v0204.efi_memdesc_version = efi_desc_version;
+ ctx.params->efi_info.v0204.efi_memmap = efi_mmap_target;
+ ctx.params->efi_info.v0204.efi_memmap_size = efi_mmap_size;
}
}
#endif
#if defined (__x86_64__) && defined (GRUB_MACHINE_EFI)
- if (grub_le_to_cpu16 (ctx.params->version) >= 0x020c &&
- (linux_params.xloadflags & LINUX_X86_XLF_KERNEL_64) != 0)
+ if (grub_le_to_cpu16 (ctx.params->hdr.version) >= 0x020c &&
+ (linux_params.hdr.xloadflags & LINUX_X86_XLF_KERNEL_64) != 0)
{
struct grub_relocator64_efi_state state64;
state64.rsi = ctx.real_mode_target;
- state64.rip = ctx.params->code32_start + LINUX_X86_STARTUP64_OFFSET;
+ state64.rip = ctx.params->hdr.code32_start + LINUX_X86_STARTUP64_OFFSET;
return grub_relocator64_efi_boot (relocator, state64);
}
#endif
state.ebp = state.edi = state.ebx = 0;
state.esi = ctx.real_mode_target;
state.esp = ctx.real_mode_target;
- state.eip = ctx.params->code32_start;
+ state.eip = ctx.params->hdr.code32_start;
return grub_relocator32_boot (relocator, state, 0);
}
goto fail;
}
- grub_memcpy (&linux_params.setup_sects, &lh.setup_sects, len - 0x1F1);
+ grub_memcpy (&linux_params.hdr.setup_sects, &lh.setup_sects, len - 0x1F1);
/* We've already read lh so there is no need to read it second time. */
len -= sizeof(lh);
goto fail;
}
- linux_params.code32_start = prot_mode_target + lh.code32_start - GRUB_LINUX_BZIMAGE_ADDR;
- linux_params.kernel_alignment = ((grub_uint32_t) 1 << align);
- linux_params.ps_mouse = linux_params.padding11 = 0;
- linux_params.type_of_loader = GRUB_LINUX_BOOT_LOADER_TYPE;
+ linux_params.hdr.code32_start = prot_mode_target + lh.code32_start - GRUB_LINUX_BZIMAGE_ADDR;
+ linux_params.hdr.kernel_alignment = ((grub_uint32_t) 1 << align);
+ linux_params.hdr.boot_flag = 0;
+ linux_params.hdr.type_of_loader = GRUB_LINUX_BOOT_LOADER_TYPE;
/* These two are used (instead of cmd_line_ptr) by older versions of Linux,
and otherwise ignored. */
- linux_params.cl_magic = GRUB_LINUX_CL_MAGIC;
- linux_params.cl_offset = 0x1000;
+ linux_params.screen_info.cl_magic = GRUB_LINUX_CL_MAGIC;
+ linux_params.screen_info.cl_offset = 0x1000;
- linux_params.ramdisk_image = 0;
- linux_params.ramdisk_size = 0;
+ linux_params.hdr.ramdisk_image = 0;
+ linux_params.hdr.ramdisk_size = 0;
- linux_params.heap_end_ptr = GRUB_LINUX_HEAP_END_OFFSET;
- linux_params.loadflags |= GRUB_LINUX_FLAG_CAN_USE_HEAP;
+ linux_params.hdr.heap_end_ptr = GRUB_LINUX_HEAP_END_OFFSET;
+ linux_params.hdr.loadflags |= GRUB_LINUX_FLAG_CAN_USE_HEAP;
/* These are not needed to be precise, because Linux uses these values
only to raise an error when the decompression code cannot find good
space. */
- linux_params.ext_mem = ((32 * 0x100000) >> 10);
- linux_params.alt_mem = ((32 * 0x100000) >> 10);
+ linux_params.screen_info.ext_mem_k = ((32 * 0x100000) >> 10);
+ linux_params.alt_mem_k = ((32 * 0x100000) >> 10);
/* Ignored by Linux. */
- linux_params.video_page = 0;
+ linux_params.screen_info.orig_video_page = 0;
/* Only used when `video_mode == 0x7', otherwise ignored. */
- linux_params.video_ega_bx = 0;
+ linux_params.screen_info.orig_video_ega_bx = 0;
- linux_params.font_size = 16; /* XXX */
+ linux_params.screen_info.orig_video_points = 16; /* XXX */
#ifdef GRUB_MACHINE_EFI
#ifdef __x86_64__
- if (grub_le_to_cpu16 (linux_params.version) < 0x0208 &&
+ if (grub_le_to_cpu16 (linux_params.hdr.version) < 0x0208 &&
((grub_addr_t) grub_efi_system_table >> 32) != 0) {
grub_errno = grub_error (GRUB_ERR_BAD_OS, "kernel does not support 64-bit addressing");
goto fail;
}
#endif
- if (grub_le_to_cpu16 (linux_params.version) >= 0x0208)
+ if (grub_le_to_cpu16 (linux_params.hdr.version) >= 0x0208)
{
- linux_params.v0208.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
- linux_params.v0208.efi_system_table = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
+ linux_params.efi_info.v0208.efi_loader_signature = GRUB_LINUX_EFI_SIGNATURE;
+ linux_params.efi_info.v0208.efi_systab = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
#ifdef __x86_64__
- linux_params.v0208.efi_system_table_hi = (grub_uint32_t) ((grub_uint64_t) grub_efi_system_table >> 32);
+ linux_params.efi_info.v0208.efi_systab_hi = (grub_uint32_t) ((grub_uint64_t) grub_efi_system_table >> 32);
#endif
}
- else if (grub_le_to_cpu16 (linux_params.version) >= 0x0206)
+ else if (grub_le_to_cpu16 (linux_params.hdr.version) >= 0x0206)
{
- linux_params.v0206.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
- linux_params.v0206.efi_system_table = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
+ linux_params.efi_info.v0206.efi_loader_signature = GRUB_LINUX_EFI_SIGNATURE;
+ linux_params.efi_info.v0206.efi_systab = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
}
- else if (grub_le_to_cpu16 (linux_params.version) >= 0x0204)
+ else if (grub_le_to_cpu16 (linux_params.hdr.version) >= 0x0204)
{
- linux_params.v0204.efi_signature = GRUB_LINUX_EFI_SIGNATURE_0204;
- linux_params.v0204.efi_system_table = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
+ linux_params.efi_info.v0204.efi_loader_signature = GRUB_LINUX_EFI_SIGNATURE_0204;
+ linux_params.efi_info.v0204.efi_systab = (grub_uint32_t) (grub_addr_t) grub_efi_system_table;
}
#endif
}
else if (grub_memcmp (argv[i], "quiet", sizeof ("quiet") - 1) == 0)
{
- linux_params.loadflags |= GRUB_LINUX_FLAG_QUIET;
+ linux_params.hdr.loadflags |= GRUB_LINUX_FLAG_QUIET;
}
/* Create kernel command line. */
aligned_size = ALIGN_UP (size, 4096);
/* Get the highest address available for the initrd. */
- if (grub_le_to_cpu16 (linux_params.version) >= 0x0203)
+ if (grub_le_to_cpu16 (linux_params.hdr.version) >= 0x0203)
{
- addr_max = grub_cpu_to_le32 (linux_params.initrd_addr_max);
+ addr_max = grub_cpu_to_le32 (linux_params.hdr.initrd_addr_max);
/* XXX in reality, Linux specifies a bogus value, so
it is necessary to make sure that ADDR_MAX does not exceed
grub_dprintf ("linux", "Initrd (%p) at 0x%" PRIxGRUB_ADDR ", size=0x%" PRIxGRUB_SIZE "\n",
initrd_mem, initrd_mem_target, size);
- linux_params.ramdisk_image = initrd_mem_target;
- linux_params.ramdisk_size = size;
- linux_params.root_dev = 0x0100; /* XXX */
+ linux_params.hdr.ramdisk_image = initrd_mem_target;
+ linux_params.hdr.ramdisk_size = size;
+ linux_params.hdr.root_dev = 0x0100; /* XXX */
fail:
grub_initrd_close (&initrd_ctx);
/* Maximum number of MBR signatures to store. */
#define EDD_MBR_SIG_MAX 16
+/* Number of edd_info structs starting at EDDBUF. */
+#define EDDMAXNR 6
+
#ifdef __x86_64__
#define GRUB_LINUX_EFI_SIGNATURE \
#define GRUB_E820_NVS 4
#define GRUB_E820_BADRAM 5
-struct grub_e820_mmap
+#define GRUB_E820_MAX_ENTRIES_ZEROPAGE 128
+
+struct grub_screen_info
{
- grub_uint64_t addr;
- grub_uint64_t size;
- grub_uint32_t type;
+ grub_uint8_t orig_x; /* 0x00 */
+ grub_uint8_t orig_y; /* 0x01 */
+ grub_uint16_t ext_mem_k; /* 0x02 */
+ grub_uint16_t orig_video_page; /* 0x04 */
+ grub_uint8_t orig_video_mode; /* 0x06 */
+ grub_uint8_t orig_video_cols; /* 0x07 */
+ grub_uint8_t flags; /* 0x08 */
+ grub_uint8_t unused2; /* 0x09 */
+ grub_uint16_t orig_video_ega_bx; /* 0x0a */
+ grub_uint16_t unused3; /* 0x0c */
+ grub_uint8_t orig_video_lines; /* 0x0e */
+ grub_uint8_t orig_video_isVGA; /* 0x0f */
+ grub_uint16_t orig_video_points; /* 0x10 */
+
+ /* VESA graphic mode -- linear frame buffer */
+ grub_uint16_t lfb_width; /* 0x12 */
+ grub_uint16_t lfb_height; /* 0x14 */
+ grub_uint16_t lfb_depth; /* 0x16 */
+ grub_uint32_t lfb_base; /* 0x18 */
+ grub_uint32_t lfb_size; /* 0x1c */
+ grub_uint16_t cl_magic, cl_offset; /* 0x20 */
+ grub_uint16_t lfb_linelength; /* 0x24 */
+ grub_uint8_t red_size; /* 0x26 */
+ grub_uint8_t red_pos; /* 0x27 */
+ grub_uint8_t green_size; /* 0x28 */
+ grub_uint8_t green_pos; /* 0x29 */
+ grub_uint8_t blue_size; /* 0x2a */
+ grub_uint8_t blue_pos; /* 0x2b */
+ grub_uint8_t rsvd_size; /* 0x2c */
+ grub_uint8_t rsvd_pos; /* 0x2d */
+ grub_uint16_t vesapm_seg; /* 0x2e */
+ grub_uint16_t vesapm_off; /* 0x30 */
+ grub_uint16_t pages; /* 0x32 */
+ grub_uint16_t vesa_attributes; /* 0x34 */
+ grub_uint32_t capabilities; /* 0x36 */
+ grub_uint32_t ext_lfb_base; /* 0x3a */
+ grub_uint8_t _reserved[2]; /* 0x3e */
} GRUB_PACKED;
-enum
- {
- GRUB_VIDEO_LINUX_TYPE_TEXT = 0x01,
- GRUB_VIDEO_LINUX_TYPE_VESA = 0x23, /* VESA VGA in graphic mode. */
- GRUB_VIDEO_LINUX_TYPE_EFIFB = 0x70, /* EFI Framebuffer. */
- GRUB_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */
- };
+struct grub_apm_bios_info
+{
+ grub_uint16_t version;
+ grub_uint16_t cseg;
+ grub_uint32_t offset;
+ grub_uint16_t cseg_16;
+ grub_uint16_t dseg;
+ grub_uint16_t flags;
+ grub_uint16_t cseg_len;
+ grub_uint16_t cseg_16_len;
+ grub_uint16_t dseg_len;
+};
+
+struct grub_ist_info
+{
+ grub_uint32_t signature;
+ grub_uint32_t command;
+ grub_uint32_t event;
+ grub_uint32_t perf_level;
+};
-/* For the Linux/i386 boot protocol version 2.10. */
-struct linux_i386_kernel_header
+struct grub_sys_desc_table
+{
+ grub_uint16_t length;
+ grub_uint8_t table[14];
+};
+
+struct grub_olpc_ofw_header {
+ grub_uint32_t ofw_magic; /* OFW signature */
+ grub_uint32_t ofw_version;
+ grub_uint32_t cif_handler; /* callback into OFW */
+ grub_uint32_t irq_desc_table;
+} GRUB_PACKED;
+
+struct grub_setup_header
{
- grub_uint8_t code1[0x0020];
- grub_uint16_t cl_magic; /* Magic number 0xA33F */
- grub_uint16_t cl_offset; /* The offset of command line */
- grub_uint8_t code2[0x01F1 - 0x0020 - 2 - 2];
grub_uint8_t setup_sects; /* The size of the setup in sectors */
grub_uint16_t root_flags; /* If the root is mounted readonly */
- grub_uint16_t syssize; /* obsolete */
- grub_uint16_t swap_dev; /* obsolete */
+ grub_uint32_t syssize; /* obsolete */
grub_uint16_t ram_size; /* obsolete */
grub_uint16_t vid_mode; /* Video mode control */
grub_uint16_t root_dev; /* Default root device number */
- grub_uint16_t boot_flag; /* 0xAA55 magic number */
+ grub_uint16_t boot_flag; /* 1fe */
grub_uint16_t jump; /* Jump instruction */
grub_uint32_t header; /* Magic signature "HdrS" */
grub_uint16_t version; /* Boot protocol version supported */
grub_uint16_t start_sys; /* The load-low segment (obsolete) */
grub_uint16_t kernel_version; /* Points to kernel version string */
grub_uint8_t type_of_loader; /* Boot loader identifier */
-#define LINUX_LOADER_ID_LILO 0x0
-#define LINUX_LOADER_ID_LOADLIN 0x1
-#define LINUX_LOADER_ID_BOOTSECT 0x2
-#define LINUX_LOADER_ID_SYSLINUX 0x3
-#define LINUX_LOADER_ID_ETHERBOOT 0x4
-#define LINUX_LOADER_ID_ELILO 0x5
-#define LINUX_LOADER_ID_GRUB 0x7
-#define LINUX_LOADER_ID_UBOOT 0x8
-#define LINUX_LOADER_ID_XEN 0x9
-#define LINUX_LOADER_ID_GUJIN 0xa
-#define LINUX_LOADER_ID_QEMU 0xb
grub_uint8_t loadflags; /* Boot protocol option flags */
grub_uint16_t setup_move_size; /* Move to high memory size */
grub_uint32_t code32_start; /* Boot loader hook */
grub_uint32_t ramdisk_size; /* initrd size */
grub_uint32_t bootsect_kludge; /* obsolete */
grub_uint16_t heap_end_ptr; /* Free memory after setup end */
- grub_uint16_t pad1; /* Unused */
+ grub_uint8_t ext_loader_ver; /* Extended loader version */
+ grub_uint8_t ext_loader_type; /* Extended loader type */
grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */
- grub_uint32_t initrd_addr_max; /* Highest address for initrd */
- grub_uint32_t kernel_alignment;
- grub_uint8_t relocatable;
+ grub_uint32_t initrd_addr_max; /* Maximum initrd address */
+ grub_uint32_t kernel_alignment; /* Alignment of the kernel */
+ grub_uint8_t relocatable_kernel; /* Is the kernel relocatable */
grub_uint8_t min_alignment;
grub_uint16_t xloadflags;
- grub_uint32_t cmdline_size;
+ grub_uint32_t cmdline_size; /* Size of the kernel command line */
grub_uint32_t hardware_subarch;
grub_uint64_t hardware_subarch_data;
grub_uint32_t payload_offset;
grub_uint64_t pref_address;
grub_uint32_t init_size;
grub_uint32_t handover_offset;
+ grub_uint32_t kernel_info_offset;
} GRUB_PACKED;
-/* Boot parameters for Linux based on 2.6.12. This is used by the setup
- sectors of Linux, and must be simulated by GRUB on EFI, because
- the setup sectors depend on BIOS. */
-struct linux_kernel_params
+struct grub_boot_e820_entry
{
- grub_uint8_t video_cursor_x; /* 0 */
- grub_uint8_t video_cursor_y;
-
- grub_uint16_t ext_mem; /* 2 */
-
- grub_uint16_t video_page; /* 4 */
- grub_uint8_t video_mode; /* 6 */
- grub_uint8_t video_width; /* 7 */
-
- grub_uint8_t padding1[0xa - 0x8];
-
- grub_uint16_t video_ega_bx; /* a */
-
- grub_uint8_t padding2[0xe - 0xc];
-
- grub_uint8_t video_height; /* e */
- grub_uint8_t have_vga; /* f */
- grub_uint16_t font_size; /* 10 */
-
- grub_uint16_t lfb_width; /* 12 */
- grub_uint16_t lfb_height; /* 14 */
- grub_uint16_t lfb_depth; /* 16 */
- grub_uint32_t lfb_base; /* 18 */
- grub_uint32_t lfb_size; /* 1c */
-
- grub_uint16_t cl_magic; /* 20 */
- grub_uint16_t cl_offset;
-
- grub_uint16_t lfb_line_len; /* 24 */
- grub_uint8_t red_mask_size; /* 26 */
- grub_uint8_t red_field_pos;
- grub_uint8_t green_mask_size;
- grub_uint8_t green_field_pos;
- grub_uint8_t blue_mask_size;
- grub_uint8_t blue_field_pos;
- grub_uint8_t reserved_mask_size;
- grub_uint8_t reserved_field_pos;
- grub_uint16_t vesapm_segment; /* 2e */
- grub_uint16_t vesapm_offset; /* 30 */
- grub_uint16_t lfb_pages; /* 32 */
- grub_uint16_t vesa_attrib; /* 34 */
- grub_uint32_t capabilities; /* 36 */
- grub_uint32_t ext_lfb_base; /* 3a */
-
- grub_uint8_t padding3[0x40 - 0x3e];
-
- grub_uint16_t apm_version; /* 40 */
- grub_uint16_t apm_code_segment; /* 42 */
- grub_uint32_t apm_entry; /* 44 */
- grub_uint16_t apm_16bit_code_segment; /* 48 */
- grub_uint16_t apm_data_segment; /* 4a */
- grub_uint16_t apm_flags; /* 4c */
- grub_uint32_t apm_code_len; /* 4e */
- grub_uint16_t apm_data_len; /* 52 */
-
- grub_uint8_t padding4[0x60 - 0x54];
-
- grub_uint32_t ist_signature; /* 60 */
- grub_uint32_t ist_command; /* 64 */
- grub_uint32_t ist_event; /* 68 */
- grub_uint32_t ist_perf_level; /* 6c */
- grub_uint64_t acpi_rsdp_addr; /* 70 */
-
- grub_uint8_t padding5[0x80 - 0x78];
-
- grub_uint8_t hd0_drive_info[0x10]; /* 80 */
- grub_uint8_t hd1_drive_info[0x10]; /* 90 */
- grub_uint16_t rom_config_len; /* a0 */
-
- grub_uint8_t padding6[0xb0 - 0xa2];
-
- grub_uint32_t ofw_signature; /* b0 */
- grub_uint32_t ofw_num_items; /* b4 */
- grub_uint32_t ofw_cif_handler; /* b8 */
- grub_uint32_t ofw_idt; /* bc */
-
- grub_uint8_t padding7[0x1b8 - 0xc0];
+ grub_uint64_t addr;
+ grub_uint64_t size;
+ grub_uint32_t type;
+} GRUB_PACKED;
+struct grub_edd_device_params
+{
+ grub_uint16_t length;
+ grub_uint16_t info_flags;
+ grub_uint32_t num_default_cylinders;
+ grub_uint32_t num_default_heads;
+ grub_uint32_t sectors_per_track;
+ grub_uint64_t number_of_sectors;
+ grub_uint16_t bytes_per_sector;
+ grub_uint32_t dpte_ptr; /* 0xFFFFFFFF for our purposes */
+ grub_uint16_t key; /* = 0xBEDD */
+ grub_uint8_t device_path_info_length; /* = 44 */
+ grub_uint8_t reserved2;
+ grub_uint16_t reserved3;
+ grub_uint8_t host_bus_type[4];
+ grub_uint8_t interface_type[8];
union
{
struct
- {
- grub_uint32_t efi_system_table; /* 1b8 */
- grub_uint32_t padding7_1; /* 1bc */
- grub_uint32_t efi_signature; /* 1c0 */
- grub_uint32_t efi_mem_desc_size; /* 1c4 */
- grub_uint32_t efi_mem_desc_version; /* 1c8 */
- grub_uint32_t efi_mmap_size; /* 1cc */
- grub_uint32_t efi_mmap; /* 1d0 */
- } v0204;
+ {
+ grub_uint16_t base_address;
+ grub_uint16_t reserved1;
+ grub_uint32_t reserved2;
+ } isa;
struct
- {
- grub_uint32_t padding7_1; /* 1b8 */
- grub_uint32_t padding7_2; /* 1bc */
- grub_uint32_t efi_signature; /* 1c0 */
- grub_uint32_t efi_system_table; /* 1c4 */
- grub_uint32_t efi_mem_desc_size; /* 1c8 */
- grub_uint32_t efi_mem_desc_version; /* 1cc */
- grub_uint32_t efi_mmap; /* 1d0 */
- grub_uint32_t efi_mmap_size; /* 1d4 */
- } v0206;
+ {
+ grub_uint8_t bus;
+ grub_uint8_t slot;
+ grub_uint8_t function;
+ grub_uint8_t channel;
+ grub_uint32_t reserved;
+ } pci;
+ /* pcix is same as pci */
struct
- {
- grub_uint32_t padding7_1; /* 1b8 */
- grub_uint32_t padding7_2; /* 1bc */
- grub_uint32_t efi_signature; /* 1c0 */
- grub_uint32_t efi_system_table; /* 1c4 */
- grub_uint32_t efi_mem_desc_size; /* 1c8 */
- grub_uint32_t efi_mem_desc_version; /* 1cc */
- grub_uint32_t efi_mmap; /* 1d0 */
- grub_uint32_t efi_mmap_size; /* 1d4 */
- grub_uint32_t efi_system_table_hi; /* 1d8 */
- grub_uint32_t efi_mmap_hi; /* 1dc */
- } v0208;
- };
-
- grub_uint32_t alt_mem; /* 1e0 */
-
- grub_uint8_t padding8[0x1e8 - 0x1e4];
-
- grub_uint8_t mmap_size; /* 1e8 */
-
- grub_uint8_t padding9[0x1ec - 0x1e9];
+ {
+ grub_uint64_t reserved;
+ } ibnd;
+ struct
+ {
+ grub_uint64_t reserved;
+ } xprs;
+ struct
+ {
+ grub_uint64_t reserved;
+ } htpt;
+ struct
+ {
+ grub_uint64_t reserved;
+ } unknown;
+ } interface_path;
+ union
+ {
+ struct
+ {
+ grub_uint8_t device;
+ grub_uint8_t reserved1;
+ grub_uint16_t reserved2;
+ grub_uint32_t reserved3;
+ grub_uint64_t reserved4;
+ } ata;
+ struct
+ {
+ grub_uint8_t device;
+ grub_uint8_t lun;
+ grub_uint8_t reserved1;
+ grub_uint8_t reserved2;
+ grub_uint32_t reserved3;
+ grub_uint64_t reserved4;
+ } atapi;
+ struct
+ {
+ grub_uint16_t id;
+ grub_uint64_t lun;
+ grub_uint16_t reserved1;
+ grub_uint32_t reserved2;
+ } scsi;
+ struct
+ {
+ grub_uint64_t serial_number;
+ grub_uint64_t reserved;
+ } usb;
+ struct
+ {
+ grub_uint64_t eui;
+ grub_uint64_t reserved;
+ } i1394;
+ struct
+ {
+ grub_uint64_t wwid;
+ grub_uint64_t lun;
+ } fibre;
+ struct
+ {
+ grub_uint64_t identity_tag;
+ grub_uint64_t reserved;
+ } i2o;
+ struct
+ {
+ grub_uint32_t array_number;
+ grub_uint32_t reserved1;
+ grub_uint64_t reserved2;
+ } raid;
+ struct
+ {
+ grub_uint8_t device;
+ grub_uint8_t reserved1;
+ grub_uint16_t reserved2;
+ grub_uint32_t reserved3;
+ grub_uint64_t reserved4;
+ } sata;
+ struct
+ {
+ grub_uint64_t reserved1;
+ grub_uint64_t reserved2;
+ } unknown;
+ } device_path;
+ grub_uint8_t reserved4;
+ grub_uint8_t checksum;
+} GRUB_PACKED;
- grub_uint8_t secure_boot; /* 1ec */
+struct grub_edd_info
+{
+ grub_uint8_t device;
+ grub_uint8_t version;
+ grub_uint16_t interface_support;
+ grub_uint16_t legacy_max_cylinder;
+ grub_uint8_t legacy_max_head;
+ grub_uint8_t legacy_sectors_per_track;
+ struct grub_edd_device_params params;
+} GRUB_PACKED;
- grub_uint8_t padding10[0x1f1 - 0x1ed];
+enum
+ {
+ GRUB_VIDEO_LINUX_TYPE_TEXT = 0x01,
+ GRUB_VIDEO_LINUX_TYPE_VESA = 0x23, /* VESA VGA in graphic mode. */
+ GRUB_VIDEO_LINUX_TYPE_EFIFB = 0x70, /* EFI Framebuffer. */
+ GRUB_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */
+ };
- /* Linux setup header copy - BEGIN. */
+/* For the Linux/i386 boot protocol version 2.10. */
+struct linux_i386_kernel_header
+{
+ grub_uint8_t code1[0x0020];
+ grub_uint16_t cl_magic; /* Magic number 0xA33F */
+ grub_uint16_t cl_offset; /* The offset of command line */
+ grub_uint8_t code2[0x01F1 - 0x0020 - 2 - 2];
grub_uint8_t setup_sects; /* The size of the setup in sectors */
grub_uint16_t root_flags; /* If the root is mounted readonly */
grub_uint16_t syssize; /* obsolete */
grub_uint16_t ram_size; /* obsolete */
grub_uint16_t vid_mode; /* Video mode control */
grub_uint16_t root_dev; /* Default root device number */
-
- grub_uint8_t padding11; /* 1fe */
- grub_uint8_t ps_mouse; /* 1ff */
-
+ grub_uint16_t boot_flag; /* 0xAA55 magic number */
grub_uint16_t jump; /* Jump instruction */
grub_uint32_t header; /* Magic signature "HdrS" */
grub_uint16_t version; /* Boot protocol version supported */
grub_uint16_t start_sys; /* The load-low segment (obsolete) */
grub_uint16_t kernel_version; /* Points to kernel version string */
grub_uint8_t type_of_loader; /* Boot loader identifier */
+#define LINUX_LOADER_ID_LILO 0x0
+#define LINUX_LOADER_ID_LOADLIN 0x1
+#define LINUX_LOADER_ID_BOOTSECT 0x2
+#define LINUX_LOADER_ID_SYSLINUX 0x3
+#define LINUX_LOADER_ID_ETHERBOOT 0x4
+#define LINUX_LOADER_ID_ELILO 0x5
+#define LINUX_LOADER_ID_GRUB 0x7
+#define LINUX_LOADER_ID_UBOOT 0x8
+#define LINUX_LOADER_ID_XEN 0x9
+#define LINUX_LOADER_ID_GUJIN 0xa
+#define LINUX_LOADER_ID_QEMU 0xb
grub_uint8_t loadflags; /* Boot protocol option flags */
grub_uint16_t setup_move_size; /* Move to high memory size */
grub_uint32_t code32_start; /* Boot loader hook */
grub_uint32_t ramdisk_size; /* initrd size */
grub_uint32_t bootsect_kludge; /* obsolete */
grub_uint16_t heap_end_ptr; /* Free memory after setup end */
- grub_uint8_t ext_loader_ver; /* Extended loader version */
- grub_uint8_t ext_loader_type; /* Extended loader type */
+ grub_uint16_t pad1; /* Unused */
grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */
- grub_uint32_t initrd_addr_max; /* Maximum initrd address */
- grub_uint32_t kernel_alignment; /* Alignment of the kernel */
- grub_uint8_t relocatable_kernel; /* Is the kernel relocatable */
+ grub_uint32_t initrd_addr_max; /* Highest address for initrd */
+ grub_uint32_t kernel_alignment;
+ grub_uint8_t relocatable;
grub_uint8_t min_alignment;
grub_uint16_t xloadflags;
- grub_uint32_t cmdline_size; /* Size of the kernel command line */
+ grub_uint32_t cmdline_size;
grub_uint32_t hardware_subarch;
grub_uint64_t hardware_subarch_data;
grub_uint32_t payload_offset;
grub_uint64_t pref_address;
grub_uint32_t init_size;
grub_uint32_t handover_offset;
- /* Linux setup header copy - END. */
+} GRUB_PACKED;
- grub_uint8_t _pad7[40];
+/*
+ * Boot parameters for Linux based on 6.13.7 stable. This is used
+ * by the setup sectors of Linux, and must be simulated by GRUB
+ * on EFI, because the setup sectors depend on BIOS.
+ */
+struct linux_kernel_params
+{
+ struct grub_screen_info screen_info; /* 0 */
+ struct grub_apm_bios_info apm_bios_info; /* 40 */
+ grub_uint8_t _pad2[4]; /* 54 */
+ grub_uint64_t tboot_addr; /* 58 */
+ struct grub_ist_info ist_info; /* 60 */
+ grub_uint64_t acpi_rsdp_addr; /* 70 */
+ grub_uint8_t _pad3[8]; /* 78 */
+ grub_uint8_t hd0_info[16]; /* 80 */
+ grub_uint8_t hd1_info[16]; /* 90 */
+ struct grub_sys_desc_table sys_desc_table; /* a0 */
+ struct grub_olpc_ofw_header olpc_ofw_header; /* b0 */
+ grub_uint32_t ext_ramdisk_image; /* c0 */
+ grub_uint32_t ext_ramdisk_size; /* c4 */
+ grub_uint32_t ext_cmd_line_ptr; /* c8 */
+ grub_uint8_t _pad4[112]; /* cc */
+ grub_uint32_t cc_blob_address; /* 13c */
+
+ /*
+ * edid_info should be a struct with "unsigned char dummy[128]" and
+ * efi_info should be a struct as well, starting at 0x1c0. However,
+ * for backwards compatibility, GRUB can have efi_systab at 0x1b8 and
+ * padding at 0x1bc (or padding at both spots). This cuts into the end
+ * of edid_info. Make edid_info inline and only make it go up to 0x1b8.
+ */
+ grub_uint8_t edid_info[0x1b8 - 0x140]; /* 140 */
+ union
+ {
+ struct
+ {
+ grub_uint32_t efi_systab; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_loader_signature; /* 1c0 */
+ grub_uint32_t efi_memdesc_size; /* 1c4 */
+ grub_uint32_t efi_memdesc_version; /* 1c8 */
+ grub_uint32_t efi_memmap_size; /* 1cc */
+ grub_uint32_t efi_memmap; /* 1d0 */
+ } v0204;
+ struct
+ {
+ grub_uint32_t padding7_1; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_loader_signature; /* 1c0 */
+ grub_uint32_t efi_systab; /* 1c4 */
+ grub_uint32_t efi_memdesc_size; /* 1c8 */
+ grub_uint32_t efi_memdesc_version; /* 1cc */
+ grub_uint32_t efi_memmap; /* 1d0 */
+ grub_uint32_t efi_memmap_size; /* 1d4 */
+ } v0206;
+ struct
+ {
+ grub_uint32_t padding7_1; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_loader_signature; /* 1c0 */
+ grub_uint32_t efi_systab; /* 1c4 */
+ grub_uint32_t efi_memdesc_size; /* 1c8 */
+ grub_uint32_t efi_memdesc_version; /* 1cc */
+ grub_uint32_t efi_memmap; /* 1d0 */
+ grub_uint32_t efi_memmap_size; /* 1d4 */
+ grub_uint32_t efi_systab_hi; /* 1d8 */
+ grub_uint32_t efi_memmap_hi; /* 1dc */
+ } v0208;
+ } efi_info;
+
+ grub_uint32_t alt_mem_k; /* 1e0 */
+ grub_uint32_t scratch; /* 1e4 */
+ grub_uint8_t e820_entries; /* 1e8 */
+ grub_uint8_t eddbuf_entries; /* 1e9 */
+ grub_uint8_t edd_mbr_sig_buf_entries; /* 1ea */
+ grub_uint8_t kbd_status; /* 1eb */
+ grub_uint8_t secure_boot; /* 1ec */
+ grub_uint8_t _pad5[2]; /* 1ed */
+ grub_uint8_t sentinel; /* 1ef */
+ grub_uint8_t _pad6[1]; /* 1f0 */
+ struct grub_setup_header hdr; /* 1f1 */
+ grub_uint8_t _pad7[0x290 - 0x1f1 - sizeof(struct grub_setup_header)];
grub_uint32_t edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 290 */
- struct grub_e820_mmap e820_map[(0x400 - 0x2d0) / 20]; /* 2d0 */
+ struct grub_boot_e820_entry e820_table[GRUB_E820_MAX_ENTRIES_ZEROPAGE]; /* 2d0 */
+ grub_uint8_t _pad8[48]; /* cd0 */
+ struct grub_edd_info eddbuf[EDDMAXNR]; /* d00 */
+ grub_uint8_t _pad9[276]; /* eec */
} GRUB_PACKED;
#endif /* ! ASM_FILE */