Hi,

I've been working on a pure 32-bit Linux loader that is firmware-agnostic
and can be used on coreboot (and probably others later on).  I used the EFI
Linux loader as a base.

Due to the large amount of changes, and the way EFI operates (in which it
retains control of memory management, much differently than all other
platforms), I don't think it will be possible to maintain a single loader
that can work on both EFI & the rest (unless drastic changes were performed
to the EFI port).

So I will propose to add a separate loader.  I'll send a new mail about
that later, but first I'd like to see if a few of the changes can be
harmonized with the current EFI loader, so that the code doesn't differ
so much.

I'm attaching a patch with a few minor changes that will make it easier
to move code back & forth in the future.

Since I have no EFI setup to test with, would be nice if it can be tested
as well as reviewed.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
2008-08-17  Robert Millan  <[EMAIL PROTECTED]>

	* 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 <grub/dl.h>
 #include <grub/cpu/linux.h>
 
+#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 <grub/efi/uga_draw.h>
 #include <grub/pci.h>
 
-#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 (&params->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++ = ' ';
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to