Stephane Eranian 2013-03-29 09:49:53 -04:00 committed by Vincent Batts
parent 82f7288853
commit 2b5c5002e1
21 changed files with 708 additions and 109 deletions

View File

@ -1,4 +1,22 @@
2011-1-10 signed off by Jason Fleischli <jason.fleischli@hp.com>
2013-03-27 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* ADD CROSSBUILD
* intake edited version of Debian x86x crossbuild patches.
* Fixed Makefile clean to include crossbuild envs.
* Fixed ia32 system.c compile warning
* Simplified efi no GOP warning so it doesnt look like an error.
* MAJOR: Fixed Fault crash when EFI memory map changes from under elilo.
(from an outside interrupt in this case). When the EFI Memory map
changes after elilo has already built boot params to pass to the
kernel the EFI call to ExitBootSvcs just prior to boot will fail
because elilo has the old map key. This is valid EFI behavior, elilo
retries to pick up the new memory map and valid key but had already
freed the start params portion of boot params resulting in a NULL
DEREF crash reset.
* Add console reset call during initialization. thanks A. Steinmetz
* minor bugfix, fixed -m option broken. thanks Allan-lsk.
* tag 3_16 for release
2011-1-10 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* Uptake of SUSE patches
- add sysfs support for efi vars (formerly /proc/efi/vars)
- fix strncpy overflow
@ -12,7 +30,7 @@
* replace error output on GOP handle failed, downgraded to normal
print status with more informative output.
2009-10-22 signed off by Jason Fleischli <jason.fleischli@hp.com>
2009-10-22 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* elilo 3.12 release commit
* Added additional #defines for debug levels to reduce the output
* Added Mac console patch rework from Julien Blache @ debian
@ -34,7 +52,8 @@
x86_64... this is a legacy design hold over from original design and
needs to be re-written to do dynamic size memory management based on
the size of the actual vmlinuz image, as ia64/gzip does.
2008-04-02 signed off by Jason Fleischli <jason.fleischli@hp.com>
2008-04-02 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* elilo 3.10 release commit
* Bumped version string to 3.10
* added PTR_FMT 32bit & 64bit pointer translation for correct output
@ -54,10 +73,10 @@
* bugfix loader_probe now correctly errors out if no loaders
registered.
2008-01-11 signed off by Jason Fleischli <jason.fleischli@hp.com>
2008-01-11 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* Various compile warning cleanups.
2008-01-03 signed off by Jason Fleischli <jason.fleischli@hp.com>
2008-01-03 signed off by Jason Fleischli <fleischli@users.sourceforge.net>
* Patch contribution from Scott Davilla <davilla@4pi.com>
when x is zero for the first call to add_memory_region, e820_map[-1]
will access memory outside the bounds of e820_map. While this does
@ -66,7 +85,7 @@
bootloader, the code should not access outside the bounds of
structures.
2008-01-03 Jason Fleischli <jason.fleischli@hp.com>
2008-01-03 Jason Fleischli <fleischli@users.sourceforge.net>
* initrd.c -- Let the allocator decide where to grab the memory from
the efi memory map. Current start_addr=image->start_addr forces the
same efi region everytime, and has a 7mb limit. ramdisk (initrd.img)
@ -75,10 +94,10 @@
NULL at initialization forces alloc_pages to get a memory region
sufficient for the size of the initrd image.
2007-12-19 Jason Fleischli <jason.fleischli@hp.com>
2007-12-19 Jason Fleischli <fleischli@users.sourceforge.net>
* bumping version string to 3.8
2007-12-19 Jason Fleischli <jason.fleischli@hp.com>
2007-12-19 Jason Fleischli <fleischli@users.sourceforge.net>
* MORE PATCHES FROM INTEL FOR IA32 X86_64.
* Fix compile warning for cmdline_addr assignment.
* Fix an issue caused by uninitialized e820_nr_map in fill_e820map.
@ -103,13 +122,13 @@
* E820 memory map is added to IA32 to make it possible for
Linux kernel not to depend on EFI memory map on EFI 32.
2007-09-27 Jason Fleischli <jason.fleischli@hp.com>
2007-09-27 Jason Fleischli <fleischli@users.sourceforge.net>
* updating changelog for last commit that was omitted
* incorporating AGriffis patches to enhance parsing
passes root= option to kernel options and accounts for -- option
designation.
2007-07-19 Jason Fleischli <jason.fleischli@hp.com>
2007-07-19 Jason Fleischli <fleischli@users.sourceforge.net>
* Integrated x86_64 support patches from Chandramouli Narayanan
<mouli@linux.intel.com> changes summarized in following bullets.
* alloc.c -- adds patch contributors credit to copyright

View File

@ -61,14 +61,17 @@ EFICRT0 = /usr/lib
CDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
TOPDIR =
ALLSUBDIRS = ia32 ia64 x86_64 fs choosers devschemes tools
ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,)
HOSTARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH | sed s,i[3456789]86,ia32, | sed s,amd64,x86_64, )
ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH | sed s,i[3456789]86,ia32, | sed s,amd64,x86_64, )
INCDIR = -I. -I$(TOPDIR) -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol -I$(TOPDIR)/efi110
CPPFLAGS = -DCONFIG_$(ARCH)
OPTIMFLAGS = -O2
DEBUGFLAGS = -Wall
CFLAGS = $(OPTIMFLAGS) -fno-stack-protector -fno-strict-aliasing -fpic -fshort-wchar $(DEBUGFLAGS)
CFLAGS = $(ARCH3264) $(OPTIMFLAGS) -fno-stack-protector -fno-strict-aliasing -fpic -fshort-wchar $(DEBUGFLAGS)
ASFLAGS = $(ARCH3264)
LDFLAGS = -nostdlib -znocombreloc
INSTALL = install
@ -108,10 +111,30 @@ OBJCOPY = $(prefix)objcopy
# Use Modified binutils that supports x86_64 using UEFI ABI
ifeq ($(ARCH), x86_64)
ifeq ($(HOSTARCH), ia32)
ARCH3264 = -m64
LD3264 = -melf_x86_64
GNUEFILIB := $(GNUEFILIB)64
EFILIB := $(EFILIB)64
EFICRT0 := $(EFICRT0)64
endif
CFLAGS += -DEFI_FUNCTION_WRAPPER
OBJCOPY = /usr/bin/objcopy
endif
ifeq ($(ARCH), ia32)
ifeq ($(HOSTARCH), x86_64)
ARCH3264 = -m32
LD3264 = -melf_i386
GNUEFILIB := /usr/lib32
EFILIB := /usr/lib32
EFICRT0 := /usr/lib32
endif
endif
ifeq ($(ARCH),ia64)
GCC_VERSION=$(shell $(CROSS_COMPILE)$(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.')

View File

@ -25,15 +25,19 @@
# to use this program.
#
include Make.defaults
TOPDIR=.
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/Make.defaults
TOPDIR = $(SRCDIR)
CRTOBJS = $(EFICRT0)/crt0-efi-$(ARCH).o
LDSCRIPT = $(EFICRT0)/elf_$(ARCH)_efi.lds
LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L$(EFILIB) -L$(GNUEFILIB) $(CRTOBJS)
LOADLIBES = -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name)
LOADLIBES = -lefi -lgnuefi $(shell $(CC) $(ARCH3264) -print-libgcc-file-name)
FORMAT = efi-app-$(ARCH)
FILESYSTEM =
@ -87,12 +91,13 @@ fileops.o : Make.defaults
chooser.o : Make.defaults
$(SUBDIRS): dummy
$(MAKE) -C $@
mkdir -p $@
$(MAKE) -C $@ -f $(SRCDIR)/../$@/Makefile SRCDIR=$(SRCDIR)/../$@ ARCH=$(ARCH)
dummy:
clean:
@set -e ; for d in $(SUBDIRS) ; do $(MAKE) -C $$d $@ ; done
@set -e ; for d in $(ALLSUBDIRS) ; do $(MAKE) -C $$d $@ ; done
rm -f $(TARGETS) *~ *.so $(FILES)
.PRECIOUS: elilo.so
@ -106,4 +111,4 @@ ifeq ($(GCC_VERSION),2)
@exit 1
endif
include Make.rules
include $(SRCDIR)/Make.rules

View File

@ -67,9 +67,6 @@ create_boot_params(CHAR16 *args, memdesc_t *initrd, memdesc_t *vmcode, UINTN *co
/*
* Allocate memory for boot parameters.
* This CANNOT be EfiLoaderData or EfiLoaderCode as the kernel
* frees this region when initializing.
* FIXME: Is this a bug? (since the memory type *is* EfiLoaderData)
*/
bp = (boot_params_t *)alloc(BOOT_PARAM_MEMSIZE, EfiLoaderData);

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=
@ -47,7 +52,8 @@ $(TARGET): $(TOPDIR)/Make.defaults $(FILES)
echo "You need to define at least one chooser in Make.defaults"; \
exit 1; \
fi
$(LD) -o $@ -r $(FILES)
$(LD) $(LD3264) -o $@ -r $(FILES)
clean:
$(RM) -f $(TARGET) $(FILES)

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=simple.o
@ -40,7 +45,7 @@ all: $(TARGET)
# without doing make clean.
#
$(TARGET): $(FILES)
$(LD) -r -o $@ $(FILES)
$(LD) $(LD3264) -r -o $@ $(FILES)
clean:
$(RM) -f $(TARGET) $(FILES)

522
docs/README.txt Normal file
View File

@ -0,0 +1,522 @@
--------------------------------------------------------------------
ELILO.EFI: Linux boot loader for
EFI/IA-64,EFI/IA-32 and EFI/x86_64 based systems
--------------------------------------------------------------------
Stephane Eranian <eranian@hpl.hp.com>
August 2003
Copyright (C) 2000-2012 Hewlett-Packard Co.
Copyright (C) 2006-2010 Intel Co.
I/ Introduction
------------
This document describes how to use ELILO on for IA-64, IA-32 and x86_64 EFI-based platforms.
This document describes ELILO version 3.7 - 3.14.
II/ Command line options
--------------------
elilo [-hDpPVvaE] [-d nsec] [-C config] [-i initrd] [-c chooser] [kernel [kernel options...]]
-h Display a list of all possible command line options.
-V Print the version number and exit.
-d nsec Specify the number of 10th of seconds before loading the
kernel.
-C file Specify the config file to use. The default is elilo.conf in the directory
that elilo.efi was loaded from.
-P Verify config file syntax only. this option causes ELILO to
parse the config file and generate a report on the console.
No kernel is loaded.
-v Turn on verbose mode. ELILO prints more message about what it
is doing. For each occurrence of this option the verbosity level
is increased by one. The maximum level is 5.
-a Always check for alternate kernel image. The default behavior
of ELILO is to NOT look for an alternate image. This
option overrides this behavior and ELILO is checking for
alternate images no matter what. Alternate images are
specified using the EliloAlt EFI variable.
-p force interactive prompt mode. Valid when no kernel image is
specified on the command line.
-D print debug output.
-E don't force EDD30 variable to TRUE when FALSE.
-i file Use file as the initial ramdisk (initrd).
-c name Specify which kernel chooser to use. Default is 'simple', and
the only other choice at present is 'textmenu'.
In addition, elilo supports platform specific options:
For IA-64:
----------
-r the kernel image can be relocated if initial load address is not
available. This options requires a special version of the kernel.
-F file will try to load the FPSWA driver indicated by 'file'. Only this file
will be attempted. When no specific file is given, elilo will try
loading \efi\intel firmware\fpswa.efi from all accessible EFI system
partitions.
For IA-32:
----------
no option defined.
All file names (including the kernel file) can include a device name using the
following syntax:
dev_name:/path/to/my/kernel
The 'dev_name' component depends on the naming scheme selected and the detected
devices for your system. Some choosers may print the information automatically
or on demand, see chooser specific documentation for more on this. See README.devschemes
for more information on device naming schemes. The slash character '/' can be used as
a directory separator on any file systems including the EFI file system (FAT32).
For x86_64:
----------
none
III/ Configuration File
------------------
ELILO supports a config file with options similar to the LILO/x86 boot loader.
Elilo will use the following sequence (shown in order) when looking for its config
file when none is specified on the command line:
1/ AABBCCDD.conf (netbooting with regular DHCP)
where AABBCCDD is the hexadecimal representation
of the IP address assigned during the DHCP phase.
2/ elilo-ia64.conf or elilo-ia32.conf or elilo-x86_64.conf
The choice depends on the client platform. This step allows
the same DHCP/PXE server to provide files for both types of clients.
3/ elilo.conf
Unless explicitly specified on the command line, elilo looks for its config file
in the filesystem and directory it was loaded from. For instance, if elilo.efi
is invoked as:
fs0:\> \efi\debian\elilo.efi
Then elilo will look for its configuration file in fs0:\efi\debian and not
in the root directory of fs0:. The prefix fs0:\efi\debian will be used for
all other files that elilo needs to download when their paths are specified
as being relative.
IMPORTANT:
This rule also applies when a specific config file is passed via the -C
option. For example:
fs0:\> \efi\debian\elilo.efi -C elilo.conf
This will look for elilo.conf in fs0:\efi\debian and not in fs0:\.
To get to the elilo.conf in fs0:\, you need to specify the absolute
path:
fs0:\> \efi\debian\elilo.efi -C \elilo.conf
The configuration file is an ASCII file and not a UNICODE file.
The config file contains additional options to change the behavior of the loader.
If the same option is specified in the config file AND on the command line, the
latter takes precedence. Not all options available in the config file have an
equivalent on command line.
When elilo is invoked with the -h option, it prints the list of support command line
options but also the list of config file options. For each option it also prints
the type of data expected.
The config file options are divided in 2 groups:
- image options which are specific to a particular kernel image. Each kernel image
must be identified with a logical name called a label.
- global options which affect the behavior of ELILO and apply to all images.
The ELILO config file follows the LILO/x86 syntax. First come the global
options, then the list of images and options for each of them, if
necessary. At least one image MUST be defined and it is possible to have
an empty list of global options.
Options have types. Three types are defined:
- boolean: set or not set
- string : a string of characters which can be quoted if necessary
- number (in decimal)
- filename: a string interpreted as a file name
The config file supports the following options:
Global Options:
---------------
default=value Name the default image to boot. If not defined ELILO
will boot the first defined image.
timeout=number The number of 10th of seconds to wait while in
interactive mode before auto booting default kernel.
Default is infinity.
delay=number The number of 10th of seconds to wait before
auto booting when not in interactive mode.
Default is 0.
prompt Force interactive mode
verbose=number Set level of verbosity [0-5]. Default 0 (no verbose)
root=filename Set global root filesystem for Linux/ia64
read-only Force root filesystem to be mounted read-only
append=string Append a string of options to kernel command line
initrd=filename Name of initrd file
image=filename Define a new image
chooser=name Specify kernel chooser to use: 'simple' or 'textmenu'.
message=filename a message that is printed on the main screen if supported by
the chooser.
fX=filename Some choosers may take advantage of this option to
display the content of a file when a certain function
key X is pressed. X can vary from 1-12 to cover
function keys F1 to F12.
noedd30 do not force the EDD30 EFI variable to TRUE when FALSE. In other
words, don't force the EDD30 mode if not set.
Image options:
--------------
root=filename Set root filesystem for kernel
read-only Force root filesystem to be mounted read-only
append=string Append a string of options to kernel command line
initrd=filename Name of initrd file
label=string Logical name of image (used in interactive mode)
description=string One line text description of the image.
IA-64 specific options:
-----------------------
Global options:
---------------
fpswa=file Specify the filename for a specific FPSWA to load.
If this option is used then no other file will be tried.
relocatable In case of memory allocation error at initial load point of
kernel, allow attempt to relocate (assume kernels is relocatable)
Image options:
--------------
relocatable In case of memory allocation error at initial load point of
kernel, allow attempt to relocate (assume this kernel is relocatable)
IA-32 specific options:
-----------------------
legacy-free Indicate that the host machine does not have a legacy BIOS at all.
The user can specify a kernel and related kernel options using the image label. Alternatively,
the user can also specify a kernel file that is not specified in the config file. In any case,
some of the global options (such as append) are always concatenated to whatever the user type.
x86_64 specific options:
-----------------------
text-mode elilo>=3.14 boolean, image config option to force text console mode.
IV/ Booting from the local system
-----------------------------
The elilo.efi binary must be in an EFI system partition (FAT32). The config
file, kernel image, and optional initrd ramdisk can be on the same partition
or even another EFI partition. In the following discussion we assume that all
files are on the same EFI partition which is recognized by the EFI shell (nshell)
as fs0. The kernel and initrd can be copied from the any linux filesystems to the
EFI partition using either the mtools (mcopy) or by mounting the EFI partition as
a vfat partition. However you do not really need this because most linux
distributions install both files in the EFI partition and mount this partition in /boot/efi.
To boot a kernel, simply power cycle the machine. Once you get to the EFI
shell prompt, change to the filesystem that maps to the partition where elilo is.
Shell> fs0:
fs0:\>
You might need to make sure that the Shell Path is set such that it will load
ELILO from fs0:. You can verify this by typing:
fs0:\> set
path : fs0:\
At this point you can invoke ELILO:
fs0:\> elilo
If there is no config file, then it will:
- pick up the kernel image named vmlinux if it exists, otherwise it will abort.
- pass no argument to the kernel.
You can specify the kernel image and its options on the command line.
For instance you can do:
fs0:\> elilo vmlinux root=/dev/sda5
You can specify as many parameters as you want. The syntax follows the kernel
rule, i.e., list of value pairs (or even single values) separated by space.
A more complicated example would be:
fs0:\> elilo -i initrd-2.4.9 vmlinuz-2.4.9 root=/dev/sda2 console=tty0 console="ttyS0,115200n8"
In this example, notice the double quotes. They are required because the comma is a control
character for nshell.
In the case a config file is found, then elilo will behave according to
the options in that file. However if elilo is invoked with command line options, they
will be combined or they will override (if conflicting) what is defined in the config file.
As of version 3.3, elilo is fully compliant with the EFI specification (1.10) with regards
to where the bootloader (elilo.efi) must be located in the EFI system partition. In
section 11.2.1.3 of the EFI1.10 specification, it is said that in order to avoid conflicts
between various loaders for various OSes or distributions of the same OS, every vendor MUST
use a dedicated directory: \EFI\vendor\. The bootloader must be placed in this directory.
This has always been possible as this is a matter of creating the directory and copying
the elilo.efi file in it. However up until version 3.3, elilo would look for its config file
and kernel/initrd in the root (/) of the partition it was loaded from. As of version 3.3,
elilo will now ONLY look for its configuration file FROM THE DIRECTORY IT WAS LOADED FROM.
The same applies to the kernel and initrd files unless absolute paths are specified. Let us
look at a simple example:
- suppose elilo.efi is in \EFI\DIST if fs0: (for the EFI Shell)
- if you invoke elilo as follows:
fs0:\> \efi\dist\elilo -v -p
default file path: \efi\dist\
config file : \efi\dist\elilo.conf
ELILO boot:
Note that this is the same if you invoke elilo directly from \efi or \efi\dist.
File references in the configuration file are treated as relative to the directory
elilo was loaded from except if they use an absolute path.
As of version 3.4 a similar rule applies to the network boot sequence, see netbooting.txt
for details.
V/ Interactive mode
----------------
Elilo can be forced into interactive mode using the "prompt" option in the config
file or with the -p option. In this mode, the user can select a kernel to load.
The interface depends on the chooser, it may be a simple command line prompt as provided
by the simple chooser or a more sophisticated screen with scroll menus as provided by
textmenu. Most choosers depends on the elilo config file to get the information they
display. The simple chooser can operated without the elilo config file. However it
is always better to have this file, to create handy logical names for each possible
boot choices. The logical names are specified with the "label" option in the config
file. They represent a specific kernel "image" and its specific options.
In elilo, the user can select a particular kernel image using the corresponding label
name. A simple example is as follows:
If we suppose that the following is defined in elilo.conf:
image=vmlinuz-2.4.9
label=linux-up
initrd=initrd-2.4.9
root=/dev/sda2
append="console=tty0 console=ttyS0,115200n8"
then the user can specify linux-up at the prompt and elilo will load the
vmlinuz-2.4.9 kernel file and the initrd-2.4.9 ramdisk and will pass
"root=/dev/sda2 console=tty0 console=ttyS0,115200n8"
as command line arguments to the kernel.
This behavior is identical to Lilo/x86. However, elilo further allows the user
to specify actual kernel files names as well, i.e., kernels that are not defined
in the configuration file. If we reuse the above example and the simple chooser,
the user can type:
ELILO boot: vmlinux-2.4.18 root=/dev/sda2
and elilo will boot the vmlinuz-2.4.18 kernel if it exists.
VI/ The alternate kernel image
--------------------------
Oftentimes when debugging kernels you want to reboot the machine once with
your test kernel and, if something goes wrong, you want to fall back to a more
stable kernel. In addition you want to be able to do this from a remote machine.
Many things can go wrong when doing kernel debugging. It could be that you don't
even reach user-mode. In this case however, you still want to fall back to
a stable kernel. The feature you'd like from a boot loader is 'boot once and
then fall back to safe kernel'.
Elilo offers this feature and it's called 'alternate kernel image'.
You can configure elilo to load a kernel only once and then whatever
happens the next reboot falls back to a different kernel hopefully more stable.
To do this, elilo relies on an EFI variable called 'EliloAlt' with a NULL GUID.
The content of this variable is a UNICODE string containing the kernel file name
and its command line options.
When the -a option is specified on the command line or if the "checkalt" option
is present in the config file, elilo will check for the presence of this variable.
If found and the content is a valid UNICODE string, elilo will use it as the kernel
to boot. There is no verification made on the validity of the kernel name or options.
Then the variable is deleted. If the variable is rejected because it does not look
sane, it is also deleted.
The variable can be set from a running Linux system using the /proc/efi/vars
interface. In the tools directory of this package, there is a Linux tool called
elilovar which can be used to create, modify, print, and delete the EliloAlt
variable. Refer to eliloalt.txt for more information on this tool.
VII/ Auto booting the machine
-----------------------
Once you're satisfied with your machine setup, it is good to install an
auto boot procedure. You have two options to do this:
- from the EFI boot manager menu
- from the EFI shell
The first option is preferred and is used by most Linux distributions.
Elilo can be invoked directly from the boot manager. You need to get into
the 'boot maintenance' menu and use load file a file. This can be tedious
so instead it is recommended that you use a Linux tool called efibootmgr
which is also shipped in most distributions. With this tool, you can
create your own boot option and change the boot order.
The second approach use the EFI shell and a shell script with a special name: 'startup.nsh'.
When the system boots, it looks for EFI partitions and if it finds
a 'startup.nsh' file in ANY of these it will jumpstart execution from it.
So the typical way of auto booting your Linux/ia64 system is to simply create
such a file with the following content:
# cat /boot/startup.nsh
elilo vmlinuz root=/dev/sda2
Of course, this can be simplified if there is a configuration file.
VII/ Netbooting
----------
Please refer to netbooting.txt for a complete description of how to boot
from the network.
XII/ Booting on EFI/ia32 platforms
-----------------------------
Until PC comes with the EFI firmware built in, you need to boot from a
floppy that has the EFI firmware on it. Such floppy can be
constructed from the EFI sample implementation and toolkit that is
available from the Intel Developer Web site at:
http://developer.intel.com/technology/efi/
To use elilo on IA-32, you can put it on a floppy and
on a FAT32 partition (msdos partition). You can also
netbooting if you network adapter has support for UNDI/PXE.
Elilo/ia32 is capable of booting unmodified 2.2.x. and 2.4.x kernels
as they are shipped by distributors today (such as Redhat7.2). You don't need
to recompile the kernel with special options. Elilo ONLY takes compressed kernel
image which are typically obtained via a 'make bzImage'. Plain elf/32 kernel can't
be booted (plain vmlinux will not work). Similarly, existing initial ramdisks can
be used without modifications.
XIII/ Booting on EFI/x86_64 platforms
-----------------------------
To use elilo on x86_64, you can put it on a floppy and
on a FAT32 partition (msdos partition). You can also
netboot if your network adapter has support for UNDI/PXE.
Elilo/x86_64 requires efi64 enabled linux kernel (> 2.6.21).
You need to compile the kernel with CONFIG_EFI option.
x86_64 platforms with UEFI 2.0 firmware deprecate UGA protocol
and therefore only the Graphics Output Protocol (GOP) is supported. For
such platforms, the kernel must be configured with EFI_FB option. This
will enable early boot messages on the console. The elilo for x86_64
attempts to query the firmware for GOP and if it fails it defaults to
text mode. Elilo ONLY takes compressed kernel image which are
typically obtained via a 'make bzImage'. Plain elf/x86_64 kernel can't
be booted (plain vmlinux will not work). Similarly, existing initial
ramdisks can be used without modifications.
The x86_64 implementation converts the EFI memory map into E820 map and
passes it in the bootparameter supplied to the OS. For details on
bootparameter, see x86_64/sysdeps.h.
IX/ Credits
-------
Contributors:
Intel Corp.
Stephane Eranian <eranian@hpl.hp.com>
David Mosberger <davidm@hpl.hp.com>
Johannes Erdfelt <jerdfelt@valinux.com>
Richard Hirst <rhirst@linuxcare.com>
Chris Ahna <christopher.j.ahna@intel.com>
Mike Johnston <michael.johnston@intel.com>
Fenghua Yu <fenghua.yu@intel.com>
Bibo Mao <bibo.mao@intel.com>
Brett Johnson <brett@hp.com>
Jason Fleischli <Jason.Fleischli@hp.com>
Chandramouli Narayanan <mouli@linux.intel.com>
Maintainers:
Jason Fleischli <Jason.Fleischli@hp.com>
X/ Bug reports
-----------
Use the sourceforge bug submission system on the elilo sourceforge
project page for reporting including errors or descrepancies in this
document.
XIII/ Reference
---------
UEFI 2.0 specifications are available from the following web site:
http://www.uefi.org/home
EFI v1.02 specifications are available from the following web site:
http://developer.intel.com/technology/efi/
The latest sources of ELILO can be downloaded at:
https://sourceforge.net/projects/elilo/files/

View File

@ -6,7 +6,7 @@
August 2003
Copyright (C) 2000-2003 Hewlett-Packard Co.
Copyright (C) 2000-2012 Hewlett-Packard Co.
Copyright (C) 2006-2010 Intel Co.
@ -14,7 +14,7 @@ I/ Introduction
------------
This document describes how to use ELILO on for IA-64, IA-32 and x86_64 EFI-based platforms.
This document describes ELILO version 3.7.
This document describes ELILO version 3.7 - 3.14.
II/ Command line options
--------------------
@ -85,7 +85,7 @@ II/ Command line options
For x86_64:
----------
No new options.
none
III/ Configuration File
------------------
@ -243,7 +243,7 @@ III/ Configuration File
x86_64 specific options:
-----------------------
None yet.
text-mode elilo>=3.14 boolean, image config option to force text console mode.
IV/ Booting from the local system
-----------------------------
@ -481,6 +481,7 @@ XIII/ Booting on EFI/x86_64 platforms
IX/ Credits
-------
Contributors:
Intel Corp.
Stephane Eranian <eranian@hpl.hp.com>
David Mosberger <davidm@hpl.hp.com>
@ -490,14 +491,19 @@ IX/ Credits
Mike Johnston <michael.johnston@intel.com>
Fenghua Yu <fenghua.yu@intel.com>
Bibo Mao <bibo.mao@intel.com>
Brett Johnson <brett@hp.com>
Jason Fleischli <Jason.Fleischli@hp.com>
Chandramouli Narayanan <mouli@linux.intel.com>
Maintainers:
Jason Fleischli <Jason.Fleischli@hp.com>
X/ Bug reports
-----------
You can submit bugs to <eranian@hpl.hp.com> or to the Linux/ia64
mailing list at linux-ia64@linuxia64.org. Visit http://www.linuxia64.org
to subscribe to this list.
Use the sourceforge bug submission system on the elilo sourceforge
project page for reporting including errors or descrepancies in this
document.
XIII/ Reference
---------
@ -512,5 +518,5 @@ XIII/ Reference
The latest sources of ELILO can be downloaded at:
ftp://ftp.hpl.hp.com/pub/linux-ia64
https://sourceforge.net/projects/elilo/files/

Binary file not shown.

Binary file not shown.

Binary file not shown.

11
elilo.c
View File

@ -46,7 +46,7 @@
#include "loader.h"
#include "config.h" /* for config_init() */
#define ELILO_SHARED_CMDLINE_OPTS L"pPMC:aDhd:i:vVc:E"
#define ELILO_SHARED_CMDLINE_OPTS L"pPMC:aDhd:i:m:vVc:E"
elilo_config_t elilo_opt;
@ -240,7 +240,7 @@ main_loop(EFI_HANDLE dev, CHAR16 **argv, INTN argc, INTN index, EFI_HANDLE image
}
do_launch:
r =subst_vars(cmdline_tmp, cmdline, CMDLINE_MAXLEN);
r = subst_vars(cmdline_tmp, cmdline, CMDLINE_MAXLEN);
VERB_PRT(3, Print(L"final cmdline(%d): %s\n", r, cmdline));
@ -481,7 +481,12 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *system_tab)
* mode.
* XXX: clean this up !
*/
uefi_call_wrapper(BS->SetWatchdogTimer, 4, 0, 0x0, 0, NULL);
uefi_call_wrapper(BS->SetWatchdogTimer, 4, 0, 0x0, 0, NULL);
/*
* start a clean console
*/
uefi_call_wrapper(systab->ConOut->Reset, 2, systab->ConOut, FALSE);
/* initialize memory allocator */
if (alloc_init() == -1) return EFI_LOAD_ERROR;

View File

@ -29,7 +29,7 @@
#ifndef __ELILO_H__
#define __ELILO_H__
#define ELILO_VERSION L"3.14"
#define ELILO_VERSION L"3.16"
#include <efi.h>

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=
ifeq ($(CONFIG_localfs),y)
@ -59,7 +64,7 @@ $(TARGET): $(TOPDIR)/Make.defaults $(FILES)
echo "You need to define at least one filesystem in Make.defaults"; \
exit 1; \
fi
$(LD) -r -o $@ $(FILES)
$(LD) $(LD3264) -r -o $@ $(FILES)
clean:
$(RM) -f $(TARGET) $(FILES)

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=system.o config.o bzimage.o plain_loader.o gzip_loader.o gzip.o
@ -37,13 +42,13 @@ all: $(TARGET)
system.o: rmswitch.h
rmswitch.h: bin_to_h.c rmswitch.S
$(CC) -o bin_to_h bin_to_h.c
$(AS) -o rmswitch.o rmswitch.S
$(CC) -o bin_to_h $(SRCDIR)/bin_to_h.c
$(AS) -o rmswitch.o $(SRCDIR)/rmswitch.S
$(LD) -Ttext 0x0 -s --oformat binary -o rmswitch rmswitch.o
./bin_to_h <rmswitch >rmswitch.h
$(TARGET): $(FILES)
$(LD) -r -o $@ $(FILES)
$(LD) $(LD3264) -r -o $@ $(FILES)
clean:
$(RM) -f $(TARGET) $(FILES)

View File

@ -207,19 +207,8 @@ static INTN get_video_info(boot_params_t * bp) {
(VOID **)Gop_handle);
if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL) {
Print(L"LocateHandle GopProtocol failed.\n");
Print(L"--Either no graphics head is installed,\n" \
"--efi console is set to serial, or,\n" \
"--the EFI firmware version of this machine is\n" \
"--older than UEFI 2.0. and does not support GOP");
Print(L"you can SAFELY IGNORE this error. elilo will\n" \
"default to text-mode.\n Alternatively you can " \
"now force text mode by setting config variable\n" \
"text_mode=1 for x86 in elilo.conf or via cmdline.\n\n");
Print(L"However if this is the last text output you see\n" \
"ensure that your kernel console command line\n " \
"variable matches up with the actual efi boot menu\n" \
"console output settings. for example efi console\n\n");
Print(L"EFI returned no GoP handle, No Graphics Output Device?\n");
Print(L"--Elilo will try to default to console text mode.\n");
return -1;
}
Gop_handle = alloc(size, 0);
@ -488,9 +477,6 @@ sysdeps_create_boot_params(
*/
if (param_start != NULL) {
CopyMem(bp, param_start, 0x2000);
free(param_start);
param_start = NULL;
param_size = 0;
}
/*
* Save off our header revision information.

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=system.o config.o fpswa.o plain_loader.o gzip_loader.o \
gzip.o memset.o memcpy.o setjmp.o longjmp.o

View File

@ -1,44 +1,47 @@
3 . 1 4 R E L E A S E N O T E S
3 . 1 6 R E L E A S E N O T E S
===================================
QUICK CHANGE SUMMARY
====================
* Fixes for newly emerging x86_64 UEFI-2 boxes where long standing old
assumptions are borked.
* Uptake of SUSE and community patches
- add sysfs support for efi vars (formerly /proc/efi/vars)
- fix strncpy overflow
- fix bzimage alloc
- cleanups
- support longer command line
- yet some more mac fixes
- align elilo with latest kernel boot protocol format.
- new memory management strategy for initrd and kernel image loading.
* add text-mode command line option, force text-mode (bypass graphics probes).
* replace error output on GOP handle failed, downgraded to normal
print status with more informative output.
* Fix ia32 build issue with new gcc due to stack protector enforcement.
* Adds native x86x crossbuild functionality
build 32bit or 64bit versions from either environment via
make ARCH=ia32|x86_64 (the ARCH IS case sensitive).
make by itself will default to the native host arch.
* Add console reset call during initialization. thanks A. Steinmetz
* simplify output of no GOP warning text so it no longer looks like an error.
* MAJOR: Fixed Fault crash when EFI memory map changes from under elilo.
(from an outside interrupt in this case). When the EFI Memory map
changes after elilo has already built boot params to pass to the
kernel the EFI call to ExitBootSvcs just prior to boot will fail
because elilo has the old map key. This is valid EFI behavior, elilo
retries to pick up the new memory map and key but had already freed
the start params portion of boot params resulting in a NULL DEREF
crash reset once it hands the now bogus boot params to the kernel on
the 2nd successful call to exit efi and boot.
Thanks to Jerry Hoemann @ HP for reporting this bug.
* minor bugfix, fixed -m option broken. thanks Allan-lsk.
BUILD NOTES
====================
You will need the following toolchain to build elilo-3.14 from source
the elilo build environment is optimized for Debian and Debian based distros.
elilo-3.14 was built in the Debian Lenny (Ubuntu 10.04) build environment.
elilo-3.16 was built in the squeeze+(ubuntu 11.x) build environments except
for itanium which is unchanged to best support legacy enterprise configs.
Toolchain versions for this release were:
x86x(32 &64)
* gnu-efi --> 3.0i-2ubuntu1
* gcc ------> 4.4.3-1ubuntu1
* binutils -> 2.20.1-3ubuntu7
x86x(32 & 64bit versions)
* gnu-efi --> 3.0i-3
* gcc ------> 4:4.4.4-1ubuntu2
* binutils -> 2.20.51.20100908-0ubuntu2
ia64
* gnu-efi --> 3.0e-2
* gcc ------> 4.3.2-2
* binutils -> 2.18.1~cvs20080103-7
* if you use a debian based (lenny)build environment you will have no problems
* if you use a debian based build environment you will have no problems
and setting it up is simple. you will be able to build elilo in 3 steps:
1. apt-get install gnu-efi, gcc, binutils
2. apt-get source elilo (or download elilo-3.14.tar.gz from SourceForge.)
3. extract source tarball and cd ./elilo-3.14 and type $> make
2. apt-get source elilo (or download elilo-3.16 source from SourceForge.)
3. extract source tarball and cd to ./$your-elilo-source and type $> make
** If you use the upstream toolchain tarballs(i.e. pre distro) you will need
@ -113,3 +116,4 @@ Additionally from ...kernel-source/Documentation/Boot.txt...
description="Ubuntu 2.6.32-27-generic kernel"
initrd=/initrd.img-2.6.32-27-generic

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=eliloalt.o
TARGET=eliloalt

View File

@ -23,10 +23,15 @@
# to use this program.
#
include ../Make.defaults
include ../Make.rules
SRCDIR = .
VPATH = $(SRCDIR)
include $(SRCDIR)/../Make.defaults
include $(SRCDIR)/../Make.rules
TOPDIR=$(SRCDIR)/..
TOPDIR=$(CDIR)/..
FILES=system.o config.o bzimage.o plain_loader.o gzip_loader.o gzip.o
#FILES=system.o config.o plain_loader.o
@ -38,13 +43,13 @@ all: $(TARGET)
system.o: rmswitch.h
rmswitch.h: bin_to_h.c rmswitch.S
$(CC) -o bin_to_h bin_to_h.c
$(AS) -o rmswitch.o rmswitch.S
$(CC) -o bin_to_h $(SRCDIR)/bin_to_h.c
$(AS) -o rmswitch.o $(SRCDIR)/rmswitch.S
$(LD) -Ttext 0x0 -s --oformat binary -o rmswitch rmswitch.o
./bin_to_h <rmswitch >rmswitch.h
$(TARGET): $(FILES)
$(LD) -r -o $@ $(FILES)
$(LD) $(LD3264) -r -o $@ $(FILES)
clean:
$(RM) -f $(TARGET) $(FILES)

View File

@ -641,10 +641,8 @@ sysdeps_create_boot_params(
*/
if (param_start != NULL) {
CopyMem(bp, param_start, 0x2000);
free(param_start);
param_start = NULL;
param_size = 0;
}
/*
* Save off our header revision information.
*/
@ -703,10 +701,8 @@ sysdeps_create_boot_params(
DBG_PRT((L"initrd->start_addr="PTR_FMT" initrd->pgcnt=%d\n",
initrd->start_addr, initrd->pgcnt));
/* These RAMdisk flags are not needed, just zero them. NOT!*/
/* 'ramdisk_flags' (@0x1F8) is called 'ram_size' in the meantime, */
/* see Documentation/x86/boot.txt. */
if (initrd->start_addr && initrd->pgcnt) {
if ( (UINT64)initrd->start_addr > UINT32_MAX ) {
ERR_PRT((L"Start of initrd out of reach (>4GB)."));