2008-08-17 Robert Millan
* include/grub/i386/linux.h (LINUX_LOADER_ID_LILO)
(LINUX_LOADER_ID_LOADLIN, LINUX_LOADER_ID_BOOTSECT)
(LINUX_LOADER_ID_SYSLINUX, LINUX_LOADER_ID_ETHERBOOT)
(LINUX_LOADER_ID_ELILO, LINUX_LOADER_ID_GRUB, LINUX_LOADER_ID_UBOOT)
(LINUX_LOADER_ID_XEN, LINUX_LOADER_ID_GUJIN, LINUX_LOADER_ID_QEMU):
New macros.
(GRUB_LINUX_CL_OFFSET, GRUB_LINUX_CL_END_OFFSET): Move from here ...
* loader/i386/pc/linux.c (GRUB_LINUX_CL_OFFSET)
(GRUB_LINUX_CL_END_OFFSET): ... to here.
* loader/i386/efi/linux.c (GRUB_EFI_CL_OFFSET): Rename to ...
(GRUB_LINUX_CL_OFFSET): ... this. Update all users.
(GRUB_EFI_CL_END_OFFSET): Rename to ...
(GRUB_LINUX_CL_END_OFFSET): ... this. Update all users.
(grub_rescue_cmd_linux): Macroify `type_of_loader' initialization.
Initialize `params->video_cursor_x' and `params->video_cursor_y'
portably using grub_getxy().
Remove '-EFI' suffix from boot message.
Index: include/grub/i386/linux.h
===================================================================
--- include/grub/i386/linux.h (revision 1817)
+++ include/grub/i386/linux.h (working copy)
@@ -39,8 +39,6 @@
#define GRUB_LINUX_VID_MODE_EXTENDED 0xFFFE
#define GRUB_LINUX_VID_MODE_ASK 0xFFFD
-#define GRUB_LINUX_CL_OFFSET 0x9000
-#define GRUB_LINUX_CL_END_OFFSET 0x90FF
#define GRUB_LINUX_SETUP_MOVE_SIZE 0x9100
#define GRUB_LINUX_CL_MAGIC 0xA33F
@@ -104,6 +102,17 @@ struct linux_kernel_header
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 */
Index: loader/i386/pc/linux.c
===================================================================
--- loader/i386/pc/linux.c (revision 1817)
+++ loader/i386/pc/linux.c (working copy)
@@ -31,6 +31,9 @@
#include
#include
+#define GRUB_LINUX_CL_OFFSET 0x9000
+#define GRUB_LINUX_CL_END_OFFSET 0x90FF
+
static grub_dl_t my_mod;
static grub_size_t linux_mem_size;
Index: loader/i386/efi/linux.c
===================================================================
--- loader/i386/efi/linux.c (revision 1817)
+++ loader/i386/efi/linux.c (working copy)
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,8 +33,8 @@
#include
#include
-#define GRUB_EFI_CL_OFFSET 0x1000
-#define GRUB_EFI_CL_END_OFFSET 0x2000
+#define GRUB_LINUX_CL_OFFSET 0x1000
+#define GRUB_LINUX_CL_END_OFFSET 0x2000
#define NEXT_MEMORY_DESCRIPTOR(desc, size) \
((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size)))
@@ -166,7 +166,7 @@ allocate_pages (grub_size_t prot_size)
grub_size_t real_size;
/* Make sure that each size is aligned to a page boundary. */
- real_size = GRUB_EFI_CL_END_OFFSET;
+ real_size = GRUB_LINUX_CL_END_OFFSET;
prot_size = page_align (prot_size);
mmap_size = find_mmap_size ();
@@ -634,7 +634,7 @@ grub_rescue_cmd_linux (int argc, char *a
goto fail;
params = (struct linux_kernel_params *) real_mode_mem;
- grub_memset (params, 0, GRUB_EFI_CL_END_OFFSET);
+ grub_memset (params, 0, GRUB_LINUX_CL_END_OFFSET);
grub_memcpy (¶ms->setup_sects, &lh.setup_sects, sizeof (lh) - 0x1F1);
params->ps_mouse = params->padding10 = 0;
@@ -647,7 +647,7 @@ grub_rescue_cmd_linux (int argc, char *a
}
/* XXX Linux assumes that only elilo can boot Linux on EFI!!! */
- params->type_of_loader = 0x50;
+ params->type_of_loader = (LINUX_LOADER_ID_ELILO << 4);
params->cl_magic = GRUB_LINUX_CL_MAGIC;
params->cl_offset = 0x1000;
@@ -664,8 +664,8 @@ grub_rescue_cmd_linux (int argc, char *a
params->ext_mem = ((32 * 0x100000) >> 10);
params->alt_mem = ((32 * 0x100000) >> 10);
- params->video_cursor_x = grub_efi_system_table->con_out->mode->cursor_column;
- params->video_cursor_y = grub_efi_system_table->con_out->mode->cursor_row;
+ params->video_cursor_x = grub_getxy () >> 8;
+ params->video_cursor_y = grub_getxy () & 0xff;
params->video_page = 0; /* ??? */
params->video_mode = grub_efi_system_table->con_out->mode->mode;
params->video_width = (grub_getwh () >> 8);
@@ -758,7 +758,7 @@ grub_rescue_cmd_linux (int argc, char *a
grub_file_seek (file, real_size + GRUB_DISK_SECTOR_SIZE);
/* XXX there is no way to know if the kernel really supports EFI. */
- grub_printf (" [Linux-EFI, setup=0x%x, size=0x%x]\n",
+ grub_printf (" [Linux, setup=0x%x, size=0x%x]\n",
(unsigned) real_size, (unsigned) prot_size);
/* Detect explicitly specified memory size, if any. */
@@ -814,7 +814,7 @@ grub_rescue_cmd_linux (int argc, char *a
}
/* Specify the boot file. */
- dest = grub_stpcpy ((char *) real_mode_mem + GRUB_EFI_CL_OFFSET,
+ dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET,
"BOOT_IMAGE=");
dest = grub_stpcpy (dest, argv[0]);
@@ -822,7 +822,7 @@ grub_rescue_cmd_linux (int argc, char *a
for (i = 1;
i < argc
&& dest + grub_strlen (argv[i]) + 1 < ((char *) real_mode_mem
- + GRUB_EFI_CL_END_OFFSET);
+ + GRUB_LINUX_CL_END_OFFSET);
i++)
{
*dest++ = ' ';