From: Robert Millan <rmh@aybabtu.com>
To: grub-devel@gnu.org
Subject: [PATCH] cleanup in EFI Linux loader
Date: Sun, 17 Aug 2008 22:35:38 +0200 [thread overview]
Message-ID: <20080817203538.GA27181@thorin> (raw)
[-- Attachment #1: Type: text/plain, Size: 1163 bytes --]
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."
[-- Attachment #2: efi_cleanup.diff --]
[-- Type: text/x-diff, Size: 6050 bytes --]
2008-08-17 Robert Millan <rmh@aybabtu.com>
* 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 (¶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++ = ' ';
next reply other threads:[~2008-08-17 20:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-17 20:35 Robert Millan [this message]
2008-08-17 20:42 ` [PATCH] cleanup in EFI Linux loader Robert Millan
2008-08-18 10:57 ` Bean
2008-08-18 13:00 ` Robert Millan
2008-08-18 16:21 ` Stefan Reinauer
2008-08-18 22:48 ` Robert Millan
-- strict thread matches above, loose matches on Subject: below --
2008-08-18 8:57 Guy Forssman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080817203538.GA27181@thorin \
--to=rmh@aybabtu.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.