diff --git a/ChangeLog b/ChangeLog index a1dc182..2ad51fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,22 @@ -2011-1-10 signed off by Jason Fleischli +2013-03-27 signed off by Jason Fleischli + * 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 * 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 +2009-10-22 signed off by Jason Fleischli * 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 + +2008-04-02 signed off by Jason Fleischli * 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 +2008-01-11 signed off by Jason Fleischli * Various compile warning cleanups. -2008-01-03 signed off by Jason Fleischli +2008-01-03 signed off by Jason Fleischli * Patch contribution from Scott Davilla 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 +2008-01-03 Jason Fleischli * 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 +2007-12-19 Jason Fleischli * bumping version string to 3.8 -2007-12-19 Jason Fleischli +2007-12-19 Jason Fleischli * 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 +2007-09-27 Jason Fleischli * 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 +2007-07-19 Jason Fleischli * Integrated x86_64 support patches from Chandramouli Narayanan changes summarized in following bullets. * alloc.c -- adds patch contributors credit to copyright diff --git a/Make.defaults b/Make.defaults index e541ea8..f372a1b 100644 --- a/Make.defaults +++ b/Make.defaults @@ -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'.') diff --git a/Makefile b/Makefile index f0efebd..6315960 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/bootparams.c b/bootparams.c index 576a579..12d11ce 100644 --- a/bootparams.c +++ b/bootparams.c @@ -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); diff --git a/choosers/Makefile b/choosers/Makefile index 9915f48..85d31c7 100644 --- a/choosers/Makefile +++ b/choosers/Makefile @@ -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) diff --git a/devschemes/Makefile b/devschemes/Makefile index 6ac05af..5328cb1 100644 --- a/devschemes/Makefile +++ b/devschemes/Makefile @@ -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) diff --git a/docs/README.txt b/docs/README.txt new file mode 100644 index 0000000..a3fcc69 --- /dev/null +++ b/docs/README.txt @@ -0,0 +1,522 @@ + -------------------------------------------------------------------- + ELILO.EFI: Linux boot loader for + EFI/IA-64,EFI/IA-32 and EFI/x86_64 based systems + -------------------------------------------------------------------- + Stephane Eranian + + 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 + David Mosberger + Johannes Erdfelt + Richard Hirst + Chris Ahna + Mike Johnston + Fenghua Yu + Bibo Mao + Brett Johnson + Jason Fleischli + Chandramouli Narayanan + + Maintainers: + Jason Fleischli + +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/ + diff --git a/docs/elilo.txt b/docs/elilo.txt index 3de7501..a3fcc69 100644 --- a/docs/elilo.txt +++ b/docs/elilo.txt @@ -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 David Mosberger @@ -490,14 +491,19 @@ IX/ Credits Mike Johnston Fenghua Yu Bibo Mao + Brett Johnson + Jason Fleischli Chandramouli Narayanan + + Maintainers: + Jason Fleischli X/ Bug reports ----------- - You can submit bugs to 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/ diff --git a/elilo-ia32.efi b/elilo-ia32.efi index c28def3..431f2b4 100755 Binary files a/elilo-ia32.efi and b/elilo-ia32.efi differ diff --git a/elilo-ia64.efi b/elilo-ia64.efi index 79c8666..0004e55 100755 Binary files a/elilo-ia64.efi and b/elilo-ia64.efi differ diff --git a/elilo-x86_64.efi b/elilo-x86_64.efi index dc38c43..3dc8295 100755 Binary files a/elilo-x86_64.efi and b/elilo-x86_64.efi differ diff --git a/elilo.c b/elilo.c index ade977d..34835f9 100644 --- a/elilo.c +++ b/elilo.c @@ -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; diff --git a/elilo.h b/elilo.h index bd0cd0b..041ff1e 100644 --- a/elilo.h +++ b/elilo.h @@ -29,7 +29,7 @@ #ifndef __ELILO_H__ #define __ELILO_H__ -#define ELILO_VERSION L"3.14" +#define ELILO_VERSION L"3.16" #include diff --git a/fs/Makefile b/fs/Makefile index 8e422b2..0bb303f 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -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) diff --git a/ia32/Makefile b/ia32/Makefile index 353ae67..c5f421b 100644 --- a/ia32/Makefile +++ b/ia32/Makefile @@ -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.h $(TARGET): $(FILES) - $(LD) -r -o $@ $(FILES) + $(LD) $(LD3264) -r -o $@ $(FILES) clean: $(RM) -f $(TARGET) $(FILES) diff --git a/ia32/system.c b/ia32/system.c index 520946a..876b68c 100644 --- a/ia32/system.c +++ b/ia32/system.c @@ -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. diff --git a/ia64/Makefile b/ia64/Makefile index a243d0f..bee0a2b 100644 --- a/ia64/Makefile +++ b/ia64/Makefile @@ -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 diff --git a/release.notes b/release.notes index 51db8e3..411f047 100644 --- a/release.notes +++ b/release.notes @@ -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 + diff --git a/tools/Makefile b/tools/Makefile index 8858224..97083d7 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -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 diff --git a/x86_64/Makefile b/x86_64/Makefile index 4af4b8d..7ade312 100644 --- a/x86_64/Makefile +++ b/x86_64/Makefile @@ -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.h $(TARGET): $(FILES) - $(LD) -r -o $@ $(FILES) + $(LD) $(LD3264) -r -o $@ $(FILES) clean: $(RM) -f $(TARGET) $(FILES) diff --git a/x86_64/system.c b/x86_64/system.c index 44c2e46..089f1f5 100644 --- a/x86_64/system.c +++ b/x86_64/system.c @@ -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)."));