From cb533a5de522c4a6983394e9457609edd1ed9898 Mon Sep 17 00:00:00 2001 From: Stephane Eranian Date: Tue, 24 Feb 2004 08:17:30 -0500 Subject: [PATCH] release 3.5-pre1 https://sourceforge.net/projects/elilo/files/elilo/elilo-3.5pre1/ --- ChangeLog | 8 + Make.defaults | 5 +- TODO | 2 - choosers/simple.c | 1 + choosers/textmenu.c | 1 + config.c | 47 +- docs/netbooting.txt | 18 +- elilo-ia32.efi | Bin 159859 -> 197729 bytes elilo-ia64.efi | Bin 348238 -> 356430 bytes elilo.c | 28 +- elilo.h | 11 +- fileops.c | 60 +- fileops.h | 8 +- glue_localfs.c | 6 +- glue_netfs.c | 57 +- gnu-efi-3.0a-ia32.patch | 19 - ia32/Makefile | 2 +- ia32/bzimage.c | 224 ++++++++ ia32/gzip.c | 552 ++++++++++++++++++ ia32/gzip.h | 35 ++ ia32/gzip_loader.c | 79 +++ ia32/inflate.c | 1205 +++++++++++++++++++++++++++++++++++++++ ia32/plain_loader.c | 285 +++++++++ ia32/sysdeps.h | 44 +- ia32/system.c | 363 ++---------- 25 files changed, 2583 insertions(+), 477 deletions(-) mode change 100755 => 100644 elilo-ia32.efi mode change 100755 => 100644 elilo-ia64.efi delete mode 100644 gnu-efi-3.0a-ia32.patch create mode 100644 ia32/bzimage.c create mode 100644 ia32/gzip.c create mode 100644 ia32/gzip.h create mode 100644 ia32/gzip_loader.c create mode 100644 ia32/inflate.c create mode 100644 ia32/plain_loader.c diff --git a/ChangeLog b/ChangeLog index 07aba8e..55dad01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-02-19 Brett Johnson + * Fixed bug where default image initrd would carry over to another + image that was selected interactively (iff the newly selected image + did not have an initrd). + * Added support for subnet-specific config files in netfs. +2004-02-17 Brett Johnson + * integrated ia32 compressed kernel support from Matt Tolentino + 2003-08-20 Stephane Eranian * released 3.4 2003-08-19 Stephane Eranian diff --git a/Make.defaults b/Make.defaults index 523f0fc..48baaea 100644 --- a/Make.defaults +++ b/Make.defaults @@ -68,7 +68,7 @@ CPPFLAGS = -DCONFIG_$(ARCH) OPTIMFLAGS = -O2 DEBUGFLAGS = -Wall CFLAGS = $(OPTIMFLAGS) -fpic -fshort-wchar $(DEBUGFLAGS) -LDFLAGS = -nostdlib +LDFLAGS = -nostdlib -znocombreloc INSTALL = install ifeq ($(CONFIG_machspec_netconfig),y) @@ -121,7 +121,8 @@ CFLAGS += -mfixed-range=f32-f127 else ifeq ($(ARCH),ia32) prefix = - CC = $(prefix)gcc3 +# CC = $(prefix)gcc3 + CC = $(prefix)gcc AS = $(prefix)as LD = $(prefix)ld AR = $(prefix)ar diff --git a/TODO b/TODO index d996a16..fb2696a 100644 --- a/TODO +++ b/TODO @@ -14,5 +14,3 @@ Some of the things TO DO: - Convert all filesystems (ext2fs, netfs) to use the FilesystemProtocol interface instead - cleanup x86 loader: use the same structure as IA-64 - - - support for subnetting in the config file when netbooting diff --git a/choosers/simple.c b/choosers/simple.c index 9b0725e..0af1fa7 100644 --- a/choosers/simple.c +++ b/choosers/simple.c @@ -346,6 +346,7 @@ restart: ret = wait_timeout(elilo_opt.delay); if (ret != 0) { elilo_opt.prompt = 1; + elilo_opt.initrd[0] = CHAR_NULL; elilo_opt.timeout = ELILO_TIMEOUT_INFINITY; goto restart; } diff --git a/choosers/textmenu.c b/choosers/textmenu.c index 9379b0e..aaf2a4b 100644 --- a/choosers/textmenu.c +++ b/choosers/textmenu.c @@ -459,6 +459,7 @@ restart: ret = wait_timeout(elilo_opt.delay); if (ret != 0) { elilo_opt.prompt = 1; + elilo_opt.initrd[0] = CHAR_NULL; elilo_opt.timeout = ELILO_TIMEOUT_INFINITY; goto restart; } diff --git a/config.c b/config.c index ac789b9..c556484 100644 --- a/config.c +++ b/config.c @@ -843,7 +843,7 @@ get_config_file(VOID) } EFI_STATUS -read_config(CHAR16 *filename, INTN retry) +read_config(CHAR16 *filename) { EFI_STATUS status; INTN ret; @@ -856,49 +856,8 @@ read_config(CHAR16 *filename, INTN retry) status = fops_open(filename, &config_fd); if (EFI_ERROR(status)) { - /* - * if the user explicitely specified a filename and we can't - * find it, then we must fail. - */ - if (elilo_opt.parse_only || retry == 0) { - VERB_PRT(3, Print(L"cannot open config file %s\n", filename)); - return status; - } - /* - * if not already submitted filename, - */ - if (StrCmp(filename, ELILO_ARCH_DEFAULT_CONFIG)) { - /* - * try the arch default file, now - */ - VERB_PRT(3,Print(L"config file %s not found, trying %s\n", - filename, ELILO_ARCH_DEFAULT_CONFIG)); - - StrCpy(global_config.config_file,ELILO_ARCH_DEFAULT_CONFIG); - - status = fops_open(ELILO_ARCH_DEFAULT_CONFIG, &config_fd); - } - /* - * if arch specific did not work, try generic - */ - if (EFI_ERROR(status) && StrCmp(filename, ELILO_DEFAULT_CONFIG)) { - /* - * try the default file as a last resort - */ - VERB_PRT(3,Print(L"config file %s not found, trying %s\n", - ELILO_ARCH_DEFAULT_CONFIG, ELILO_DEFAULT_CONFIG)); - - StrCpy(global_config.config_file, ELILO_DEFAULT_CONFIG); - status = fops_open(ELILO_DEFAULT_CONFIG, &config_fd); - } - /* - * if nothing worked, then bail out - */ - if (EFI_ERROR(status)) { - VERB_PRT(3, Print(L"no valid config file found\n")); - global_config.config_file[0] = CHAR_NULL; - return status; - } + VERB_PRT(3, Print(L"cannot open config file %s\n", filename)); + return status; } /* * start numbering at line 1 diff --git a/docs/netbooting.txt b/docs/netbooting.txt index 2f51740..130cc11 100644 --- a/docs/netbooting.txt +++ b/docs/netbooting.txt @@ -126,7 +126,21 @@ only on two very common cases: This filename is an opportunity to specify a machine specific configuration file. - 2) elilo-ia32.config or elilo-ia64.conf + 2) AA[BB[CC]][-ia32|ia64].conf + As of version 3.5, elilo will also look for IPv4 class A,B,C + subnet-specific versions of the config file. This is useful when you + want to have a common config file for all machines connected to a + particular subnet. + + For example, if your IP address is 10.0.0.1 (0A000001 in hex), elilo + will look first for 0A000001.conf, then 0A0000.conf, then 0A00.conf, + and finally 0A.conf. + + Elilo will also try architecture-specific versions of subnet-specific + config files first (So for example, on an Itanium system, + "0A0000-ia64.conf" will be tried before "0A0000.conf") + + 3) elilo-ia32.config or elilo-ia64.conf Depending on the machine (client side) architecture elilo will try the IA-32 or IA-64 file. @@ -135,7 +149,7 @@ only on two very common cases: This distinction between the architectures is useful when the same TFTP server services the two types of clients : IA32- and IA-64 machines. - 3) elilo.conf + 4) elilo.conf All files use the same format. Elilo will stop at the first match. In case no file is found, it will try to download a default kernel file name (vmlinux). diff --git a/elilo-ia32.efi b/elilo-ia32.efi old mode 100755 new mode 100644 index 3f8cd331af2ca272f7050217890bfe804ea00b9e..b2ca1c86f36ae382ce6d1b39feaec44a2aa7fdae GIT binary patch literal 197729 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 literal 159859 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 P^hJ5a_$`+VwhsKiXP1J@ diff --git a/elilo.c b/elilo.c index 0959c71..19731c9 100644 --- a/elilo.c +++ b/elilo.c @@ -368,8 +368,8 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *system_tab) CHAR16 dpath[FILENAME_MAXLEN]; CHAR16 *devpath; - //elilo_opt.verbose=3; - //elilo_opt.debug=1; + elilo_opt.verbose=0; + elilo_opt.debug=0; /* initialize global variable */ systab = system_tab; @@ -548,23 +548,37 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *system_tab) /* * set per fileops defaults files for configuration and kernel */ - fops_setdefaults(elilo_opt.default_config, elilo_opt.default_kernel, FILENAME_MAXLEN, devpath); + fops_setdefaults(elilo_opt.default_configs, elilo_opt.default_kernel, FILENAME_MAXLEN, devpath); /* * XXX: won't be visible if verbose not required from command line */ VERB_PRT(2,Print(L"Default config: %s\nDefault_kernel: %s\n", - elilo_opt.default_config,elilo_opt.default_kernel)); + elilo_opt.default_configs[0].fname, elilo_opt.default_kernel)); /* * use default config file if not specified by user */ - ptr = elilo_opt.config[0] == CHAR_NULL ? (retry=1,elilo_opt.default_config) : (retry=0,elilo_opt.config); + ptr = elilo_opt.config[0] == CHAR_NULL ? (retry=1,elilo_opt.default_configs[0].fname) : (retry=0,elilo_opt.config); /* * parse config file (verbose becomes visible if set) */ - ret = read_config(ptr, retry); - Print(L"read_config=%r\n", ret); + ret = read_config(ptr); + VERB_PRT(1,Print(L"read_config=%r\n", ret)); + + /* Only try the default config filenames if user did not specify a + * config filename on the command line */ + if (elilo_opt.config[0] == CHAR_NULL) { + while ((ret != EFI_SUCCESS) && + (retry < MAX_DEFAULT_CONFIGS) && + (elilo_opt.default_configs[retry].fname[0] != CHAR_NULL)) { + + ptr = elilo_opt.default_configs[retry].fname; + ret = read_config(ptr); + VERB_PRT(1,Print(L"read_config=%r\n", ret)); + retry += 1; + } + } /* * when the config file is not found, we fail only if: * - the user did not specified interactive mode diff --git a/elilo.h b/elilo.h index 9d28617..7f0d768 100644 --- a/elilo.h +++ b/elilo.h @@ -60,11 +60,17 @@ #define CMDLINE_MAXLEN 512 /* needed by ia32 */ #define FILENAME_MAXLEN 256 #define MAX_ARGS 256 +/* Just pick an arbitrary number that's high enough for now :o) */ +#define MAX_DEFAULT_CONFIGS 16 typedef struct { UINT8 nothing_yet; } image_opt_t; +typedef struct config_file { + CHAR16 fname[FILENAME_MAXLEN]; +} config_file_t; + typedef struct { /* * list of options controllable from both the command line @@ -91,7 +97,8 @@ typedef struct { sys_img_options_t *sys_img_opts; /* architecture depdendent per image options */ CHAR16 default_kernel[FILENAME_MAXLEN]; - CHAR16 default_config[FILENAME_MAXLEN]; + /* CHAR16 default_config[FILENAME_MAXLEN]; */ + config_file_t default_configs[MAX_DEFAULT_CONFIGS]; CHAR16 config[FILENAME_MAXLEN]; /* name of config file */ CHAR16 chooser[FILENAME_MAXLEN]; /* image chooser to use */ @@ -160,7 +167,7 @@ extern VOID ascii2U(CHAR8 *, CHAR16 *, UINTN); extern VOID U2ascii(CHAR16 *, CHAR8 *, UINTN); /* from config.c (more in config.h) */ -extern EFI_STATUS read_config(CHAR16 *, INTN retry); +extern EFI_STATUS read_config(CHAR16 *); extern VOID print_config_options(VOID); extern INTN find_label(CHAR16 *, CHAR16 *, CHAR16 *, CHAR16 *); extern VOID print_label_list(VOID); diff --git a/fileops.c b/fileops.c index 674fc5c..1678f0f 100644 --- a/fileops.c +++ b/fileops.c @@ -345,12 +345,37 @@ fops_seek(fops_fd_t fd, UINT64 newpos) } EFI_STATUS -fops_setdefaults(CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR16 *devpath) +fops_setdefaults(struct config_file *defconf, CHAR16 *kname, UINTN maxlen, CHAR16 *devpath) { -#define FILEOPS_DEFAULT_KERNEL L"vmlinux" -#define FILEOPS_DEFAULT_CONFIG L"elilo.conf" + INTN i; - if (config == NULL || kname == NULL) return EFI_INVALID_PARAMETER; +/* + * The first default config file is architecture dependent. This is useful + * in case of network booting where the server is used for both types of + * architectures. + */ +#if defined(CONFIG_ia64) +#define FILEOPS_ARCH_DEFAULT_CONFIG L"elilo-ia64.conf" +#elif defined (CONFIG_ia32) +#define FILEOPS_ARCH_DEFAULT_CONFIG L"elilo-ia32.conf" +#else +#error "You need to specfy your default arch config file" +#endif + +/* + * last resort config file. Common to all architectures + */ +#define FILEOPS_DEFAULT_CONFIG L"elilo.conf" + +#define FILEOPS_DEFAULT_KERNEL L"vmlinux" + +#ifdef ELILO_DEBUG + if (defconf == NULL || kname == NULL) return EFI_INVALID_PARAMETER; +#endif + + for (i=0; ifops == NULL) { if (boot_dev == NULL) @@ -360,13 +385,30 @@ fops_setdefaults(CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR16 *devpath) Print(L"Using builtin defaults for kernel and config file\n"); - StrnCpy(config, FILEOPS_DEFAULT_CONFIG, maxlen-1); StrnCpy(kname, FILEOPS_DEFAULT_KERNEL, maxlen-1); - - return EFI_UNSUPPORTED; } - - return boot_dev->fops->setdefaults(boot_dev->fops->intf, config, kname, maxlen, devpath); + else { + boot_dev->fops->setdefaults(boot_dev->fops->intf, defconf, kname, maxlen, devpath); + } + i=0; while (i= MAX_DEFAULT_CONFIGS) { + Print(L"ERROR: i = %d, MAX_DEFAULT_CONFIGS is not large enough\n", i); + return EFI_INVALID_PARAMETER; + } +//#endif + StrnCpy(defconf[i].fname, FILEOPS_ARCH_DEFAULT_CONFIG, maxlen-1); + StrnCpy(defconf[i+1].fname, FILEOPS_DEFAULT_CONFIG, maxlen-1); + +//#ifdef ELILO_DEBUG + VERB_PRT(3,Print(L"Default config filename list:\n")); + for (i=0; inetfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config); + status = netfs->netfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config[0].fname); if (EFI_ERROR(status)) { - StrnCpy(config, NETFS_DEFAULT_CONFIG, maxlen-1); - config[maxlen-1] = CHAR_NULL; + StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1); + config[0].fname[maxlen-1] = CHAR_NULL; } status = netfs->netfs_query_layer(netfs, 0, NETFS_KERNEL_LAYER, maxlen, kname); @@ -162,21 +162,44 @@ netfs_setdefaults(VOID *intf, CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR1 } } else { #ifdef ENABLE_MACHINE_SPECIFIC_NETCONFIG - /* - * will try a machine specific file first. - * the file is constructed based on the IP(v4) address - */ - convert_ip2hex(ipaddr, m, config); - config[8] = L'.'; - config[9] = L'c'; - config[10] = L'o'; - config[11] = L'n'; - config[12] = L'f'; - config[13] = CHAR_NULL; +# if defined(CONFIG_ia64) +# define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" +# elif defined (CONFIG_ia32) +# define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" +# else +# error "You need to specfy your default arch config file" +# endif + +# define CONFIG_EXTENSION L".conf\0" + /* + * will try machine/subnet specific files first. + * the filenames are constructed based on the IP(v4) address + */ + convert_ip2hex(ipaddr, m, str); + StrnCpy(config[0].fname, str, maxlen-1); + StrnCpy(config[0].fname+8, CONFIG_EXTENSION, 6); + + StrnCpy(config[1].fname, str, maxlen-1); + StrnCpy(config[1].fname+6, CONFIG_ARCH_EXTENSION, 11); + + StrnCpy(config[2].fname, str, maxlen-1); + StrnCpy(config[2].fname+6, CONFIG_EXTENSION, 6); + + StrnCpy(config[3].fname, str, maxlen-1); + StrnCpy(config[3].fname+4, CONFIG_ARCH_EXTENSION, 11); + + StrnCpy(config[4].fname, str, maxlen-1); + StrnCpy(config[4].fname+4, CONFIG_EXTENSION, 6); + + StrnCpy(config[5].fname, str, maxlen-1); + StrnCpy(config[5].fname+2, CONFIG_ARCH_EXTENSION, 11); + + StrnCpy(config[6].fname, str, maxlen-1); + StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6); #else - StrnCpy(config, NETFS_DEFAULT_CONFIG, maxlen-1); - config[maxlen-1] = CHAR_NULL; + StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1); + config[0].fname[maxlen-1] = CHAR_NULL; #endif StrnCpy(kname, NETFS_DEFAULT_KERNEL, maxlen-1); kname[maxlen-1] = CHAR_NULL; diff --git a/gnu-efi-3.0a-ia32.patch b/gnu-efi-3.0a-ia32.patch deleted file mode 100644 index 6e3baf1..0000000 --- a/gnu-efi-3.0a-ia32.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -urN gnu-efi-3.0a/gnuefi/elf_ia32_efi.lds gnu-efi-3.0a-ia32/gnuefi/elf_ia32_efi.lds ---- gnu-efi-3.0a/gnuefi/elf_ia32_efi.lds 2002-02-22 15:43:28.000000000 -0800 -+++ gnu-efi-3.0a-ia32/gnuefi/elf_ia32_efi.lds 2003-08-21 13:36:51.000000000 -0700 -@@ -17,6 +17,7 @@ - *(.rodata*) - *(.data) - *(.data1) -+ *(.data.*) - *(.sdata) - *(.got.plt) - *(.got) -@@ -34,6 +35,7 @@ - .rel : - { - *(.rel.data) -+ *(.rel.data.*) - *(.rel.got) - *(.rel.stab) - } diff --git a/ia32/Makefile b/ia32/Makefile index 1b1c16c..353ae67 100644 --- a/ia32/Makefile +++ b/ia32/Makefile @@ -28,7 +28,7 @@ include ../Make.rules TOPDIR=$(CDIR)/.. -FILES=system.o config.o +FILES=system.o config.o bzimage.o plain_loader.o gzip_loader.o gzip.o TARGET=sysdeps.o diff --git a/ia32/bzimage.c b/ia32/bzimage.c new file mode 100644 index 0000000..aac1d37 --- /dev/null +++ b/ia32/bzimage.c @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2001-2003 Hewlett-Packard Co. + * Contributed by Stephane Eranian + * Contributed by Mike Johnston + * Contributed by Chris Ahna + * + * This file is part of the ELILO, the EFI Linux boot loader. + * + * ELILO is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ELILO is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ELILO; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Please check out the elilo.txt for complete documentation on how + * to use this program. + */ + +#include +#include + +#include "elilo.h" +#include "loader.h" + +boot_params_t *param_start = NULL; +UINTN param_size = 0; + +UINTN kernel_size = 0x200000; /* 2M (largest x86 bzImage kernel image) */ + +static INTN +bzImage_probe(CHAR16 *kname) +{ + EFI_STATUS efi_status; + UINTN size; + fops_fd_t fd; + UINT8 bootsect[512]; + + DBG_PRT((L"probe_bzImage_boot()\n")); + + if (!kname) { + ERR_PRT((L"kname == %xh", kname)); + free_kmem(); + return -1; + } + + /* + * Open kernel image. + */ + DBG_PRT((L"opening %s...\n", kname)); + + efi_status = fops_open(kname, &fd); + if (EFI_ERROR(efi_status)) { + ERR_PRT((L"Could not open %s.", kname)); + free_kmem(); + return -1; + } + /* + * Read boot sector. + */ + + DBG_PRT((L"\nreading boot sector...\n")); + + size = sizeof bootsect; + efi_status = fops_read(fd, bootsect, &size); + if (EFI_ERROR(efi_status) || size != sizeof bootsect) { + ERR_PRT((L"Could not read boot sector from %s.", kname)); + fops_close(fd); + free_kmem(); + return -1; + } + /* + * Verify boot sector signature. + */ + + if (bootsect[0x1FE] != 0x55 || bootsect[0x1FF] != 0xAA) { + ERR_PRT((L"%s is not a bzImage kernel image.\n", kname)); + fops_close(fd); + free_kmem(); + return -1; + } + /* + * Check for out of range setup data size. + * Will almost always be 7, but we will accept 1 to 64. + */ + + DBG_PRT((L"bootsect[1F1h] == %d setup sectors\n", bootsect[0x1F1])); + + if (bootsect[0x1F1] < 1 || bootsect[0x1F1] > 64) { + ERR_PRT((L"%s is not a valid bzImage kernel image.", + kname)); + fops_close(fd); + free_kmem(); + return -1; + } + /* + * Allocate and read setup data. + */ + + DBG_PRT((L"reading setup data...\n")); + + param_size = (bootsect[0x1F1] + 1) * 512; + param_start = alloc(param_size, EfiLoaderData); + + DBG_PRT((L"param_size=%d param_start=%x", param_size, param_start)); + + if (!param_start) { + ERR_PRT((L"Could not allocate %d bytes of setup data.", + param_size)); + fops_close(fd); + free_kmem(); + return -1; + } + + CopyMem(param_start, bootsect, sizeof bootsect); + + size = param_size - 512; + efi_status = fops_read(fd, ((UINT8 *)param_start) + 512, &size); + + if (EFI_ERROR(efi_status) || size != param_size - 512) { + ERR_PRT((L"Could not read %d bytes of setup data.", + param_size - 512)); + free(param_start); + param_start = NULL; + param_size = 0; + fops_close(fd); + free_kmem(); + return -1; + } + /* + * Check for setup data signature. + */ + + { + UINT8 *c = ((UINT8 *)param_start)+514; + DBG_PRT((L"param_start(c=%x): %c-%c-%c-%c", + c, (CHAR16)c[0],(CHAR16) c[1], (CHAR16)c[2], (CHAR16)c[3])); + } + if (CompareMem(((UINT8 *)param_start) + 514, "HdrS", 4)) { + ERR_PRT((L"%s does not have a setup signature.", + kname)); + free(param_start); + param_start = NULL; + param_size = 0; + fops_close(fd); + free_kmem(); + return -1; + } + /* + * Allocate memory for kernel. + */ + + if (alloc_kmem(kernel_start, EFI_SIZE_TO_PAGES(kernel_size))) { + ERR_PRT((L"Could not allocate kernel memory.")); + return -1; + } else { + VERB_PRT(3, Print(L"kernel_start: 0x%x kernel_size: %d\n", + kernel_start, kernel_size)); + } + /* + * Now read the rest of the kernel image into memory. + */ + + DBG_PRT((L"reading kernel image...\n")); + + size = kernel_size; + efi_status = fops_read(fd, kernel_start, &size); + if (EFI_ERROR(efi_status) || size < 0x10000) { + ERR_PRT((L"Error reading kernel image %s.", kname)); + free(param_start); + param_start = NULL; + param_size = 0; + fops_close(fd); + free_kmem(); + return -1; + } + + DBG_PRT((L"kernel image read: %d bytes, %d Kbytes\n", size, size / 1024)); + + /* + * Boot sector, setup data and kernel image loaded. + */ + + fops_close(fd); + return 0; +} + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +static INTN +bzImage_load(CHAR16 *kname, kdesc_t *kd) +{ + DBG_PRT((L"load_bzImage_boot()\n")); + + if (!kname || !kd) { + ERR_PRT((L"kname=0x%x kd=0x%x", kname, kd)); + free(param_start); + param_start = NULL; + param_size = 0; + free_kmem(); + return -1; + } + kd->kstart = kd->kentry = kernel_start; + kd->kend = ((UINT8 *)kd->kstart) + kernel_size; + + DBG_PRT((L"kstart=0x%x kentry=0x%x kend=0x%x\n", kd->kstart, kd->kentry, kd->kend)); + + return 0; +} + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +loader_ops_t bzimage_loader = { + NULL, + L"bzImage_loader", + &bzImage_probe, + &bzImage_load +}; diff --git a/ia32/gzip.c b/ia32/gzip.c new file mode 100644 index 0000000..fdd7284 --- /dev/null +++ b/ia32/gzip.c @@ -0,0 +1,552 @@ +/* + * Copyright (C) 2001-2002 Hewlett-Packard Co. + * Contributed by Stephane Eranian + * + * Copyright (C) 2001 Silicon Graphics, Inc. + * Contributed by Brent Casavant + * + * This file is part of the ELILO, the EFI Linux boot loader. + * + * ELILO is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ELILO is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ELILO; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Please check out the elilo.txt for complete documentation on how + * to use this program. + */ + +#include +#include + +#include "elf.h" +#include "elilo.h" +#include "gzip.h" +#include "private.h" + +#define memzero(s, n) Memset((VOID *)(s), 0, (n)) +#define memcpy(a,b,n) Memcpy((VOID *)(a),(b),(n)) + +/* size of output buffer */ +#define WSIZE 0x8000 /* Window size must be at least 32k, */ + /* and a power of two */ +/* size of input buffer */ +#define INBUFSIZE 0x8000 + +/* + * gzip declarations + */ + +#define OF(args) args +#define FUNC_STATIC static + +typedef unsigned char uch; +typedef unsigned short ush; +typedef unsigned long ulg; + + +typedef struct segment { + unsigned long addr; /* start address */ + unsigned long offset; /* file offset */ + unsigned long size; /* file size */ + unsigned long bss_sz; /* BSS size */ + UINT8 flags; /* indicates whether to load or not */ +} segment_t; + +#define CHUNK_FL_VALID 0x1 +#define CHUNK_FL_LOAD 0x2 + +#define CHUNK_CAN_LOAD(n) chunks[(n)].flags |= CHUNK_FL_LOAD +#define CHUNK_NO_LOAD(n) chunks[(n)].flags &= ~CHUNK_FL_LOAD +#define CHUNK_IS_LOAD(n) (chunks[(n)].flags & CHUNK_FL_LOAD) + +#define CHUNK_VALIDATE(n) chunks[(n)].flags |= CHUNK_FL_VALID +#define CHUNK_INVALIDATE(n) chunks[(n)].flags = 0 +#define CHUNK_IS_VALID(n) (chunks[(n)].flags & CHUNK_FL_VALID) + +/* + * static parameters to gzip helper functions + * we cannot use paramters because API was not + * designed that way + */ +static segment_t *chunks; /* holds the list of segments */ +static segment_t *cur_chunk; +static UINTN nchunks; +static UINTN chunk; /* current segment */ +static UINTN input_fd; +static VOID *kernel_entry, *kernel_base, *kernel_end; + +static uch *inbuf; /* input buffer (compressed data) */ +static uch *window; /* output buffer (uncompressed data) */ +static unsigned long file_offset; /* position in the file */ + +static unsigned insize = 0; /* valid bytes in inbuf */ +static unsigned inptr = 0; /* index of next byte to be processed in inbuf */ +static unsigned outcnt = 0; /* bytes in output buffer */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ +#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ +#define RESERVED 0xC0 /* bit 6,7: reserved */ + +#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) + +/* Diagnostic functions */ +#ifdef INFLATE_DEBUG +# define Assert(cond,msg) {if(!(cond)) error(msg);} +int stderr; +# define Trace(x) Print(L"line %d:\n", __LINE__); +# define Tracev(x) {if (verbose) Print(L"line %d:\n", __LINE__) ;} +# define Tracevv(x) {if (verbose>1) Print(L"line %d:\n", __LINE__) ;} +# define Tracec(c,x) {if (verbose && (c)) Print(L"line %d:\n", __LINE__) ;} +# define Tracecv(c,x) {if (verbose>1 && (c)) Print(L"line %d:\n", __LINE__) ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +static int fill_inbuf(void); +static void flush_window(void); +static void error(char *m); +static long bytes_out; +static void error(char *m); +static int error_return; + +static void * +gzip_malloc(int size) +{ + return (void *)alloc(size, 0); +} + +static void +gzip_free(void *where) +{ + return free(where); +} + +#include "inflate.c" + +/* + * Fill the input buffer and return the first byte in it. This is called + * only when the buffer is empty and at least one byte is really needed. + */ +int +fill_inbuf(void) +{ + INTN expected, nread; + EFI_STATUS status; + + expected = nread = INBUFSIZE; + + status = fops_read(input_fd, inbuf, &nread); + if (EFI_ERROR(status)) { + error("elilo: Read failed"); + } + DBG_PRT((L"%s : read %d bytes of %d bytes\n", LD_NAME, nread, expected)); + + insize = nread; + inptr = 1; + + return inbuf[0]; +} + +/* =========================================================================== + * Write the output window window[0..outcnt-1] and update crc and bytes_out. + * (Used for the decompressed data only.) + */ + +/* + * Run a set of bytes through the crc shift register. If s is a NULL + * pointer, then initialize the crc shift register contents instead. + * Return the current crc in either case. + * + * Input: + * S pointer to bytes to pump through. + * N number of bytes in S[]. + */ +unsigned long +updcrc(unsigned char *s, unsigned n) +{ + register unsigned long c; + /* crc is defined in inflate.c */ + + if (!s) { + c = 0xffffffffL; + } else { + c = crc; + while (n--) { + c = crc_32_tab[((int)c ^ (*s++)) & 0xff] ^ (c >> 8); + } + } + crc = c; + return c ^ 0xffffffffUL; /* (instead of ~c for 64-bit machines) */ +} + + +/* + * Clear input and output buffers + */ +void +clear_bufs(void) +{ + outcnt = 0; + inptr = 0; + chunk = 0; + cur_chunk = NULL; + file_offset = 0; +} + + +static INTN +is_valid_header(Elf32_Ehdr *ehdr) +{ + UINT16 type, machine; + + type = ehdr->e_type; + machine = ehdr->e_machine; + + VERB_PRT(3, Print(L"class=%d type=%d data=%d machine=%d\n", + ehdr->e_ident[EI_CLASS], + type, + ehdr->e_ident[EI_DATA], + machine)); + + return ehdr->e_ident[EI_MAG0] == 0x7f + && ehdr->e_ident[EI_MAG1] == 'E' + && ehdr->e_ident[EI_MAG2] == 'L' + && ehdr->e_ident[EI_MAG3] == 'F' + && ehdr->e_ident[EI_CLASS] == ELFCLASS32 + && type == ET_EXEC /* must be executable */ + && machine == EM_386 ? 0 : -1; +} + +/* + * will invalidate loadble segments which overlap with others + */ +void +check_overlap(int i) +{ + int j; + unsigned long iend = chunks[i].addr + chunks[i].size; + + for(j=0; j < nchunks; j++) { + if (j ==i) continue; + if (chunks[i].addr >= chunks[j].addr && iend < (chunks[j].addr + chunks[j].size)) { + DBG_PRT((L"%s : segment %d fully included in segment %d\n", LD_NAME, i, j)); + CHUNK_INVALIDATE(i); /* nullyify segment */ + break; + } + } +} + +void +analyze_chunks(void) +{ + INTN i; + + for (i=0; i < nchunks; i++) { + if (CHUNK_IS_VALID(i) && !CHUNK_IS_LOAD(i)) + check_overlap(i); + } +} + + +/* + * The decompression code calls this function after decompressing the + * first block of the object file. The first block must contain all + * the relevant header information. + */ +int +first_block (const char *buf, long blocksize) +{ + Elf32_Ehdr *elf; + Elf32_Phdr *phdrs; + UINTN total_size, pages; + UINTN low_addr, max_addr; + UINTN offs = 0; + UINT16 phnum; + UINTN paddr, memsz; + INTN i; + + elf = (Elf32_Ehdr *)buf; + + if (is_valid_header(elf) == -1) + return -1; + + offs = elf->e_phoff; + phnum = elf->e_phnum; + + VERB_PRT(3, { + Print(L"Entry point 0x%lx\n", elf->e_entry); + Print(L"%d program headers\n", phnum); + Print(L"%d segment headers\n", elf->e_shnum); + }); + + if (offs + phnum * sizeof(*phdrs) > (unsigned) blocksize) { + ERR_PRT((L"%s : ELF program headers not in first block (%ld)\n", LD_NAME, offs)); + return -1; + } + + kernel_entry = (VOID *)(elf->e_entry & PADDR_MASK); + + phdrs = (Elf32_Phdr *) (buf + offs); + low_addr = ~0; + max_addr = 0; + + /* + * allocate chunk table + * Convention: a segment that does not need loading will + * have chunk[].addr = 0. + */ + chunks = (void *)alloc(sizeof(struct segment)*phnum, 0); + if (chunks == NULL) { + ERR_PRT((L"%s : failed alloc chunks %r\n", LD_NAME)); + return -1; + } + nchunks = phnum; + /* + * find lowest and higest virtual addresses + * don't assume FULLY sorted ! + */ + for (i = 0; i < phnum; ++i) { + /* + * record chunk no matter what because no load may happen + * anywhere in archive, not just as the last segment + */ + paddr = (phdrs[i].p_paddr & PADDR_MASK); + memsz = phdrs[i].p_memsz, + + chunks[i].addr = paddr; + chunks[i].offset = phdrs[i].p_offset; + chunks[i].size = phdrs[i].p_filesz; + chunks[i].bss_sz = phdrs[i].p_memsz - phdrs[i].p_filesz; + + CHUNK_VALIDATE(i); + + if (phdrs[i].p_type != PT_LOAD) { + CHUNK_NO_LOAD(i); /* mark no load chunk */ + DBG_PRT((L"%s : skipping segment %ld\n", LD_NAME, i)); + continue; + } + + CHUNK_CAN_LOAD(i); /* mark no load chunk */ + + VERB_PRT(3, + Print(L"\n%s : segment %ld vaddr [0x%lx-0x%lx] offset %ld filesz %ld " + "memsz=%ld bss_sz=%ld\n", + LD_NAME, 1+i, chunks[i].addr, chunks[i].addr+phdrs[i].p_filesz, + chunks[i].offset, chunks[i].size, memsz, chunks[i].bss_sz)); + + if (paddr < low_addr) + low_addr = paddr; + if (paddr + memsz > max_addr) + max_addr = paddr + memsz; + } + + if (low_addr & (EFI_PAGE_SIZE - 1)) { + ERR_PRT((L"%s : low_addr not page aligned 0x%lx\n", LD_NAME, low_addr)); + goto error; + } + analyze_chunks(); + + DBG_PRT((L"%s : %d program headers entry=0x%lx\nlowest_addr=0x%lx highest_addr=0x%lx\n", + LD_NAME, + phnum, kernel_entry, low_addr, max_addr)); + + total_size = (UINTN)max_addr - (UINTN)low_addr; + pages = EFI_SIZE_TO_PAGES(total_size); + + /* + * Record end of kernel for initrd + */ + kernel_base = (void *)low_addr; + kernel_end = (void *)(low_addr + (pages << EFI_PAGE_SHIFT)); + + /* allocate memory for the kernel */ + if (alloc_kmem((void *)low_addr, pages) == -1) { + ERR_PRT((L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", + LD_NAME, pages, low_addr)); + ERR_PRT((L"%s : Could not load kernel at 0x%lx\n", LD_NAME, low_addr)); + ERR_PRT((L"%s : Bailing\n", LD_NAME)); + goto error; + } + return 0; +error: + if (chunks) + free(chunks); + return -1; +} + +/* + * Determine which chunk in the Elf file will be coming out of the expand + * code next. + */ +static void +nextchunk(void) +{ + int i; + segment_t *cp; + + cp = NULL; + for(i=0; i < nchunks; i++) { + + if (!CHUNK_IS_VALID(i) || !CHUNK_IS_LOAD(i)) continue; + + if (file_offset > chunks[i].offset) continue; + + if (cp == NULL || chunks[i].offset < cp->offset) cp = &chunks[i]; + } + cur_chunk = cp; +} + + +/* + * Write the output window window[0..outcnt-1] holding uncompressed + * data and update crc. + */ +void +flush_window(void) +{ + static const CHAR8 helicopter[4] = { '|' , '/' , '-' , '\\' }; + static UINTN heli_count; + struct segment *cp; + char *src, *dst; + long cnt; + + if (!outcnt) return; + + DBG_PRT((L"%s : flush_window outnct=%d file_offset=%ld\n", LD_NAME, outcnt, file_offset)); + + Print(L"%c\b",helicopter[heli_count++%4]); + + updcrc(window, outcnt); + + /* first time, we extract the headers */ + if (!bytes_out) { + if (first_block(window, outcnt) < 0) + error("invalid exec header"); + nextchunk(); + } + + bytes_out += outcnt; + src = window; +tail: + /* check if user wants to abort */ + if (check_abort() == EFI_SUCCESS) goto load_abort; + + cp = cur_chunk; + if (cp == NULL || file_offset + outcnt <= cp->offset) { + file_offset += outcnt; + return; + } + + /* Does this window begin before the current chunk? */ + if (file_offset < cp->offset) { + unsigned long skip = cp->offset - file_offset; + + src += skip; + file_offset += skip; + outcnt -= skip; + } + dst = (char *)cp->addr + (file_offset - cp->offset); + cnt = cp->offset + cp->size - file_offset; + if (cnt > outcnt) + cnt = outcnt; + + Memcpy(dst, src, cnt); + + file_offset += cnt; + outcnt -= cnt; + src += cnt; + + /* See if we are at the end of this chunk */ + if (file_offset == cp->offset + cp->size) { + if (cp->bss_sz) { + dst = (char *)cp->addr + cp->size; + Memset(dst, 0, cp->bss_sz); + } + nextchunk(); + /* handle remaining bytes */ + if (outcnt) + goto tail; + } + return; +load_abort: + free_kmem(); + error_return = ELILO_LOAD_ABORTED; +} + +static void +error(char *x) +{ + ERR_PRT((L"%s : %a", LD_NAME, x)); + /* will eventually exit with error from gunzip() */ +} + +INT32 +decompress_kernel(VOID) +{ + INT32 ret; + + clear_bufs(); + makecrc(); + Print(L"Uncompressing Linux... "); + ret = gunzip(); + if (ret == 0) + Print(L"done\n"); + return ret == 0 ? 0 : -1; +} + +int +gunzip_kernel(fops_fd_t fd, kdesc_t *kd) +{ + int ret = -1; + + error_return = ELILO_LOAD_ERROR; + + window = (void *)alloc(WSIZE, 0); + if (window == NULL) { + ERR_PRT((L"%s : allocate output window failed\n", LD_NAME)); + return -1; + } + + inbuf = (void *)alloc(INBUFSIZE, 0); + if (inbuf == NULL) { + ERR_PRT((L"%s : allocate input window failedr\n", LD_NAME)); + goto error; + } + input_fd = fd; + insize = 0; + bytes_out = 0; + + ret = decompress_kernel(); +error: + if (window) free(window); + if (inbuf) free(inbuf); + + if (ret == 0) { + kd->kentry = kernel_entry; + kd->kend = kernel_end; + kd->kstart = kernel_base; + error_return = ELILO_LOAD_SUCCESS; + } + return error_return; +} diff --git a/ia32/gzip.h b/ia32/gzip.h new file mode 100644 index 0000000..296bf3c --- /dev/null +++ b/ia32/gzip.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2001-2002 Hewlett-Packard Co. + * Contributed by Stephane Eranian + * + * This file is part of the ELILO, the EFI Linux boot loader. + * + * ELILO is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ELILO is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ELILO; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Please check out the elilo.txt for complete documentation on how + * to use this program. + */ + +#ifndef __GZIP_H__ +#define __GZIP_H__ + + +int gzip_probe(unsigned char *, unsigned long); +int gunzip_kernel(fops_fd_t, kdesc_t *); + +#define LD_NAME L"gzip_ia32" + +#endif /* __GZIP_H__ */ diff --git a/ia32/gzip_loader.c b/ia32/gzip_loader.c new file mode 100644 index 0000000..687b301 --- /dev/null +++ b/ia32/gzip_loader.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2001-2002 Hewlett-Packard Co. + * Contributed by Stephane Eranian + * + * This file is part of the ELILO, the EFI Linux boot loader. + * + * ELILO is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ELILO is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ELILO; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Please check out the elilo.txt for complete documentation on how + * to use this program. + */ + +#include +#include + +#include "elilo.h" +#include "loader.h" +#include "gzip.h" + +static INTN +gzip_probe_format(CHAR16 *kname) +{ + UINT8 buf[4]; + EFI_STATUS status; + INTN ret = -1; + UINTN size; + fops_fd_t fd; + + status = fops_open(kname, &fd); + if (EFI_ERROR(status)) return -1; + + size = sizeof(buf); + status = fops_read(fd, buf, &size); + + if (EFI_ERROR(status) || size != sizeof(buf)) goto error; + + ret = gzip_probe(buf, sizeof(buf)); +error: + fops_close(fd); + return ret; +} + + +static INTN +gzip_load_kernel(CHAR16 *kname, kdesc_t *kd) +{ + EFI_STATUS status; + INT32 ret; + fops_fd_t fd; + + status = fops_open(kname, &fd); + if (EFI_ERROR(status)) return ELILO_LOAD_ERROR; + + ret = gunzip_kernel(fd, kd); + + fops_close(fd); + + return ret; /* could be success, error, or abort */ +} + +loader_ops_t gzip_loader={ + NULL, + LD_NAME, + gzip_probe_format, + gzip_load_kernel +}; diff --git a/ia32/inflate.c b/ia32/inflate.c new file mode 100644 index 0000000..5532250 --- /dev/null +++ b/ia32/inflate.c @@ -0,0 +1,1205 @@ +#define DEBG(x) +#define DEBG1(x) +/* inflate.c -- Not copyrighted 1992 by Mark Adler + version c10p1, 10 January 1993 */ + +/* + * Adapted for booting Linux by Hannu Savolainen 1993 + * based on gzip-1.0.3 + * + * Nicolas Pitre , 1999/04/14 : + * Little mods for all variable to reside either into rodata or bss segments + * by marking constant variables with 'const' and initializing all the others + * at run-time only. This allows for the kernel uncompressor to run + * directly from Flash or ROM memory on embeded systems. + */ + +/* + Inflate deflated (PKZIP's method 8 compressed) data. The compression + method searches for as much of the current string of bytes (up to a + length of 258) in the previous 32 K bytes. If it doesn't find any + matches (of at least length 3), it codes the next byte. Otherwise, it + codes the length of the matched string and its distance backwards from + the current position. There is a single Huffman code that codes both + single bytes (called "literals") and match lengths. A second Huffman + code codes the distance information, which follows a length code. Each + length or distance code actually represents a base value and a number + of "extra" (sometimes zero) bits to get to add to the base value. At + the end of each deflated block is a special end-of-block (EOB) literal/ + length code. The decoding process is basically: get a literal/length + code; if EOB then done; if a literal, emit the decoded byte; if a + length then get the distance and emit the referred-to bytes from the + sliding window of previously emitted data. + + There are (currently) three kinds of inflate blocks: stored, fixed, and + dynamic. The compressor deals with some chunk of data at a time, and + decides which method to use on a chunk-by-chunk basis. A chunk might + typically be 32 K or 64 K. If the chunk is incompressible, then the + "stored" method is used. In this case, the bytes are simply stored as + is, eight bits per byte, with none of the above coding. The bytes are + preceded by a count, since there is no longer an EOB code. + + If the data is compressible, then either the fixed or dynamic methods + are used. In the dynamic method, the compressed data is preceded by + an encoding of the literal/length and distance Huffman codes that are + to be used to decode this block. The representation is itself Huffman + coded, and so is preceded by a description of that code. These code + descriptions take up a little space, and so for small blocks, there is + a predefined set of codes, called the fixed codes. The fixed method is + used if the block codes up smaller that way (usually for quite small + chunks), otherwise the dynamic method is used. In the latter case, the + codes are customized to the probabilities in the current block, and so + can code it much better than the pre-determined fixed codes. + + The Huffman codes themselves are decoded using a multi-level table + lookup, in order to maximize the speed of decoding plus the speed of + building the decoding tables. See the comments below that precede the + lbits and dbits tuning parameters. + */ + + +/* + Notes beyond the 1.93a appnote.txt: + + 1. Distance pointers never point before the beginning of the output + stream. + 2. Distance pointers can point back across blocks, up to 32k away. + 3. There is an implied maximum of 7 bits for the bit length table and + 15 bits for the actual data. + 4. If only one code exists, then it is encoded using one bit. (Zero + would be more efficient, but perhaps a little confusing.) If two + codes exist, they are coded using one bit each (0 and 1). + 5. There is no way of sending zero distance codes--a dummy must be + sent if there are none. (History: a pre 2.0 version of PKZIP would + store blocks with no distance codes, but this was discovered to be + too harsh a criterion.) Valid only for 1.93a. 2.04c does allow + zero distance codes, which is sent as one code of zero bits in + length. + 6. There are up to 286 literal/length codes. Code 256 represents the + end-of-block. Note however that the static length tree defines + 288 codes just to fill out the Huffman codes. Codes 286 and 287 + cannot be used though, since there is no length base or extra bits + defined for them. Similarly, there are up to 30 distance codes. + However, static trees define 32 codes (all 5 bits) to fill out the + Huffman codes, but the last two had better not show up in the data. + 7. Unzip can check dynamic Huffman blocks for complete code sets. + The exception is that a single code would not be complete (see #4). + 8. The five bits following the block type is really the number of + literal codes sent minus 257. + 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits + (1+6+6). Therefore, to output three times the length, you output + three codes (1+1+1), whereas to output four times the same length, + you only need two codes (1+3). Hmm. + 10. In the tree reconstruction algorithm, Code = Code + Increment + only if BitLength(i) is not zero. (Pretty obvious.) + 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) + 12. Note: length code 284 can represent 227-258, but length code 285 + really is 258. The last length deserves its own, short code + since it gets used a lot in very redundant files. The length + 258 is special since 258 - 3 (the min match length) is 255. + 13. The literal/length and distance code bit lengths are read as a + single stream of lengths. It is possible (and advantageous) for + a repeat code (16, 17, or 18) to go across the boundary between + the two sets of lengths. + */ + +#ifdef RCSID +static char rcsid[] = "#Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp #"; +#endif + +#ifndef FUNC_STATIC + +#if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H) +# include +# include +#endif + +#include "gzip.h" +#define FUNC_STATIC +#endif /* !FUNC_STATIC */ + +#define slide window + +/* Huffman code lookup table entry--this entry is four bytes for machines + that have 16-bit pointers (e.g. PC's in the small or medium model). + Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 + means that v is a literal, 16 < e < 32 means that v is a pointer to + the next table, which codes e - 16 bits, and lastly e == 99 indicates + an unused code. If a code with e == 99 is looked up, this implies an + error in the data. */ +struct huft { + uch e; /* number of extra bits or operation */ + uch b; /* number of bits in this code or subcode */ + union { + ush n; /* literal, length base, or distance base */ + struct huft *t; /* pointer to next level of table */ + } v; +}; + + +/* Function prototypes */ +FUNC_STATIC int huft_build OF((unsigned *, unsigned, unsigned, + const ush *, const ush *, struct huft **, int *)); +FUNC_STATIC int huft_free OF((struct huft *)); +FUNC_STATIC int inflate_codes OF((struct huft *, struct huft *, int, int)); +FUNC_STATIC int inflate_stored OF((void)); +FUNC_STATIC int inflate_fixed OF((void)); +FUNC_STATIC int inflate_dynamic OF((void)); +FUNC_STATIC int inflate_block OF((int *)); +FUNC_STATIC int inflate OF((void)); + + +/* The inflate algorithm uses a sliding 32 K byte window on the uncompressed + stream to find repeated byte strings. This is implemented here as a + circular buffer. The index is updated simply by incrementing and then + ANDing with 0x7fff (32K-1). */ +/* It is left to other modules to supply the 32 K area. It is assumed + to be usable as if it were declared "uch slide[32768];" or as just + "uch *slide;" and then malloc'ed in the latter case. The definition + must be in unzip.h, included above. */ +/* unsigned wp; current position in slide */ +#define wp outcnt +#define flush_output(w) (wp=(w),flush_window()) + +/* Tables for deflate from PKZIP's appnote.txt. */ +static const unsigned border[] = { /* Order of the bit length code lengths */ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +static const ush cplens[] = { /* Copy lengths for literal codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + /* note: see note #13 above about the 258 in this list. */ +static const ush cplext[] = { /* Extra bits for literal codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */ +static const ush cpdist[] = { /* Copy offsets for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; +static const ush cpdext[] = { /* Extra bits for distance codes */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + + + +/* Macros for inflate() bit peeking and grabbing. + The usage is: + + NEEDBITS(j) + x = b & mask_bits[j]; + DUMPBITS(j) + + where NEEDBITS makes sure that b has at least j bits in it, and + DUMPBITS removes the bits from b. The macros use the variable k + for the number of bits in b. Normally, b and k are register + variables for speed, and are initialized at the beginning of a + routine that uses these macros from a global bit buffer and count. + + If we assume that EOB will be the longest code, then we will never + ask for bits with NEEDBITS that are beyond the end of the stream. + So, NEEDBITS should not read any more bytes than are needed to + meet the request. Then no bytes need to be "returned" to the buffer + at the end of the last block. + + However, this assumption is not true for fixed blocks--the EOB code + is 7 bits, but the other literal/length codes can be 8 or 9 bits. + (The EOB code is shorter than other codes because fixed blocks are + generally short. So, while a block always has an EOB, many other + literal/length codes have a significantly lower probability of + showing up at all.) However, by making the first table have a + lookup of seven bits, the EOB code will be found in that first + lookup, and so will not require that too many bits be pulled from + the stream. + */ + +FUNC_STATIC ulg bb; /* bit buffer */ +FUNC_STATIC unsigned bk; /* bits in bit buffer */ + +FUNC_STATIC const ush mask_bits[] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + +#define NEXTBYTE() (uch)get_byte() +#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<>=(n);k-=(n);} + + +/* + Huffman code decoding is performed using a multi-level table lookup. + The fastest way to decode is to simply build a lookup table whose + size is determined by the longest code. However, the time it takes + to build this table can also be a factor if the data being decoded + is not very long. The most common codes are necessarily the + shortest codes, so those codes dominate the decoding time, and hence + the speed. The idea is you can have a shorter table that decodes the + shorter, more probable codes, and then point to subsidiary tables for + the longer codes. The time it costs to decode the longer codes is + then traded against the time it takes to make longer tables. + + This results of this trade are in the variables lbits and dbits + below. lbits is the number of bits the first level table for literal/ + length codes can decode in one step, and dbits is the same thing for + the distance codes. Subsequent tables are also less than or equal to + those sizes. These values may be adjusted either when all of the + codes are shorter than that, in which case the longest code length in + bits is used, or when the shortest code is *longer* than the requested + table size, in which case the length of the shortest code in bits is + used. + + There are two different values for the two tables, since they code a + different number of possibilities each. The literal/length table + codes 286 possible values, or in a flat code, a little over eight + bits. The distance table codes 30 possible values, or a little less + than five bits, flat. The optimum values for speed end up being + about one bit more than those, so lbits is 8+1 and dbits is 5+1. + The optimum values may differ though from machine to machine, and + possibly even between compilers. Your mileage may vary. + */ + + +FUNC_STATIC const int lbits = 9; /* bits in base literal/length lookup table */ +FUNC_STATIC const int dbits = 6; /* bits in base distance lookup table */ + + +/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ +#define BMAX 16 /* maximum bit length of any code (16 for explode) */ +#define N_MAX 288 /* maximum number of codes in any set */ + + +FUNC_STATIC unsigned hufts; /* track memory usage */ + + +FUNC_STATIC int huft_build(b, n, s, d, e, t, m) +unsigned *b; /* code lengths in bits (all assumed <= BMAX) */ +unsigned n; /* number of codes (assumed <= N_MAX) */ +unsigned s; /* number of simple-valued codes (0..s-1) */ +const ush *d; /* list of base values for non-simple codes */ +const ush *e; /* list of extra bits for non-simple codes */ +struct huft **t; /* result: starting table */ +int *m; /* maximum lookup bits, returns actual */ +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return zero on success, one if + the given code set is incomplete (the tables are still built in this + case), two if the input is invalid (all zero length codes or an + oversubscribed set of lengths), and three if not enough memory. */ +{ + unsigned a; /* counter for codes of length k */ + unsigned c[BMAX+1]; /* bit length count table */ + unsigned f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + register unsigned i; /* counter, current code */ + register unsigned j; /* counter */ + register int k; /* number of bits in current code */ + int l; /* bits per table (returned in m) */ + register unsigned *p; /* pointer into c[], b[], or v[] */ + register struct huft *q; /* points to current table */ + struct huft r; /* table entry for structure assignment */ + struct huft *u[BMAX]; /* table stack */ + unsigned v[N_MAX]; /* values in order of bit length */ + register int w; /* bits before this table == (l * h) */ + unsigned x[BMAX+1]; /* bit offsets, then code stack */ + unsigned *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + unsigned z; /* number of entries in current table */ + +DEBG("huft1 "); + + /* Generate counts for each bit length */ + memzero(c, sizeof(c)); + + p = b; i = n; + do { + Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"), + n-i, *p)); + c[*p]++; /* assume all entries <= BMAX */ + p++; /* Can't combine with above line (Solaris bug) */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (struct huft *)NULL; + *m = 0; + return 0; + } + +DEBG("huft2 "); + + /* Find minimum and maximum length, bound *m by those */ + l = *m; + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((unsigned)l < j) + l = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((unsigned)l > i) + l = i; + *m = l; + +DEBG("huft3 "); + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return 2; /* bad input: more codes than bits */ + if ((y -= c[i]) < 0) + return 2; + c[i] += y; + +DEBG("huft4 "); + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + +DEBG("huft5 "); + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + +DEBG("h6 "); + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = -l; /* bits decoded == (l * h) */ + u[0] = (struct huft *)NULL; /* just to keep compilers happy */ + q = (struct huft *)NULL; /* ditto */ + z = 0; /* ditto */ +DEBG("h6a "); + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { +DEBG("h6b "); + a = c[k]; + while (a--) + { +DEBG("h6b1 "); + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l) + { +DEBG1("1 "); + h++; + w += l; /* previous table always l bits */ + + /* compute minimum size table less than or equal to l bits */ + z = (z = g - w) > (unsigned)l ? l : z; /* upper limit on table size */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ +DEBG1("2 "); + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } +DEBG1("3 "); + z = 1 << j; /* table entries for j-bit table */ + + /* allocate and link in new table */ + if ((q = (struct huft *)gzip_malloc((z + 1)*sizeof(struct huft))) == + (struct huft *)NULL) + { + if (h) + huft_free(u[0]); + return 3; /* not enough memory */ + } +DEBG1("4 "); + hufts += z + 1; /* track memory usage */ + *t = q + 1; /* link to list for huft_free() */ + *(t = &(q->v.t)) = (struct huft *)NULL; + u[h] = ++q; /* table starts after link */ + +DEBG1("5 "); + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.b = (uch)l; /* bits to dump before this table */ + r.e = (uch)(16 + j); /* bits in this table */ + r.v.t = q; /* pointer to this table */ + j = i >> (w - l); /* (get around Turbo C bug) */ + u[h-1][j] = r; /* connect to last table */ + } +DEBG1("6 "); + } +DEBG("h6c "); + + /* set up table entry in r */ + r.b = (uch)(k - w); + if (p >= v + n) + r.e = 99; /* out of values--invalid code */ + else if (*p < s) + { + r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ + r.v.n = (ush)(*p); /* simple code is just the value */ + p++; /* one compiler does not like *p++ */ + } + else + { + r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ + r.v.n = d[*p++ - s]; + } +DEBG("h6d "); + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + while ((i & ((1 << w) - 1)) != x[h]) + { + h--; /* don't need to update q */ + w -= l; + } +DEBG("h6e "); + } +DEBG("h6f "); + } + +DEBG("huft7 "); + + /* Return true (1) if we were given an incomplete table */ + return y != 0 && g != 1; +} + + + +FUNC_STATIC int huft_free(t) +struct huft *t; /* table to free */ +/* Free the malloc'ed tables built by huft_build(), which makes a linked + list of the tables it made, with the links in a dummy first entry of + each table. */ +{ + register struct huft *p, *q; + + + /* Go through linked list, freeing from the malloced (t[-1]) address. */ + p = t; + while (p != (struct huft *)NULL) + { + q = (--p)->v.t; + gzip_free((char*)p); + p = q; + } + return 0; +} + + +FUNC_STATIC int inflate_codes(tl, td, bl, bd) +struct huft *tl, *td; /* literal/length and distance decoder tables */ +int bl, bd; /* number of bits decoded by tl[] and td[] */ +/* inflate (decompress) the codes in a deflated (compressed) block. + Return an error code or zero if it all goes ok. */ +{ + register unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned ml, md; /* masks for bl and bd bits */ + register ulg b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + + + /* make local copies of globals */ + b = bb; /* initialize bit buffer */ + k = bk; + w = wp; /* initialize window position */ + + /* inflate the coded data */ + ml = mask_bits[bl]; /* precompute masks for speed */ + md = mask_bits[bd]; + for (;;) /* do until end of block */ + { + NEEDBITS((unsigned)bl) + if ((e = (t = tl + ((unsigned)b & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + if (e == 16) /* then it's a literal */ + { + slide[w++] = (uch)t->v.n; + Tracevv((stderr, "%c", slide[w-1])); + if (w == WSIZE) + { + flush_output(w); + w = 0; + } + } + else /* it's an EOB or a length */ + { + /* exit if end of block */ + if (e == 15) + break; + + /* get length of block to copy */ + NEEDBITS(e) + n = t->v.n + ((unsigned)b & mask_bits[e]); + DUMPBITS(e); + + /* decode distance of block to copy */ + NEEDBITS((unsigned)bd) + if ((e = (t = td + ((unsigned)b & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + NEEDBITS(e) + d = w - t->v.n - ((unsigned)b & mask_bits[e]); + DUMPBITS(e) + Tracevv((stderr,"\\[%d,%d]", w-d, n)); + + /* do the copy */ + do { + n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); +#if !defined(NOMEMCPY) && !defined(INFLATE_DEBUG) + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* !NOMEMCPY */ + do { + slide[w++] = slide[d++]; + Tracevv((stderr, "%c", slide[w-1])); + } while (--e); + if (w == WSIZE) + { + flush_output(w); + w = 0; + } + } while (n); + } + } + + + /* restore the globals from the locals */ + wp = w; /* restore global window pointer */ + bb = b; /* restore global bit buffer */ + bk = k; + + /* done */ + return 0; +} + + + +FUNC_STATIC int inflate_stored() +/* "decompress" an inflated type 0 (stored) block. */ +{ + unsigned n; /* number of bytes in block */ + unsigned w; /* current window position */ + register ulg b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + +DEBG(""); + return 0; +} + + + +FUNC_STATIC int inflate_fixed() +/* decompress an inflated type 1 (fixed Huffman codes) block. We should + either replace this with a custom decoder, or at least precompute the + Huffman tables. */ +{ + int i; /* temporary variable */ + struct huft *tl; /* literal/length code table */ + struct huft *td; /* distance code table */ + int bl; /* lookup bits for tl */ + int bd; /* lookup bits for td */ + unsigned l[288]; /* length list for huft_build */ + +DEBG(" 1) + { + huft_free(tl); + + DEBG(">"); + return i; + } + + + /* decompress until an end-of-block code */ + if (inflate_codes(tl, td, bl, bd)) + return 1; + + + /* free the decoding tables, return */ + huft_free(tl); + huft_free(td); + return 0; +} + + + +FUNC_STATIC int inflate_dynamic() +/* decompress an inflated type 2 (dynamic Huffman codes) block. */ +{ + int i; /* temporary variables */ + unsigned j; + unsigned l; /* last length */ + unsigned m; /* mask for bit lengths table */ + unsigned n; /* number of lengths to get */ + struct huft *tl; /* literal/length code table */ + struct huft *td; /* distance code table */ + int bl; /* lookup bits for tl */ + int bd; /* lookup bits for td */ + unsigned nb; /* number of bit length codes */ + unsigned nl; /* number of literal/length codes */ + unsigned nd; /* number of distance codes */ +#ifdef PKZIP_BUG_WORKAROUND + unsigned ll[288+32]; /* literal/length and distance code lengths */ +#else + unsigned ll[286+30]; /* literal/length and distance code lengths */ +#endif + register ulg b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + +DEBG(" 288 || nd > 32) +#else + if (nl > 286 || nd > 30) +#endif + return 1; /* bad lengths */ + +DEBG("dyn1 "); + + /* read in bit-length-code lengths */ + for (j = 0; j < nb; j++) + { + NEEDBITS(3) + ll[border[j]] = (unsigned)b & 7; + DUMPBITS(3) + } + for (; j < 19; j++) + ll[border[j]] = 0; + +DEBG("dyn2 "); + + /* build decoding table for trees--single level, 7 bit lookup */ + bl = 7; + if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) + { + if (i == 1) + huft_free(tl); + return i; /* incomplete code set */ + } + +DEBG("dyn3 "); + + /* read in literal and distance code lengths */ + n = nl + nd; + m = mask_bits[bl]; + i = l = 0; + while ((unsigned)i < n) + { + NEEDBITS((unsigned)bl) + j = (td = tl + ((unsigned)b & m))->b; + DUMPBITS(j) + j = td->v.n; + if (j < 16) /* length of code in bits (0..15) */ + ll[i++] = l = j; /* save last length in l */ + else if (j == 16) /* repeat last length 3 to 6 times */ + { + NEEDBITS(2) + j = 3 + ((unsigned)b & 3); + DUMPBITS(2) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = l; + } + else if (j == 17) /* 3 to 10 zero length codes */ + { + NEEDBITS(3) + j = 3 + ((unsigned)b & 7); + DUMPBITS(3) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = 0; + l = 0; + } + else /* j == 18: 11 to 138 zero length codes */ + { + NEEDBITS(7) + j = 11 + ((unsigned)b & 0x7f); + DUMPBITS(7) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = 0; + l = 0; + } + } + +DEBG("dyn4 "); + + /* free decoding table for trees */ + huft_free(tl); + +DEBG("dyn5 "); + + /* restore the global bit buffer */ + bb = b; + bk = k; + +DEBG("dyn5a "); + + /* build the decoding tables for literal/length and distance codes */ + bl = lbits; + if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) + { +DEBG("dyn5b "); + if (i == 1) { + error(" incomplete literal tree\n"); + huft_free(tl); + } + return i; /* incomplete code set */ + } +DEBG("dyn5c "); + bd = dbits; + if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) + { +DEBG("dyn5d "); + if (i == 1) { + error(" incomplete distance tree\n"); +#ifdef PKZIP_BUG_WORKAROUND + i = 0; + } +#else + huft_free(td); + } + huft_free(tl); + return i; /* incomplete code set */ +#endif + } + +DEBG("dyn6 "); + + /* decompress until an end-of-block code */ + if (inflate_codes(tl, td, bl, bd)) + return 1; + +DEBG("dyn7 "); + + /* free the decoding tables, return */ + huft_free(tl); + huft_free(td); + + DEBG(">"); + return 0; +} + + + +FUNC_STATIC int inflate_block(e) +int *e; /* last block flag */ +/* decompress an inflated block */ +{ + unsigned t; /* block type */ + register ulg b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + + DEBG(""); + + /* bad block type */ + return 2; +} + + + +FUNC_STATIC int inflate() +/* decompress an inflated entry */ +{ + int e; /* last block flag */ + int r; /* result code */ + unsigned h; /* maximum struct huft's malloc'ed */ + + /* initialize window, bit buffer */ + wp = 0; + bk = 0; + bb = 0; + + + /* decompress until the last block */ + h = 0; + do { + hufts = 0; + if ((r = inflate_block(&e)) != 0) { + return r; + } + if (hufts > h) + h = hufts; + } while (!e); + + /* Undo too much lookahead. The next read will be byte aligned so we + * can discard unused bits in the last meaningful byte. + */ + while (bk >= 8) { + bk -= 8; + inptr--; + } + + /* flush out slide */ + flush_output(wp); + + + /* return success */ +#ifdef INFLATE_DEBUG +#ifdef EFI_COMPILE + Print(L"<%d> ", h); +#else + printf("<%d> ", h); +#endif +#endif /* INFLATE_DEBUG */ + return 0; +} + +/********************************************************************** + * + * The following are support routines for inflate.c + * + **********************************************************************/ + +static ulg crc_32_tab[256]; +static ulg crc; /* initialized in makecrc() so it'll reside in bss */ +#define CRC_VALUE (crc ^ 0xffffffffUL) + +/* + * Code to compute the CRC-32 table. Borrowed from + * gzip-1.0.3/makecrc.c. + */ + +static void +makecrc(void) +{ +/* Not copyrighted 1990 Mark Adler */ + + unsigned long c; /* crc shift register */ + unsigned long e; /* polynomial exclusive-or pattern */ + int i; /* counter for all possible eight bit values */ + int k; /* byte being shifted into crc apparatus */ + + /* terms of polynomial defining this crc (except x^32): */ + static const int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* Make exclusive-or pattern from polynomial */ + e = 0; + for (i = 0; i < sizeof(p)/sizeof(int); i++) + e |= 1L << (31 - p[i]); + + crc_32_tab[0] = 0; + + for (i = 1; i < 256; i++) + { + c = 0; + for (k = i | 256; k != 1; k >>= 1) + { + c = c & 1 ? (c >> 1) ^ e : c >> 1; + if (k & 1) + c ^= e; + } + crc_32_tab[i] = c; + } + + /* this is initialized here so this code could reside in ROM */ + crc = (ulg)0xffffffffUL; /* shift register contents */ +} + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ +#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ +#define RESERVED 0xC0 /* bit 6,7: reserved */ + +/* + * check for valid gzip signature + * return: + * 0 : valid gzip archive + * -1: invalid gzip archive + */ +int +gzip_probe(uch *buf, unsigned long size) +{ + /* FIXME this is wrong here! FIXME!!!!*/ + if (size < 4) return -1; + + if (buf[0] != 037 || + ((buf[1] != 0213) && (buf[1] != 0236))) return -1; + + /* We only support method #8, DEFLATED */ + if (buf[2] != 8) return -1; + + if ((buf[3] & ENCRYPTED) != 0) return -1; + + if ((buf[3] & CONTINUATION) != 0) return -1; + + if ((buf[3] & RESERVED) != 0) return -1; + + return 0; +} + + +/* + * Do the uncompression! + */ +static int gunzip(void) +{ + uch flags; + unsigned char magic[2]; /* magic header */ + char method; + ulg orig_crc = 0; /* original crc */ + ulg orig_len = 0; /* original uncompressed length */ + int res; + + magic[0] = (unsigned char)get_byte(); + magic[1] = (unsigned char)get_byte(); + method = (unsigned char)get_byte(); + + if (magic[0] != 037 || + ((magic[1] != 0213) && (magic[1] != 0236))) { + error("bad gzip magic numbers"); + return -1; + } + + /* We only support method #8, DEFLATED */ + if (method != 8) { + error("internal error, invalid method"); + return -1; + } + + flags = (uch)get_byte(); + if ((flags & ENCRYPTED) != 0) { + error("Input is encrypted\n"); + return -1; + } + if ((flags & CONTINUATION) != 0) { + error("Multi part input\n"); + return -1; + } + if ((flags & RESERVED) != 0) { + error("Input has invalid flags\n"); + return -1; + } + (ulg)get_byte(); /* Get timestamp */ + ((ulg)get_byte()) << 8; + ((ulg)get_byte()) << 16; + ((ulg)get_byte()) << 24; + + (void)get_byte(); /* Ignore extra flags for the moment */ + (void)get_byte(); /* Ignore OS type for the moment */ + + if ((flags & EXTRA_FIELD) != 0) { + unsigned len = (unsigned)get_byte(); + len |= ((unsigned)get_byte())<<8; + while (len--) (void)get_byte(); + } + + /* Get original file name if it was truncated */ + if ((flags & ORIG_NAME) != 0) { + /* Discard the old name */ + while (get_byte() != 0) /* null */ ; + } + + /* Discard file comment if any */ + if ((flags & COMMENT) != 0) { + while (get_byte() != 0) /* null */ ; + } + + /* Decompress */ + if ((res = inflate())) { + switch (res) { + case 0: + break; + case 1: + error("invalid compressed format (err=1)"); + break; + case 2: + error("invalid compressed format (err=2)"); + break; + case 3: + error("out of memory"); + break; + default: + error("invalid compressed format (other)"); + } + return -1; + } + + /* Get the crc and original length */ + /* crc32 (see algorithm.doc) + * uncompressed input size modulo 2^32 + */ + orig_crc = (ulg) get_byte(); + orig_crc |= (ulg) get_byte() << 8; + orig_crc |= (ulg) get_byte() << 16; + orig_crc |= (ulg) get_byte() << 24; + + orig_len = (ulg) get_byte(); + orig_len |= (ulg) get_byte() << 8; + orig_len |= (ulg) get_byte() << 16; + orig_len |= (ulg) get_byte() << 24; + + /* Validate decompression */ + if (orig_crc != CRC_VALUE) { + error("crc error"); + return -1; + } + if (orig_len != bytes_out) { + error("length error"); + return -1; + } + return 0; +} + + diff --git a/ia32/plain_loader.c b/ia32/plain_loader.c new file mode 100644 index 0000000..ac4c573 --- /dev/null +++ b/ia32/plain_loader.c @@ -0,0 +1,285 @@ +/* + * Copyright (C) 2001-2002 Hewlett-Packard Co. + * Contributed by Stephane Eranian + * + * Copyright (C) 2001 Silicon Graphics, Inc. + * Contributed by Brent Casavant + * + * This file is part of the ELILO, the EFI Linux boot loader. + * + * ELILO is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * ELILO is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ELILO; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Please check out the elilo.txt for complete documentation on how + * to use this program. + */ + +#include +#include + +#include "elilo.h" +#include "loader.h" +#include "elf.h" +#include "private.h" + +#define LD_NAME L"plain_elf32" + +static INTN +is_valid_header(Elf32_Ehdr *ehdr) +{ + UINT16 type, machine; + + type = ehdr->e_type; + machine = ehdr->e_machine; + + DBG_PRT((L"class=%d type=%d data=%d machine=%d\n", + ehdr->e_ident[EI_CLASS], + type, + ehdr->e_ident[EI_DATA], + machine)); + + return ehdr->e_ident[EI_MAG0] == 0x7f + && ehdr->e_ident[EI_MAG1] == 'E' + && ehdr->e_ident[EI_MAG2] == 'L' + && ehdr->e_ident[EI_MAG3] == 'F' + && ehdr->e_ident[EI_CLASS] == ELFCLASS32 + && type == ET_EXEC /* must be executable */ + && machine == EM_386 ? 0 : -1; +} + +static INTN +plain_probe(CHAR16 *kname) +{ + Elf32_Ehdr ehdr; + EFI_STATUS status; + INTN ret = -1; + fops_fd_t fd; + UINTN size = sizeof(ehdr); + + status = fops_open(kname, &fd); + if (EFI_ERROR(status)) + return -1; + + status = fops_read(fd, &ehdr, &size); + if (EFI_ERROR(status) || size != sizeof(ehdr)) + goto error; + + ret = is_valid_header(&ehdr); +error: + fops_close(fd); + return ret; +} + + +static INTN +load_elf(fops_fd_t fd, kdesc_t *kd) +{ + Elf32_Ehdr ehdr; + Elf32_Phdr *phdrs; + EFI_STATUS status; + INTN ret = ELILO_LOAD_ERROR; + UINTN i, total_size = 0; + UINTN pages, size, bss_sz, osize; + VOID *low_addr = (VOID *)~0; + VOID *max_addr = (VOID *)0; + UINTN paddr, memsz, filesz; + UINT16 phnum; + + Print(L"Loading Linux... "); + + size = sizeof(ehdr); + + status = fops_read(fd, &ehdr, &size); + if (EFI_ERROR(status) || size < sizeof(ehdr)) + return ELILO_LOAD_ERROR; + + if (is_valid_header(&ehdr) == -1) { + ERR_PRT((L"%s : not a 32-bit ELF image\n", LD_NAME)); + return ELILO_LOAD_ERROR; + } + VERB_PRT(3, { + Print(L"ELF Header information: \n"); + Print(L"\tEntry point 0x%x\n", (ehdr.e_entry & PADDR_MASK)); + Print(L"\t%d program headers\n", ehdr.e_phnum); + Print(L"\t%d segment headers\n", ehdr.e_shnum); + }); + + phnum = ehdr.e_phnum; + + if (fops_seek(fd, ehdr.e_phoff) < 0) { + ERR_PRT((L"%s : seek to %d for phdrs failed", LD_NAME, ehdr.e_phoff)); + return ELILO_LOAD_ERROR; + } + size = osize = (phnum * sizeof(Elf32_Phdr)); + + DBG_PRT((L"%s : allocate %d bytes for %d pheaders each of size:%d phentsize=%d\n", + LD_NAME, size, phnum, sizeof(Elf32_Phdr), ehdr.e_phentsize)); + + phdrs = (Elf32_Phdr *)alloc(size, 0); + if (phdrs == NULL) { + ERR_PRT((L"%s : allocate for phdrs failed", LD_NAME)); + return ELILO_LOAD_ERROR; + } + status = fops_read(fd, phdrs, &size); + if (EFI_ERROR(status) || size != osize) { + ERR_PRT((L"%s : phdr load failed", LD_NAME, status)); + goto out; + } + /* + * First pass to figure out total memory footprint + */ + for (i = 0; i < phnum; i++) { + + paddr = (phdrs[i].p_paddr & PADDR_MASK); + memsz = phdrs[i].p_memsz; + + DBG_PRT((L"Phdr %d paddr [0x%x-0x%x] offset 0x%x" + " filesz 0x%x memsz=0x%x bss_sz=0x%x p_type=0x%x\n", + 1+i, paddr, paddr+phdrs[i].p_filesz, phdrs[i].p_offset, + phdrs[i].p_filesz, memsz, + (memsz - phdrs[i].p_filesz), phdrs[i].p_type)); + + if (phdrs[i].p_type != PT_LOAD) + continue; + if (paddr < (UINTN)low_addr) + low_addr = (VOID *)paddr; + if (paddr + memsz > (UINTN)max_addr) + max_addr = (VOID *)paddr + memsz; + } + + if ((UINTN)low_addr & (EFI_PAGE_SIZE - 1)) { + ERR_PRT((L"%s : kernel low address 0x%x not page aligned\n", + LD_NAME, low_addr)); + goto out; + } + /* how many bytes are needed to hold the kernel? */ + total_size = (UINTN)max_addr - (UINTN)low_addr; + + /* round up to get required number of pages */ + pages = EFI_SIZE_TO_PAGES(total_size); + + /* keep track of location where kernel starts and ends */ + kd->kstart = low_addr; + kd->kend = (low_addr + (pages << EFI_PAGE_SHIFT)); + kd->kentry = (VOID *)(ehdr.e_entry & PADDR_MASK); + + VERB_PRT(3, { + Print(L"Lowest PhysAddr: 0x%x\nTotalMemSize:%d bytes (%d pages)\n", + low_addr, total_size, pages); + Print(L"Kernel entry @ 0x%x\n", kd->kentry); + }); + + /* now allocate memory for the kernel at the exact requested spot */ + if (alloc_kmem(low_addr, pages) == -1) { + ERR_PRT((L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", + LD_NAME, pages, low_addr)); + ERR_PRT((L"%s : Could not alloc %d pages for the kernel at 0x%lx " + " and relocation is not not been implemented!\n", + LD_NAME, pages, low_addr)); + goto load_abort; + } + /* Pure paranoia. Clear the memory first. Just in case... */ + Memset(low_addr, 0, (pages << EFI_PAGE_SHIFT)); + + VERB_PRT(1, Print(L"Press any key to interrupt\n")); + + /* + * Walk through the program headers + * and actually load data into physical memory + */ + + for (i = 0; i < phnum; i++) { + + /* Check for pure loadable segment; ignore if not loadable */ + if (phdrs[i].p_type != PT_LOAD) + continue; + + VERB_PRT(3, Print(L"poffs: 0x%x (phdrs[%d].p_offset)\n", + phdrs[i].p_offset, i)); + + filesz = phdrs[i].p_filesz; + low_addr = (VOID *)((UINTN) phdrs[i].p_paddr & PADDR_MASK); + + /* Move to the right position */ + if (fops_seek(fd, phdrs[i].p_offset) < 0) + goto out_kernel; + + /* How many BSS bytes to clear */ + bss_sz = phdrs[i].p_memsz - filesz; + + VERB_PRT(4, { + Print(L"\nHeader #%d\n", i); + Print(L"Offset in file 0x%x\n", phdrs[i].p_offset); + Print(L"Physical addr 0x%x\n", low_addr); + Print(L"BSS size 0x%x bytes\n", bss_sz); + }); + + /* + * Read actual segment into memory + */ + ret = fops_read(fd, low_addr, &filesz); + if (ret == ELILO_LOAD_ABORTED) goto load_abort; + if (ret == ELILO_LOAD_ERROR) goto out; + + /* + * Clear bss section + */ + if (bss_sz) + Memset((VOID *)low_addr+filesz, 0, bss_sz); + } + + free(phdrs); + + Print(L"..Done\n"); + return ELILO_LOAD_SUCCESS; + +load_abort: + Print(L"..Aborted\n"); + ret = ELILO_LOAD_ABORTED; +out_kernel: + /* free kernel memory */ + free_kmem(); +out: + free(phdrs); + return ret; +} + +static INTN +plain_load_kernel(CHAR16 *kname, kdesc_t *kd) +{ + INTN ret; + fops_fd_t fd; + EFI_STATUS status; + + /* + * Moving the open here simplifies the load_elf() error handling + */ + status = fops_open(kname, &fd); + if (EFI_ERROR(status)) return ELILO_LOAD_ERROR; + + Print(L"Loading %s...", kname); + + ret = load_elf(fd, kd); + + fops_close(fd); + return ret; +} + +loader_ops_t plain_loader={ + NULL, + LD_NAME, + plain_probe, + plain_load_kernel +}; diff --git a/ia32/sysdeps.h b/ia32/sysdeps.h index d6f3324..0cec75a 100644 --- a/ia32/sysdeps.h +++ b/ia32/sysdeps.h @@ -33,6 +33,7 @@ #define __ELILO_SYSDEPS_IA32_H__ #define ELILO_ARCH "IA-32" /* ASCII string */ +#define PADDR_MASK 0xfffffff /* for now use library versions */ #define Memset(a,v,n) SetMem((a),(n),(v)) @@ -56,28 +57,7 @@ * A new bit, LDRFLAG_BOOT_PARAM_RELOC, in the loader_flags * field is also defined in this file. */ -typedef struct efi_ia32_boot_params { - UINT32 size; - UINT32 command_line; - UINT32 efi_sys_tbl; - UINT32 efi_mem_map; - UINT32 efi_mem_map_size; - UINT32 efi_mem_desc_size; - UINT32 efi_mem_desc_version; - UINT32 initrd_start; - UINT32 initrd_size; - UINT32 loader_start; - UINT32 loader_size; - UINT32 kernel_start; - UINT32 kernel_size; - UINT16 num_cols; - UINT16 num_rows; - UINT16 orig_x; - UINT16 orig_y; -} efi_ia32_boot_params_t; -extern efi_ia32_boot_params_t efi_ia32_bp; - #pragma pack(1) typedef union ia32_boot_params { UINT8 raw[0x2000]; @@ -275,7 +255,9 @@ typedef union ia32_boot_params { /* 0x224 */ UINT16 heap_end_ptr; /* LDR */ /* %%TBD */ -/* 0x226 */ UINT32 base_mem_size; /* LDR */ +/* 0x226 */ UINT16 unused_7; /* LDR */ + +/* 0x228 */ UINT32 cmdline_addr; /* LDR */ } s; } boot_params_t; #pragma pack() @@ -354,7 +336,6 @@ start_kernel(VOID *kentry, boot_params_t *bp) /* * Disable interrupts. */ - asm volatile ( "cli" : : ); /* @@ -362,11 +343,9 @@ start_kernel(VOID *kentry, boot_params_t *bp) */ if (bp->s.initrd_start) { - /* %%TBD */ MEMCPY(15 * 1024 * 1024, bp->s.initrd_start, bp->s.initrd_size); bp->s.initrd_start = 15 * 1024 * 1024; } - /* * Copy boot sector, setup data and command line * to final resting place. We need to copy @@ -375,20 +354,6 @@ start_kernel(VOID *kentry, boot_params_t *bp) MEMCPY(high_base_mem, bp, 0x4000); - /* - * initialize efi ia32 boot params and place them at 1kb up from - * the start of the boot command line param. This results in the - * efi ia32 boot params to be copied to 0x00104c00. See bootparams.c - * for details on how this is arranged. EFI enabled - * kernels will look for the efi boot params here to know if the - * kernel is booting on an EFI platform or legacy BIOS based platfrom - */ - - efi_ia32_bp.initrd_start = bp->s.initrd_start; - efi_ia32_bp.initrd_size = bp->s.initrd_size; - - MEMCPY(high_base_mem + 0x4000 - 0x0400, &efi_ia32_bp, sizeof(efi_ia32_bp)); - /* * Initialize Linux GDT. */ @@ -429,7 +394,6 @@ start_kernel(VOID *kentry, boot_params_t *bp) * Jump to kernel entry point. */ - asm volatile ( "jmp *%%ecx" : : ); } diff --git a/ia32/system.c b/ia32/system.c index 2e8b8e4..7c2228a 100644 --- a/ia32/system.c +++ b/ia32/system.c @@ -26,30 +26,23 @@ */ /* - * this file contains all the IA-32 specific code expected by generic loader + * This file contains all the IA-32 specific code expected by generic loader */ #include #include #include "elilo.h" #include "loader.h" - #include "rmswitch.h" -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -/* extern loader_ops_t plain_loader, gzip_loader; */ - -efi_ia32_boot_params_t efi_ia32_bp; - +extern loader_ops_t bzimage_loader, plain_loader, gzip_loader; /* * Descriptor table base addresses & limits for Linux startup. */ dt_addr_t gdt_addr = { 0x800, 0x94000 }; -dt_addr_t idt_addr = { 0, 0 }; +dt_addr_t idt_addr = { 0, 0 }; /* * Initial GDT layout for Linux startup. @@ -77,7 +70,6 @@ UINT16 init_gdt[] = { UINTN sizeof_init_gdt = sizeof init_gdt; - /* * Highest available base memory address. * @@ -98,266 +90,33 @@ UINTN high_base_mem = 0x90000; * * This is computed by taking the highest available extended memory * address and rounding down to the nearest EFI_PAGE_SIZE (usually - * 4 kB) boundary. The ia32 Linux kernel can only support up to - * 2 GB (AFAIK). + * 4 kB) boundary. + * This is only used for backward compatibility. */ UINTN high_ext_mem = 32 * 1024 * 1024; -/* - * Starting location and size of runtime memory blocks. - */ - -boot_params_t *param_start = NULL; -UINTN param_size = 0; - +/* This starting address will hold true for all of the loader types for now */ VOID *kernel_start = (VOID *)0x100000; /* 1M */ -UINTN kernel_size = 0x200000; /* 2M (largest x86 kernel image) */ VOID *initrd_start = NULL; UINTN initrd_size = 0; -/* - * Boot parameters can be relocated if TRUE. - * Boot parameters must be placed at 0x90000 if FALSE. - * - * This will be set to TRUE if bit 6 (0x40) is set in the loader_flags - * field in a compressed x86 boot format kernel. This will also be set - * to TRUE if the kernel is an uncompressed ELF32 image. - * - * To remote boot w/ the universal network driver and a 16-bit UNDI - * this must be set to TRUE. - */ - -BOOLEAN can_reloc_boot_params = FALSE; - -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -static INTN -probe_bzImage_boot(CHAR16 *kname) -{ - EFI_STATUS efi_status; - UINTN size; - fops_fd_t fd; - UINT8 bootsect[512]; - - DBG_PRT((L"probe_bzImage_boot()\n")); - - if (!kname) { - ERR_PRT((L"kname == %xh", kname)); - free_kmem(); - return -1; - } - - /* - * Open kernel image. - */ - - DBG_PRT((L"opening %s...\n", kname)); - - efi_status = fops_open(kname, &fd); - - if (EFI_ERROR(efi_status)) { - ERR_PRT((L"Could not open %s.", kname)); - free_kmem(); - return -1; - } - - /* - * Read boot sector. - */ - - DBG_PRT((L"\nreading boot sector...\n")); - - size = sizeof bootsect; - efi_status = fops_read(fd, bootsect, &size); - - if (EFI_ERROR(efi_status) || size != sizeof bootsect) { - ERR_PRT((L"Could not read boot sector from %s.", kname)); - fops_close(fd); - free_kmem(); - return -1; - } - - /* - * Verify boot sector signature. - */ - - if (bootsect[0x1FE] != 0x55 || bootsect[0x1FF] != 0xAA) { - ERR_PRT((L"%s is not a bzImage kernel image.\n", kname)); - fops_close(fd); - free_kmem(); - return -1; - } - - /* - * Check for out of range setup data size. - * Will almost always be 7, but we will accept 1 to 64. - */ - - DBG_PRT((L"bootsect[1F1h] == %d setup sectors\n", bootsect[0x1F1])); - - if (bootsect[0x1F1] < 1 || bootsect[0x1F1] > 64) { - ERR_PRT((L"%s is not a valid bzImage kernel image.", - kname)); - - fops_close(fd); - free_kmem(); - return -1; - } - - /* - * Allocate and read setup data. - */ - - DBG_PRT((L"reading setup data...\n")); - - param_size = (bootsect[0x1F1] + 1) * 512; - //param_start = alloc(param_size, EfiBootServicesData); - param_start = alloc(param_size, EfiLoaderData); - - DBG_PRT((L"param_size=%d param_start=%x", param_size, param_start)); - - if (!param_start) { - ERR_PRT((L"Could not allocate %d bytes of setup data.", - param_size)); - - fops_close(fd); - free_kmem(); - return -1; - } - - CopyMem(param_start, bootsect, sizeof bootsect); - - size = param_size - 512; - efi_status = fops_read(fd, ((UINT8 *)param_start) + 512, &size); - - if (EFI_ERROR(efi_status) || size != param_size - 512) { - ERR_PRT((L"Could not read %d bytes of setup data.", - param_size - 512)); - - free(param_start); - param_start = NULL; - param_size = 0; - fops_close(fd); - free_kmem(); - return -1; - } - - /* - * Check for setup data signature. - */ - - { UINT8 *c = ((UINT8 *)param_start)+514; - DBG_PRT((L"param_start(c=%x): %c-%c-%c-%c", c, (CHAR16)c[0],(CHAR16) c[1], (CHAR16)c[2], (CHAR16)c[3])); - } - if (CompareMem(((UINT8 *)param_start) + 514, "HdrS", 4)) { - ERR_PRT((L"%s does not have a setup signature.", - kname)); - - free(param_start); - param_start = NULL; - param_size = 0; - fops_close(fd); - free_kmem(); - return -1; - } - - /* - * Allocate memory for kernel. - */ - - if (alloc_kmem(kernel_start, EFI_SIZE_TO_PAGES(kernel_size))) { - ERR_PRT((L"Could not allocate kernel memory.")); - return -1; - } else { - VERB_PRT(3, Print(L"kernel_start: 0x%x kernel_size: %d\n", kernel_start, kernel_size)); - } - - /* - * Now read the rest of the kernel image into memory. - */ - - DBG_PRT((L"reading kernel image...\n")); - - size = kernel_size; - - efi_status = fops_read(fd, kernel_start, &size); - - if (EFI_ERROR(efi_status) || size < 0x10000) { - ERR_PRT((L"Error reading kernel image %s.", kname)); - free(param_start); - param_start = NULL; - param_size = 0; - fops_close(fd); - free_kmem(); - return -1; - } - - DBG_PRT((L"kernel image read: %d bytes, %d Kbytes\n", size, size / 1024)); - - /* - * Boot sector, setup data and kernel image loaded. - */ - - fops_close(fd); - return 0; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -static INTN -load_bzImage_boot(CHAR16 *kname, kdesc_t *kd) -{ - DBG_PRT((L"load_bzImage_boot()\n")); - - if (!kname || !kd) { - ERR_PRT((L"kname=0x%x kd=0x%x", kname, kd)); - - free(param_start); - param_start = NULL; - param_size = 0; - free_kmem(); - return -1; - } - - kd->kstart = kd->kentry = kernel_start; - kd->kend = ((UINT8 *)kd->kstart) + kernel_size; - - DBG_PRT((L"kstart=0x%x kentry=0x%x kend=0x%x\n", kd->kstart, kd->kentry, kd->kend)); - - return 0; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -static loader_ops_t loader_bzImage_boot = { - NULL, - L"loader_bzImage_boot", - &probe_bzImage_boot, - &load_bzImage_boot -}; - -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ INTN sysdeps_init(EFI_HANDLE dev) { - DBG_PRT((L"sysdeps_init()\n")); /* * Register our loader(s)... */ - loader_register(&loader_bzImage_boot); - /* loader_register(&plain_loader); */ - /* loader_register(&gzip_loader); */ - - + loader_register(&bzimage_loader); + loader_register(&plain_loader); + loader_register(&gzip_loader); return 0; } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* * initrd_get_addr() * Compute a starting address for the initial RAMdisk image. @@ -381,13 +140,12 @@ sysdeps_initrd_get_addr(kdesc_t *kd, memdesc_t *imem) imem->start_addr = kd->kend; - VERB_PRT(3, Print(L"initrd start_addr=0x%x pgcnt=%d\n", imem->start_addr, imem->pgcnt)); + VERB_PRT(3, Print(L"initrd start_addr=0x%x pgcnt=%d\n", + imem->start_addr, imem->pgcnt)); return 0; } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ VOID sysdeps_free_boot_params(boot_params_t *bp) { @@ -398,8 +156,6 @@ sysdeps_free_boot_params(boot_params_t *bp) free_memmap(&md); } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* * IA-32 specific boot parameters initialization routine */ @@ -423,9 +179,11 @@ sysdeps_create_boot_params( ERR_PRT((L"bp=0x%x cmdline=0x%x initrd=0x%x cookie=0x%x", bp, cmdline, initrd, cookie)); - free(param_start); - param_start = NULL; - param_size = 0; + if (param_start != NULL) { + free(param_start); + param_start = NULL; + param_size = 0; + } free_kmem(); return -1; } @@ -436,29 +194,27 @@ sysdeps_create_boot_params( * the first two sectors (1K). The rest of the storage * can be used by the command line. */ - - CopyMem(bp, param_start, 0x2000); - - free(param_start); - param_start = NULL; - param_size = 0; - + if (param_start != NULL) { + CopyMem(bp, param_start, 0x2000); + free(param_start); + param_start = NULL; + param_size = 0; + } /* * Save off our header revision information. */ - hdr_version = (bp->s.hdr_major << 8) | bp->s.hdr_minor; /* * Clear out unused memory in boot sector image. */ - bp->s.unused_1 = 0; bp->s.unused_2 = 0; ZeroMem(bp->s.unused_3, sizeof bp->s.unused_3); ZeroMem(bp->s.unused_4, sizeof bp->s.unused_4); ZeroMem(bp->s.unused_5, sizeof bp->s.unused_5); bp->s.unused_6 = 0; + bp->s.unused_7 = 0; /* * Tell kernel this was loaded by an advanced loader type. @@ -475,6 +231,12 @@ sysdeps_create_boot_params( bp->s.cmdline_magik = CMDLINE_MAGIK; bp->s.cmdline_offset = (UINT8 *)cmdline - (UINT8 *)bp; + /* + * Clear out the cmdline_addr field so the kernel can find + * the cmdline. + */ + bp->s.cmdline_addr = 0x0; + /* * Setup hard drive parameters. * %%TBD - It should be okay to zero fill the hard drive @@ -484,28 +246,16 @@ sysdeps_create_boot_params( ZeroMem(bp->s.hd0_info, sizeof bp->s.hd0_info); ZeroMem(bp->s.hd1_info, sizeof bp->s.hd1_info); -#if 0 - CopyMem(bp->s.hd0_info, *((VOID **)(0x41 * 4)), - sizeof bp->s.hd0_info); - - CopyMem(bp->s.hd1_info, *((VOID **)(0x46 * 4)), - sizeof bp->s.hd1_info); -#endif - /* * Memory info. */ bp->s.alt_mem_k = high_ext_mem / 1024; - if (bp->s.alt_mem_k <= 65535) { + if (bp->s.alt_mem_k <= 65535) bp->s.ext_mem_k = (UINT16)bp->s.alt_mem_k; - } else { + else bp->s.ext_mem_k = 65535; - } - - if (hdr_version < 0x0202) - bp->s.base_mem_size = high_base_mem; /* * Initial RAMdisk and root device stuff. @@ -525,24 +275,17 @@ sysdeps_create_boot_params( /* * This is the RAMdisk root device for RedHat 2.2.x * kernels (major 0x01, minor 0x00). - * %%TBD - Will this work for other distributions and - * 2.3.x and 2.4.x kernels? I do not know, yet. */ bp->s.orig_root_dev = 0x0100; } else { bp->s.initrd_start = 0; bp->s.initrd_size = 0; - - /* Do not change the root device if there is no RAMdisk. */ - /* bp->s.orig_root_dev = 0; */ } /* * APM BIOS info. */ - -/* %%TBD - How to do Int 15h calls to get this info? */ bp->s.apm_bios_ver = NO_APM_BIOS; bp->s.bios_code_seg = 0; bp->s.bios_entry_point = 0; @@ -555,29 +298,22 @@ sysdeps_create_boot_params( /* * MCA BIOS info (misnomer). */ - -/* %%TBD - How to do Int 15h call to get this info? */ bp->s.mca_info_len = 0; ZeroMem(bp->s.mca_info_buf, sizeof bp->s.mca_info_buf); /* - * Pointing device presence. + * Pointing device presence. The kernel will detect this. */ - -/* %%TBD - How to do Int 11h call to get this info? */ bp->s.aux_dev_info = NO_MOUSE; /* - * EFI loader signature and address of EFI system table. + * EFI loader signature */ - CopyMem(bp->s.efi_loader_sig, EFI_LOADER_SIG, 4); - bp->s.efi_sys_tbl = 0; /* %%TBD */ /* * Kernel entry point. */ - bp->s.kernel_start = (UINT32)kernel_start; /* @@ -587,6 +323,7 @@ sysdeps_create_boot_params( * arch/i386/boot/bootsect.S * arch/i386/boot/setup.S * arch/i386/kernel/setup.c + * include/asm-i386/setup.h (2.5/2.6) */ #define CHECK_OFFSET(n, o, f) \ @@ -610,7 +347,6 @@ sysdeps_create_boot_params( ; \ } \ } - { UINTN test = 0; @@ -688,7 +424,7 @@ sysdeps_create_boot_params( CHECK_OFFSET(initrd_size, 0x21C, L"%xh"); CHECK_OFFSET(bootsect_helper, 0x220, L"%xh"); CHECK_OFFSET(heap_end_ptr, 0x224, L"%xh"); - CHECK_OFFSET(base_mem_size, 0x226, L"%xh"); + CHECK_OFFSET(cmdline_addr, 0x228, L"%xh"); if (test) { ERR_PRT((L"Boot sector and/or setup parameter alignment error.")); @@ -711,7 +447,6 @@ sysdeps_create_boot_params( if (EFI_ERROR(efi_status)) { ERR_PRT((L"QueryMode failed. Fake it.")); - mode = 3; rows = 25; cols = 80; @@ -730,12 +465,10 @@ sysdeps_create_boot_params( bp->s.orig_video_cols = (UINT8)cols; bp->s.orig_video_rows = (UINT8)rows; -/* %%TBD - How to do Int 10h calls to get video info? */ bp->s.orig_ega_bx = 0; bp->s.is_vga = 0; - bp->s.orig_video_points = 0; + bp->s.orig_video_points = 16; -/* %%TBD - How to do Int 10h calls to get frame buffer info? */ bp->s.lfb_width = 0; bp->s.lfb_height = 0; bp->s.lfb_depth = 0; @@ -763,7 +496,6 @@ sysdeps_create_boot_params( free_kmem(); return -1; } - *cookie = mdesc.cookie; bp->s.efi_mem_map = (UINTN)mdesc.md; bp->s.efi_mem_map_size = mdesc.map_size; @@ -771,28 +503,5 @@ sysdeps_create_boot_params( bp->s.efi_mem_desc_ver = mdesc.desc_version; bp->s.efi_sys_tbl = (UINTN)systab; - /* - * my_ia32_boot_params and get ready to slap them into 0x00104c00 - */ - - efi_ia32_bp.size= sizeof(efi_ia32_bp); - efi_ia32_bp.command_line = (UINT32) cmdline; - efi_ia32_bp.efi_sys_tbl = bp->s.efi_sys_tbl; - efi_ia32_bp.efi_mem_map = bp->s.efi_mem_map; - efi_ia32_bp.efi_mem_map_size = bp->s.efi_mem_map_size; - efi_ia32_bp.efi_mem_desc_size = bp->s.efi_mem_desc_size; - efi_ia32_bp.efi_mem_desc_version = bp->s.efi_mem_desc_ver; - efi_ia32_bp.initrd_start = (UINTN)initrd->start_addr; - efi_ia32_bp.initrd_size = initrd->pgcnt * EFI_PAGE_SIZE; - efi_ia32_bp.loader_start = 0; - efi_ia32_bp.loader_size = 0; - efi_ia32_bp.kernel_start = bp->s.kernel_start; - efi_ia32_bp.kernel_size = kernel_size; - efi_ia32_bp.num_cols = cols; - efi_ia32_bp.num_rows = rows; - efi_ia32_bp.orig_x = col; - efi_ia32_bp.orig_y = row; - - return 0; }