From 163b743a224f08b0c06a995a4007a48a5c1f1f234228878fc2db50b2898a57ee Mon Sep 17 00:00:00 2001 From: Berthold Gunreben Date: Mon, 20 Dec 2010 12:48:05 +0000 Subject: [PATCH] Accepting request 56257 from Base:System Accepted submit request 56257 from user coolo OBS-URL: https://build.opensuse.org/request/show/56257 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/elilo?expand=0&rev=18 --- elilo-3.12-source.tar.gz | 3 + elilo-3.8-cvs20080127.diff | 475 ------------------ elilo-3.8.tar.gz | 3 - elilo-MAC.diff | 17 +- elilo-avoid-tab.diff | 11 +- elilo-bzimage-alloc.diff | 196 +------- elilo-cleanup.diff | 163 ++++-- elilo-fix-amd64-netboot.diff | 44 -- elilo-fix-possible-overflow.diff | 11 +- ...ix.diff => elilo-fix-strncpy-overflow.diff | 19 +- elilo-longer-commandline.diff | 23 +- elilo-spelling.diff | 20 - elilo-text-mode.diff | 28 +- elilo-x86-64-bootproto-update.diff | 186 +++++++ elilo-x86-64-e820-max.diff | 230 +++++++++ elilo-x86-64-initrd.diff | 228 +++++++++ elilo-x86-64-kernel.diff | 257 ++++++++++ elilo.changes | 6 + elilo.pl | 13 +- elilo.spec | 65 +-- eliloalt-sysfs.diff | 22 +- 21 files changed, 1152 insertions(+), 868 deletions(-) create mode 100644 elilo-3.12-source.tar.gz delete mode 100644 elilo-3.8-cvs20080127.diff delete mode 100644 elilo-3.8.tar.gz delete mode 100644 elilo-fix-amd64-netboot.diff rename elilo-strncpy-overflow-fix.diff => elilo-fix-strncpy-overflow.diff (73%) delete mode 100644 elilo-spelling.diff create mode 100644 elilo-x86-64-bootproto-update.diff create mode 100644 elilo-x86-64-e820-max.diff create mode 100644 elilo-x86-64-initrd.diff create mode 100644 elilo-x86-64-kernel.diff diff --git a/elilo-3.12-source.tar.gz b/elilo-3.12-source.tar.gz new file mode 100644 index 0000000..5ee5cad --- /dev/null +++ b/elilo-3.12-source.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5005534ae972603c65caa8debb2bf3c4a22b895588323bc1b0a7a9f114e030ee +size 215125 diff --git a/elilo-3.8-cvs20080127.diff b/elilo-3.8-cvs20080127.diff deleted file mode 100644 index c6f431c..0000000 --- a/elilo-3.8-cvs20080127.diff +++ /dev/null @@ -1,475 +0,0 @@ -diff -ur elilo-3.8/Make.defaults elilo/Make.defaults ---- elilo-3.8/Make.defaults 2007-07-20 21:47:25.000000000 +0200 -+++ elilo/Make.defaults 2008-01-12 00:53:33.000000000 +0100 -@@ -68,7 +68,7 @@ - - OPTIMFLAGS = -O2 - DEBUGFLAGS = -Wall --CFLAGS = $(OPTIMFLAGS) -fpic -fshort-wchar $(DEBUGFLAGS) -+CFLAGS = $(OPTIMFLAGS) -fno-strict-aliasing -fpic -fshort-wchar $(DEBUGFLAGS) - LDFLAGS = -nostdlib -znocombreloc - INSTALL = install - -diff -ur elilo-3.8/alternate.c elilo/alternate.c ---- elilo-3.8/alternate.c 2007-07-20 21:47:26.000000000 +0200 -+++ elilo/alternate.c 2008-01-12 00:53:33.000000000 +0100 -@@ -56,7 +56,7 @@ - * Please note that no fatal error is reported by this function - */ - INTN --alternate_kernel(CHAR16 *buffer, INTN size) -+alternate_kernel(CHAR16 *buffer, UINTN size) - { - EFI_STATUS status; - INTN ret = -1; -diff -ur elilo-3.8/choosers/simple.c elilo/choosers/simple.c ---- elilo-3.8/choosers/simple.c 2007-07-20 21:47:26.000000000 +0200 -+++ elilo/choosers/simple.c 2008-01-12 00:53:33.000000000 +0100 -@@ -220,7 +220,7 @@ - { - fops_fd_t fd; - EFI_STATUS status; -- INTN len, i; -+ UINTN len, i; - CHAR16 *filename; - CHAR8 buf[256]; - -diff -ur elilo-3.8/choosers/textmenu.c elilo/choosers/textmenu.c ---- elilo-3.8/choosers/textmenu.c 2007-07-20 21:47:26.000000000 +0200 -+++ elilo/choosers/textmenu.c 2008-01-12 00:53:33.000000000 +0100 -@@ -186,12 +186,12 @@ - } - - static INTN --read_message_file(INTN msg, INT8 *buf, INTN max) -+read_message_file(INTN msg, UINT8 *buf, UINTN max) - { - CHAR16 *filename; - fops_fd_t message_fd; - EFI_STATUS status; -- INTN len = max; -+ UINTN len = max; - - if (msg > 10) return 0; - -diff -ur elilo-3.8/elilo.h elilo/elilo.h ---- elilo-3.8/elilo.h 2005-12-01 22:42:59.000000000 +0100 -+++ elilo/elilo.h 2008-01-12 00:53:33.000000000 +0100 -@@ -183,7 +183,7 @@ - extern INTN load_file(CHAR16 *, memdesc_t *); - - /* from alternate.c */ --extern INTN alternate_kernel(CHAR16 *, INTN); -+extern INTN alternate_kernel(CHAR16 *, UINTN); - - /* from bootparams.c */ - extern VOID *create_boot_params (CHAR16 *, memdesc_t *, memdesc_t *, UINTN *); -diff -ur elilo-3.8/ia32/gzip.c elilo/ia32/gzip.c ---- elilo-3.8/ia32/gzip.c 2005-12-01 22:42:59.000000000 +0100 -+++ elilo/ia32/gzip.c 2008-01-13 01:12:19.000000000 +0100 -@@ -153,7 +153,7 @@ - int - fill_inbuf(void) - { -- INTN expected, nread; -+ UINTN expected, nread; - EFI_STATUS status; - - expected = nread = INBUFSIZE; -@@ -277,7 +277,7 @@ - * the relevant header information. - */ - int --first_block (const char *buf, long blocksize) -+first_block (const unsigned char *buf, long blocksize) - { - Elf32_Ehdr *elf; - Elf32_Phdr *phdrs; -@@ -430,7 +430,7 @@ - static const CHAR8 helicopter[4] = { '|' , '/' , '-' , '\\' }; - static UINTN heli_count; - struct segment *cp; -- char *src, *dst; -+ unsigned char *src, *dst; - long cnt; - - if (!outcnt) return; -@@ -468,7 +468,7 @@ - file_offset += skip; - outcnt -= skip; - } -- dst = (char *)cp->addr + (file_offset - cp->offset); -+ dst = (unsigned char *)cp->addr + (file_offset - cp->offset); - cnt = cp->offset + cp->size - file_offset; - if (cnt > outcnt) - cnt = outcnt; -@@ -482,7 +482,7 @@ - /* 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; -+ dst = (unsigned char *)cp->addr + cp->size; - Memset(dst, 0, cp->bss_sz); - } - nextchunk(); -diff -ur elilo-3.8/ia32/system.c elilo/ia32/system.c ---- elilo-3.8/ia32/system.c 2008-01-03 22:48:03.000000000 +0100 -+++ elilo/ia32/system.c 2008-01-14 00:31:57.000000000 +0100 -@@ -163,10 +163,11 @@ - EFI_GUID GopProtocol = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; - EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop_interface; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Gop_info; -- EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Gop_mode; -- EFI_HANDLE *Gop_handle; -+ EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Gop_mode = NULL; -+ EFI_HANDLE *Gop_handle = NULL; - EFI_STATUS efi_status; -- UINTN size, size1; -+ UINTN size = 0; -+ UINTN size1; - UINT8 i; - - efi_status = uefi_call_wrapper( -@@ -204,7 +205,7 @@ - 3, - *Gop_handle, - &GopProtocol, -- &Gop_interface); -+ (VOID **) &Gop_interface); - - if (EFI_ERROR(efi_status)) { - continue; -diff -ur elilo-3.8/ia64/fpswa.c elilo/ia64/fpswa.c ---- elilo-3.8/ia64/fpswa.c 2003-08-19 18:46:09.000000000 +0200 -+++ elilo/ia64/fpswa.c 2008-01-12 00:53:33.000000000 +0100 -@@ -132,7 +132,7 @@ - #endif - }; - UINTN j, count = sizeof(fpswa_filenames)/sizeof(CHAR16 *); -- INTN cookie; -+ UINTN cookie; - CHAR16 devname[FILENAME_MAXLEN]; - - if (fpswa_file) { -diff -ur elilo-3.8/ia64/gzip.c elilo/ia64/gzip.c ---- elilo-3.8/ia64/gzip.c 2005-12-01 22:42:59.000000000 +0100 -+++ elilo/ia64/gzip.c 2008-01-12 00:53:33.000000000 +0100 -@@ -161,7 +161,7 @@ - int - fill_inbuf(void) - { -- INTN expected, nread; -+ UINTN expected, nread; - EFI_STATUS status; - - expected = nread = INBUFSIZE; -@@ -309,7 +309,7 @@ - * the relevant header information. - */ - int --first_block (const char *buf, long blocksize) -+first_block (const unsigned char *buf, long blocksize) - { - Elf64_Ehdr *elf; - Elf64_Phdr *phdrs; -@@ -439,7 +439,7 @@ - if (alloc_kmem((void *)low_addr, pages) == -1) { - VOID *new_addr; - -- VERB_PRT(1, (L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", LD_NAME, pages, low_addr)); -+ VERB_PRT(1, Print(L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", LD_NAME, pages, low_addr)); - - if (ia64_can_relocate() == 0) { - ERR_PRT((L"relocation is disabled, cannot load kernel")); -@@ -464,7 +464,7 @@ - /* unsigned arithmetic */ - load_offset = (UINTN) (new_addr - ROUNDDOWN((UINTN) low_addr,256*MB)); - -- VERB_PRT(1, (L"low_addr=0x%lx new_addr=0x%lx offset=0x%lx", low_addr, new_addr, load_offset)); -+ VERB_PRT(1, Print(L"low_addr=0x%lx new_addr=0x%lx offset=0x%lx", low_addr, new_addr, load_offset)); - - /* - * correct various addresses for non-zero load_offset -@@ -526,7 +526,7 @@ - static const CHAR8 helicopter[4] = { '|' , '/' , '-' , '\\' }; - static UINTN heli_count; - struct segment *cp; -- char *src, *dst; -+ unsigned char *src, *dst; - long cnt; - - if (!outcnt) return; -@@ -565,7 +565,7 @@ - file_offset += skip; - outcnt -= skip; - } -- dst = (char *)cp->addr + (file_offset - cp->offset); -+ dst = (unsigned char *)cp->addr + (file_offset - cp->offset); - - cnt = cp->offset + cp->size - file_offset; - -@@ -582,7 +582,7 @@ - /* 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; -+ dst = (unsigned char *)cp->addr + cp->size; - Memset(dst, 0, cp->bss_sz); - } - nextchunk(); -diff -ur elilo-3.8/ia64/longjmp.S elilo/ia64/longjmp.S ---- elilo-3.8/ia64/longjmp.S 2002-01-13 17:00:08.000000000 +0100 -+++ elilo/ia64/longjmp.S 2008-01-27 01:42:24.000000000 +0100 -@@ -159,4 +159,4 @@ - invala // virt. -> phys. regnum mapping may change - mov pr=r24,-1 - br.ret.dptk.few rp -- .endp __longjmp -+ .endp longjmp -diff -ur elilo-3.8/ia64/plain_loader.c elilo/ia64/plain_loader.c ---- elilo-3.8/ia64/plain_loader.c 2005-09-16 18:25:52.000000000 +0200 -+++ elilo/ia64/plain_loader.c 2008-01-12 00:53:33.000000000 +0100 -@@ -288,7 +288,7 @@ - if (alloc_kmem(low_addr, pages) == -1) { - VOID *new_addr; - -- VERB_PRT(1, (L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", LD_NAME, pages, low_addr)); -+ VERB_PRT(1, Print(L"%s : AllocatePages(%d, 0x%lx) for kernel failed\n", LD_NAME, pages, low_addr)); - - if (ia64_can_relocate() == 0) { - ERR_PRT((L"relocation is disabled, cannot load kernel")); -diff -ur elilo-3.8/ia64/setjmp.S elilo/ia64/setjmp.S ---- elilo-3.8/ia64/setjmp.S 2005-05-10 01:22:04.000000000 +0200 -+++ elilo/ia64/setjmp.S 2008-01-27 01:42:24.000000000 +0100 -@@ -81,6 +81,7 @@ - .proc __sigsetjmp - __sigsetjmp: - //.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2) -+ .body - alloc loc1=ar.pfs,2,2,2,0 - mov r16=ar.unat - ;; -@@ -89,6 +90,7 @@ - add r3=8,in0 - ;; - st8.spill.nta [r2]=sp,16 // r12 (sp) -+ ;; - st8.spill.nta [r3]=gp,16 // r1 (gp) - ;; - st8.nta [r2]=r16,16 // save caller's unat -@@ -96,13 +98,13 @@ - add r8=0xa0,in0 - ;; - st8.spill.nta [r2]=r4,16 // r4 -+ ;; - st8.spill.nta [r3]=r5,16 // r5 - add r9=0xb0,in0 - ;; - stf.spill.nta [r8]=f2,32 - stf.spill.nta [r9]=f3,32 - mov loc0=rp -- .body - ;; - stf.spill.nta [r8]=f4,32 - stf.spill.nta [r9]=f5,32 -@@ -139,6 +141,7 @@ - stf.spill.nta [r9]=f31 - - st8.spill.nta [r2]=r6,16 // r6 -+ ;; - st8.spill.nta [r3]=r7,16 // r7 - ;; - mov r23=ar.bsp -diff -ur elilo-3.8/ia64/sysdeps.h elilo/ia64/sysdeps.h ---- elilo-3.8/ia64/sysdeps.h 2005-12-01 22:42:59.000000000 +0100 -+++ elilo/ia64/sysdeps.h 2008-01-12 00:53:34.000000000 +0100 -@@ -86,7 +86,7 @@ - asm volatile ("mov r28=%1; br.sptk.few %0" :: "b"(kentry),"r"(bp)); - } - --static inline const UINT64 -+static inline UINT64 - __ia64_swab64 (UINT64 x) - { - UINT64 result; -@@ -95,13 +95,13 @@ - return result; - } - --static inline const UINT32 -+static inline UINT32 - __ia64_swab32 (UINT32 x) - { - return __ia64_swab64(x) >> 32; - } - --static inline const UINT16 -+static inline UINT16 - __ia64_swab16(UINT16 x) - { - return __ia64_swab64(x) >> 48; -diff -ur elilo-3.8/inflate.c elilo/inflate.c ---- elilo-3.8/inflate.c 2005-12-01 22:42:59.000000000 +0100 -+++ elilo/inflate.c 2008-01-15 02:03:19.000000000 +0100 -@@ -1094,10 +1094,10 @@ - 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(); /* Get timestamp - 4 bytes */ -+ (void)get_byte(); -+ (void)get_byte(); -+ (void)get_byte(); - - (void)get_byte(); /* Ignore extra flags for the moment */ - (void)get_byte(); /* Ignore OS type for the moment */ -diff -ur elilo-3.8/util.c elilo/util.c ---- elilo-3.8/util.c 2007-07-20 21:47:26.000000000 +0200 -+++ elilo/util.c 2008-01-12 00:53:33.000000000 +0100 -@@ -248,7 +248,7 @@ - INTN - read_file(UINTN fd, UINTN total_size, CHAR8 *buffer) - { -- INTN size, j=0; -+ UINTN size, j=0; - EFI_STATUS status; - CHAR16 helicopter[4] = { L'|' , L'/' , L'-' , L'\\' }; - INTN ret = ELILO_LOAD_SUCCESS; -diff -ur elilo-3.8/x86_64/gzip.c elilo/x86_64/gzip.c ---- elilo-3.8/x86_64/gzip.c 2007-07-20 21:47:27.000000000 +0200 -+++ elilo/x86_64/gzip.c 2008-01-15 02:03:19.000000000 +0100 -@@ -156,7 +156,7 @@ - int - fill_inbuf(void) - { -- INTN expected, nread; -+ UINTN expected, nread; - EFI_STATUS status; - - expected = nread = INBUFSIZE; -@@ -280,7 +280,7 @@ - * the relevant header information. - */ - int --first_block (const char *buf, long blocksize) -+first_block (const unsigned char *buf, long blocksize) - { - Elf64_Ehdr *elf; - Elf64_Phdr *phdrs; -@@ -433,7 +433,7 @@ - static const CHAR8 helicopter[4] = { '|' , '/' , '-' , '\\' }; - static UINTN heli_count; - struct segment *cp; -- char *src, *dst; -+ unsigned char *src, *dst; - long cnt; - - if (!outcnt) return; -@@ -471,7 +471,7 @@ - file_offset += skip; - outcnt -= skip; - } -- dst = (char *)cp->addr + (file_offset - cp->offset); -+ dst = (unsigned char *)cp->addr + (file_offset - cp->offset); - cnt = cp->offset + cp->size - file_offset; - if (cnt > outcnt) - cnt = outcnt; -@@ -485,7 +485,7 @@ - /* 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; -+ dst = (unsigned char *)cp->addr + cp->size; - Memset(dst, 0, cp->bss_sz); - } - nextchunk(); -diff -ur elilo-3.8/x86_64/sysdeps.h elilo/x86_64/sysdeps.h ---- elilo-3.8/x86_64/sysdeps.h 2007-12-19 23:52:22.000000000 +0100 -+++ elilo/x86_64/sysdeps.h 2008-01-15 02:03:19.000000000 +0100 -@@ -370,8 +370,8 @@ - UINT32 kernel_entry; - UINT16 kernel_cs; - } jumpvector; -- UINTN njump; - VOID *jump_start; -+ uint64_t temp; - - /* - * Disable interrupts. -@@ -383,7 +383,8 @@ - */ - - if (bp->s.initrd_start) { -- MEMCPY(INITRD_START, bp->s.initrd_start, bp->s.initrd_size); -+ temp = bp->s.initrd_start; -+ MEMCPY(INITRD_START, temp , bp->s.initrd_size); - bp->s.initrd_start = INITRD_START; - } - /* -@@ -434,14 +435,15 @@ - - /* - * Jump to kernel entry point. -+ * -+ * Cast is to tell gcc that we know we're going from -+ * 64-bit ptr to 32-bit integer. - */ -- jumpvector.kernel_entry=kentry; -+ jumpvector.kernel_entry=(UINT32)((UINT64)kentry); - jumpvector.kernel_cs=0x10; -- njump = &jumpvector; - jump_start = (VOID *)&jumpvector; - //asm volatile ( "mov %0, %%rcx" : : "m" (&jumpvector) ); - asm volatile ( "mov %0, %%rcx" : : "m" (jump_start) ); -- //asm volatile ( "mov %0, %%rcx" : : "m" (njump) ); - asm volatile ( "ljmp *(%%rcx)" : :); - /* Never come back to here. */ - } -diff -ur elilo-3.8/x86_64/system.c elilo/x86_64/system.c ---- elilo-3.8/x86_64/system.c 2008-01-03 22:48:03.000000000 +0100 -+++ elilo/x86_64/system.c 2008-01-15 02:03:19.000000000 +0100 -@@ -160,7 +160,7 @@ - mmap_desc_t md; - - ZeroMem(&md, sizeof md); -- md.md = (VOID *)bp->s.efi_mem_map; -+ md.md = (VOID *)(UINT64)bp->s.efi_mem_map; - free_memmap(&md); - } - -@@ -189,10 +189,11 @@ - EFI_GUID GopProtocol = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; - EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop_interface; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Gop_info; -- EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Gop_mode; -- EFI_HANDLE *Gop_handle; -+ EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Gop_mode = NULL; -+ EFI_HANDLE *Gop_handle = NULL; - EFI_STATUS efi_status; -- UINTN size, size1; -+ UINTN size = 0; -+ UINTN size1; - UINT8 i; - - efi_status = uefi_call_wrapper( -@@ -554,7 +555,7 @@ - - if (initrd->start_addr && initrd->pgcnt) { - /* %%TBD - This will probably have to be changed. */ -- bp->s.initrd_start = (UINT32)initrd->start_addr; -+ bp->s.initrd_start = (UINT32)(UINT64)initrd->start_addr; - bp->s.initrd_size = (UINT32)(initrd->size); - /* - * This is the RAMdisk root device for RedHat 2.2.x -@@ -598,7 +599,7 @@ - /* - * Kernel entry point. - */ -- bp->s.kernel_start = (UINT32)kernel_start; -+ bp->s.kernel_start = (UINT32)(UINT64)kernel_start; - - /* - * When changing stuff in the parameter structure compare diff --git a/elilo-3.8.tar.gz b/elilo-3.8.tar.gz deleted file mode 100644 index fe8fb74..0000000 --- a/elilo-3.8.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eca0d67a6764d088a5526a2ef7b0f23ee51dc4a29ac58fb10e4d93421d6b7901 -size 206250 diff --git a/elilo-MAC.diff b/elilo-MAC.diff index aacbdc0..5708ddb 100644 --- a/elilo-MAC.diff +++ b/elilo-MAC.diff @@ -1,7 +1,10 @@ -diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c ---- elilo-3.5-pre2/glue_netfs.c 2004-02-20 23:30:37.000000000 +0100 -+++ elilo-3.5-MAC/glue_netfs.c 2005-12-07 15:19:45.655191368 +0100 -@@ -61,6 +61,19 @@ static CHAR16 netfs_default_path[FILENAM +--- + glue_netfs.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +--- a/glue_netfs.c ++++ b/glue_netfs.c +@@ -65,6 +65,19 @@ static CHAR16 netfs_default_path[FILENAM static CHAR16 *hexa=L"0123456789ABCDEF"; static VOID @@ -16,12 +19,12 @@ diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c + } + str[3*l-1]='\0'; +} -+ ++ +static VOID convert_ip2hex(UINT8 *ip, INTN l, CHAR16 *str) { UINTN i; -@@ -197,6 +210,12 @@ netfs_setdefaults(VOID *intf, config_fil +@@ -210,6 +223,12 @@ netfs_setdefaults(VOID *intf, config_fil StrnCpy(config[6].fname, str, maxlen-1); StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6); @@ -30,7 +33,7 @@ diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c + convert_mac2hex(info.hw_addr,6,str); + StrnCpy(config[7].fname, str, maxlen-1); + StrnCpy(config[7].fname+17, CONFIG_EXTENSION, 6); -+ ++ #else StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1); config[0].fname[maxlen-1] = CHAR_NULL; diff --git a/elilo-avoid-tab.diff b/elilo-avoid-tab.diff index d7df3a0..8cd62fd 100644 --- a/elilo-avoid-tab.diff +++ b/elilo-avoid-tab.diff @@ -1,7 +1,10 @@ -diff -urp elilo-3.8/config.c elilo-3.8-tab/config.c ---- elilo-3.8/config.c 2008-07-29 23:22:07.637647427 +0200 -+++ elilo-3.8-tab/config.c 2008-07-31 01:24:31.346046245 +0200 -@@ -897,10 +897,10 @@ print_label_list(VOID) +--- + config.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/config.c ++++ b/config.c +@@ -909,10 +909,10 @@ print_label_list(VOID) { boot_image_t *img, *dfl = global_config.default_image; diff --git a/elilo-bzimage-alloc.diff b/elilo-bzimage-alloc.diff index f2af53d..789820f 100644 --- a/elilo-bzimage-alloc.diff +++ b/elilo-bzimage-alloc.diff @@ -28,183 +28,15 @@ resubmit if there are any issues with this approach. Thanks! -diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/alloc.c elilo-3.8-3.35-orig_c/alloc.c ---- elilo-3.8-3.35-orig1/alloc.c 2008-12-08 06:03:05.000000000 -0600 -+++ elilo-3.8-3.35-orig_c/alloc.c 2008-12-08 04:51:28.000000000 -0600 -@@ -213,6 +213,19 @@ free_all(VOID) - } - - INTN -+alloc_kmem_anywhere(VOID **start_addr, UINTN pgcnt) -+{ -+ void * tmp; -+ if ((tmp = alloc_pages(pgcnt, EfiLoaderData, AllocateAnyPages, *start_addr)) == 0) return -1; -+ -+ kmem_addr = tmp; -+ kmem_pgcnt = pgcnt; -+ *start_addr = tmp; -+ -+ return 0; -+} -+ -+INTN - alloc_kmem(VOID *start_addr, UINTN pgcnt) - { - if (alloc_pages(pgcnt, EfiLoaderData, AllocateAddress, start_addr) == 0) return -1; -diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/elilo.c elilo-3.8-3.35-orig_c/elilo.c ---- elilo-3.8-3.35-orig1/elilo.c 2008-12-08 06:03:05.000000000 -0600 -+++ elilo-3.8-3.35-orig_c/elilo.c 2008-12-08 05:01:33.000000000 -0600 -@@ -132,6 +132,9 @@ kernel_load(EFI_HANDLE image, CHAR16 *kn - - if (elilo_opt.initrd[0]) { - -+ /* -+ * fix me? -- load_file() ignores address from sysdeps_initrd_get_addr() -+ */ - if (sysdeps_initrd_get_addr(kd, imem) == -1) goto exit_error; - - switch(load_file(elilo_opt.initrd, imem)) { -Files elilo-3.8-3.35-orig1/elilo.efi and elilo-3.8-3.35-orig_c/elilo.efi differ -Files elilo-3.8-3.35-orig1/tools/eliloalt and elilo-3.8-3.35-orig_c/tools/eliloalt differ -diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/x86_64/bzimage.c elilo-3.8-3.35-orig_c/x86_64/bzimage.c ---- elilo-3.8-3.35-orig1/x86_64/bzimage.c 2008-12-08 06:03:05.000000000 -0600 -+++ elilo-3.8-3.35-orig_c/x86_64/bzimage.c 2008-12-08 05:04:52.000000000 -0600 -@@ -158,13 +158,37 @@ bzImage_probe(CHAR16 *kname) - * Allocate memory for kernel. - */ - -+ /* -+ * Get correct address for kernel from header, if applicable & available. -+ */ -+ if ((param_start->s.hdr_major == 2) && -+ (param_start->s.hdr_minor >= 0) && -+ (param_start->s.kernel_start >= DEFAULT_KERNEL_START)) { -+ kernel_start = kernel_load_address = (VOID *)((UINTN)param_start->s.kernel_start); -+ VERB_PRT(3, Print(L"kernel header suggests kernel start at address 0x%x\n", -+ kernel_start)); -+ } -+ -+ kernel_load_address = kernel_start; -+ - 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)); -+ /* -+ * Couldn't get desired address--just load it anywhere and move it later. -+ * (Easier than relocating kernel, and also works with non-relocatable kernels.) -+ */ -+ if (alloc_kmem_anywhere(&kernel_load_address, EFI_SIZE_TO_PAGES(kernel_size))) { -+ ERR_PRT((L"Could not allocate memory for kernel.")); -+ free(param_start); -+ param_start = NULL; -+ param_size = 0; -+ fops_close(fd); -+ return -1; -+ } - } -+ -+ VERB_PRT(3, Print(L"kernel_start: 0x%x kernel_size: %d loading at: 0x%x\n", -+ kernel_start, kernel_size, kernel_load_address)); -+ - /* - * Now read the rest of the kernel image into memory. - */ -@@ -172,7 +196,7 @@ bzImage_probe(CHAR16 *kname) - DBG_PRT((L"reading kernel image...\n")); - - size = kernel_size; -- efi_status = fops_read(fd, kernel_start, &size); -+ efi_status = fops_read(fd, kernel_load_address, &size); - if (EFI_ERROR(efi_status) || size < 0x10000) { - ERR_PRT((L"Error reading kernel image %s.", kname)); - free(param_start); -diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/x86_64/sysdeps.h elilo-3.8-3.35-orig_c/x86_64/sysdeps.h ---- elilo-3.8-3.35-orig1/x86_64/sysdeps.h 2008-12-08 06:03:05.000000000 -0600 -+++ elilo-3.8-3.35-orig_c/x86_64/sysdeps.h 2008-12-08 06:01:52.000000000 -0600 -@@ -48,6 +48,11 @@ - #define INITRD_START (50*1024*1024) - - /* -+ * Default start address for kernel. -+ */ -+#define DEFAULT_KERNEL_START 0x100000 -+ -+/* - * This version must match the one in the kernel. - * - * This table was put together using information from the -@@ -307,10 +312,16 @@ typedef union x86_64_boot_params { - UINT8 *t = (UINT8 *)(to); \ - UINT8 *f = (UINT8 *)(from); \ - UINTN n = cnt; \ -- if (t && f && n) { \ -+ if (t && f && n && (tf)) { \ -+ t += n; \ -+ f += n; \ -+ while (n--) { \ -+ *t-- = *f--; \ -+ } \ - } \ - } - -@@ -343,6 +354,7 @@ extern UINTN param_size; - - extern VOID *kernel_start; - extern UINTN kernel_size; -+extern VOID *kernel_load_address; - - extern VOID *initrd_start; - extern UINTN initrd_size; -@@ -379,14 +391,24 @@ start_kernel(VOID *kentry, boot_params_t - asm volatile ( "cli" : : ); - - /* -- * Relocate initrd, if present. -+ * Relocate kernel (if needed) and initrd (if present). -+ * Copy kernel first, in case kernel was loaded overlapping where we're -+ * planning to copy the initrd. This assumes that the initrd didn't -+ * get loaded overlapping where we're planning to copy the kernel, but -+ * that's pretty unlikely since we couldn't alloc that space for the -+ * kernel (or the kernel would already be there). - */ - -+ if (kernel_start != kernel_load_address) { -+ MEMCPY(kernel_start, kernel_load_address, kernel_size); -+ } -+ - if (bp->s.initrd_start) { - temp = bp->s.initrd_start; - MEMCPY(INITRD_START, temp , bp->s.initrd_size); - bp->s.initrd_start = INITRD_START; - } -+ - /* - * Copy boot sector, setup data and command line - * to final resting place. We need to copy -diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/x86_64/system.c elilo-3.8-3.35-orig_c/x86_64/system.c ---- elilo-3.8-3.35-orig1/x86_64/system.c 2008-12-08 06:03:25.000000000 -0600 -+++ elilo-3.8-3.35-orig_c/x86_64/system.c 2008-12-08 04:51:28.000000000 -0600 -@@ -105,7 +105,9 @@ UINTN high_base_mem = 0x90000; - UINTN high_ext_mem = 32 * 1024 * 1024; - - /* This starting address will hold true for all of the loader types for now */ --VOID *kernel_start = (VOID *)0x100000; /* 1M */ -+VOID *kernel_start = (VOID *)DEFAULT_KERNEL_START; -+/* The kernel may load elsewhere if EFI firmware reserves kernel_start */ -+VOID *kernel_load_address = (VOID *)DEFAULT_KERNEL_START; - - VOID *initrd_start = NULL; - UINTN initrd_size = 0; ---- elilo/fs/localfs.c -+++ elilo/fs/localfs.c -@@ -98,7 +98,7 @@ +[ only one change of this patch is still missing... -- rw@suse.de ] + +--- + fs/localfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/localfs.c ++++ b/fs/localfs.c +@@ -98,7 +98,7 @@ localfs_open(localfs_interface_t *this, DBG_PRT((L"localfs_open on %s\n", name)); @@ -213,13 +45,3 @@ diff -purN '--exclude=*o' '--exclude=tags' elilo-3.8-3.35-orig1/x86_64/system.c if (status == EFI_SUCCESS) { *fd = LOCALFS_F2FD(fh); } ---- elilo/elilo.h -+++ elilo/elilo.h -@@ -151,6 +151,7 @@ - extern VOID free_pages(VOID *); - extern VOID free_all(VOID); - extern INTN alloc_kmem(VOID *, UINTN); -+extern INTN alloc_kmem_anywhere(VOID **, UINTN); - extern VOID free_kmem(VOID); - extern VOID free_all_memory(VOID); - diff --git a/elilo-cleanup.diff b/elilo-cleanup.diff index b1f9466..8d557c0 100644 --- a/elilo-cleanup.diff +++ b/elilo-cleanup.diff @@ -1,60 +1,108 @@ ---- elilo/alloc.c -+++ elilo/alloc.c -@@ -110,7 +110,7 @@ +--- + Makefile | 2 +- + alloc.c | 12 ++++++------ + choosers/Makefile | 14 +++++--------- + fileops.c | 2 +- + fs/Makefile | 14 +++++--------- + glue_netfs.c | 4 ++++ + x86_64/bzimage.c | 6 ++++-- + 7 files changed, 26 insertions(+), 28 deletions(-) + +--- a/Makefile ++++ b/Makefile +@@ -81,7 +81,7 @@ elilo.efi: elilo.so + + elilo.so: $(FILES) + +-elilo.o : elilo.c ++elilo.o : elilo.c $(ARCH)/sysdeps.h + + fileops.o : Make.defaults + chooser.o : Make.defaults +--- a/alloc.c ++++ b/alloc.c +@@ -110,7 +110,7 @@ alloc(UINTN size, EFI_MEMORY_TYPE type) } alloc_add(tmp, size, ALLOC_POOL); - -- DBG_PRT((L"alloc: allocated %d bytes @[0x%lx-0x%lx]\n", size, tmp, tmp+size)); -+ DBG_PRT((L"alloc: allocated %d bytes @[0x%lx-0x%lx]", size, tmp, tmp+size)); - + #ifdef DEBUG_MEM +- DBG_PRT((L"alloc: allocated %d bytes @[" PTR_FMT "-" PTR_FMT "]\n", size, tmp, tmp+size)); ++ DBG_PRT((L"alloc: allocated %d bytes @[" PTR_FMT "-" PTR_FMT "]", size, tmp, tmp+size)); + #endif return tmp; } -@@ -140,7 +140,7 @@ +@@ -140,7 +140,7 @@ alloc_pages(UINTN pgcnt, EFI_MEMORY_TYPE alloc_add(addr, pgcnt, ALLOC_PAGES); - DBG_PRT((L"allocator: allocated %d pages @0x%lx\n", pgcnt, tmp)); -+ DBG_PRT((L"allocator: allocated %d pages @0x%lx", pgcnt, tmp)); ++ DBG_PRT((L"allocator: allocated %d pages @" PTR_FMT, pgcnt, tmp)); return addr; } -@@ -161,7 +161,7 @@ - VERB_PRT(1, Print(L"allocator: invalid free @ 0x%lx\n", addr)); +@@ -162,7 +162,7 @@ free(VOID *addr) return; found: -- DBG_PRT((L"free: %s @0x%lx size=%ld\n", -+ DBG_PRT((L"free: %s @0x%lx size=%ld", + #ifdef DEBUG_MEM +- DBG_PRT((L"free: %s @" PTR_FMT " size=%d\n", ++ DBG_PRT((L"free: %s @" PTR_FMT " size=%d", p->type == ALLOC_POOL ? L"Pool": L"Page", addr, p->size)); - -@@ -195,7 +195,7 @@ + #endif +@@ -196,7 +196,7 @@ free_all(VOID) while(used_allocs) { - -- DBG_PRT((L"free_all %a @ 0x%lx\n", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); -+ DBG_PRT((L"free_all %a @ 0x%lx", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); - + #ifdef DEBUG_MEM +- DBG_PRT((L"free_all %a @ " PTR_FMT "\n", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); ++ DBG_PRT((L"free_all %a @ " PTR_FMT, used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); + #endif if (used_allocs->type == ALLOC_POOL) uefi_call_wrapper(BS->FreePool, 1, used_allocs->addr); -@@ -239,13 +239,13 @@ - VOID +@@ -249,7 +249,7 @@ VOID free_kmem(VOID) { -- DBG_PRT((L"free_kmem before (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); -+ DBG_PRT((L"free_kmem before (%lx, %ld)", kmem_addr, kmem_pgcnt)); + #ifdef DEBUG_MEM +- DBG_PRT((L"free_kmem before (" PTR_FMT ", %d)\n", kmem_addr, kmem_pgcnt)); ++ DBG_PRT((L"free_kmem before (" PTR_FMT ", %d)", kmem_addr, kmem_pgcnt)); + #endif if (kmem_addr && kmem_pgcnt != 0) { free(kmem_addr); - kmem_addr = NULL; +@@ -257,7 +257,7 @@ free_kmem(VOID) kmem_pgcnt = 0; } -- DBG_PRT((L"free_kmem after (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); -+ DBG_PRT((L"free_kmem after (%lx, %ld)", kmem_addr, kmem_pgcnt)); + #ifdef DEBUG_MEM +- DBG_PRT((L"free_kmem after (" PTR_FMT ", %d)\n", kmem_addr, kmem_pgcnt)); ++ DBG_PRT((L"free_kmem after (" PTR_FMT ", %d)", kmem_addr, kmem_pgcnt)); + #endif } - VOID ---- elilo/fileops.c -+++ elilo/fileops.c -@@ -497,7 +497,7 @@ +--- a/choosers/Makefile ++++ b/choosers/Makefile +@@ -42,17 +42,13 @@ TARGET=choosers.o + + all: $(TARGET) + +-$(TARGET): check-choosers $(TOPDIR)/Make.defaults $(FILES) ++$(TARGET): $(TOPDIR)/Make.defaults $(FILES) ++ @if [ -z "$(FILES)" ]; then \ ++ echo "You need to define at least one chooser in Make.defaults"; \ ++ exit 1; \ ++ fi + $(LD) -o $@ -r $(FILES) + + clean: + $(RM) -f $(TARGET) $(FILES) +- +-check-choosers: +- @if [ -n "$(FILES)" ]; then \ +- exit 0; \ +- else \ +- echo "You need to define at least one chooser in Make.defaults"; \ +- exit 1; \ +- fi + +--- a/fileops.c ++++ b/fileops.c +@@ -497,7 +497,7 @@ add_dev_tab(EFI_GUID *proto, EFI_HANDLE str2 = str == NULL ? L"Unknown" : str; @@ -63,9 +111,34 @@ (dev_tab[idx].fops ? dev_tab[idx].fops->name: L"N/A"), str2)); if (str) FreePool(str); ---- elilo/glue_netfs.c -+++ elilo/glue_netfs.c -@@ -167,6 +167,8 @@ +--- a/fs/Makefile ++++ b/fs/Makefile +@@ -54,17 +54,13 @@ all: $(TARGET) + # XXX: does not trigger recompile when changing filesystem selection + # without doing make clean. + # +-$(TARGET): check-filesystems $(TOPDIR)/Make.defaults $(FILES) ++$(TARGET): $(TOPDIR)/Make.defaults $(FILES) ++ @if [ -z "$(FILES)" ]; then \ ++ echo "You need to define at least one filesystem in Make.defaults"; \ ++ exit 1; \ ++ fi + $(LD) -r -o $@ $(FILES) + + clean: + $(RM) -f $(TARGET) $(FILES) + +-check-filesystems: +- @if [ -n "$(FILES)" ]; then \ +- exit 0; \ +- else \ +- echo "You need to define at least one filesystem in Make.defaults"; \ +- exit 1; \ +- fi +- +--- a/glue_netfs.c ++++ b/glue_netfs.c +@@ -153,6 +153,8 @@ netfs_setdefaults(VOID *intf, config_fil set_var(VAR_NETFS_DOMAINAME, info.domainame); if (info.using_pxe) { @@ -74,26 +147,18 @@ status = netfs->netfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config[0].fname); if (EFI_ERROR(status)) { StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1); -@@ -184,7 +186,7 @@ - # if defined(CONFIG_ia64) - # define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" - # elif defined (CONFIG_ia32) --# define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" -+# define CONFIG_ARCH_EXTENSION L"-ia32.conf\0" - # elif defined (CONFIG_x86_64) - # define CONFIG_ARCH_EXTENSION L"-x86_64.conf\0" - # else -@@ -193,6 +195,7 @@ +@@ -181,6 +183,8 @@ netfs_setdefaults(VOID *intf, config_fil + # endif # define CONFIG_EXTENSION L".conf\0" - -+ DBG_PRT((L"netfs_setdefaults: not using_pxe, machine specific")); - len = StrLen(CONFIG_ARCH_EXTENSION) + 1; ++ ++ DBG_PRT((L"netfs_setdefaults: machine specific (!using_pxe)")); /* * will try machine/subnet specific files first. ---- elilo/x86_64/bzimage.c -+++ elilo/x86_64/bzimage.c -@@ -193,18 +193,20 @@ + * the filenames are constructed based on the IP(v4) address +--- a/x86_64/bzimage.c ++++ b/x86_64/bzimage.c +@@ -295,18 +295,20 @@ bzImage_probe(CHAR16 *kname) * Now read the rest of the kernel image into memory. */ diff --git a/elilo-fix-amd64-netboot.diff b/elilo-fix-amd64-netboot.diff deleted file mode 100644 index bde6133..0000000 --- a/elilo-fix-amd64-netboot.diff +++ /dev/null @@ -1,44 +0,0 @@ -diff -ur elilo.a/glue_netfs.c elilo.b/glue_netfs.c ---- elilo.a/glue_netfs.c 2009-02-05 15:22:00.000000000 +0100 -+++ elilo.b/glue_netfs.c 2009-02-05 20:53:11.000000000 +0100 -@@ -143,6 +143,7 @@ - UINTN m; - CHAR16 ip_var[64], str[64]; - UINT8 *ip; -+ INTN len; - - if (config == NULL || kname == NULL || maxlen < 1) return EFI_INVALID_PARAMETER; - -@@ -191,6 +192,8 @@ - # endif - - # define CONFIG_EXTENSION L".conf\0" -+ -+ len = StrLen(CONFIG_ARCH_EXTENSION) + 1; - /* - * will try machine/subnet specific files first. - * the filenames are constructed based on the IP(v4) address -@@ -200,19 +203,19 @@ - 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[1].fname+6, CONFIG_ARCH_EXTENSION, len); - - 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[3].fname+4, CONFIG_ARCH_EXTENSION, len); - - 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[5].fname+2, CONFIG_ARCH_EXTENSION, len); - - StrnCpy(config[6].fname, str, maxlen-1); - StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6); diff --git a/elilo-fix-possible-overflow.diff b/elilo-fix-possible-overflow.diff index 7e3b0fc..5be8d41 100644 --- a/elilo-fix-possible-overflow.diff +++ b/elilo-fix-possible-overflow.diff @@ -1,6 +1,6 @@ From: Bernhard Walle Subject: [PATCH] Fix possible array length overflow -References: 256676 +References: bnc#256676 Found by dan.yeisley@unisys.com. @@ -8,19 +8,18 @@ Found by dan.yeisley@unisys.com. Signed-off-by: Bernhard Walle --- - choosers/simple.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) + choosers/simple.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) --- a/choosers/simple.c +++ b/choosers/simple.c -@@ -283,8 +283,10 @@ restart: - } +@@ -290,8 +290,9 @@ restart: if (elilo_opt.prompt) { + console_textmode(); - ret = select_kernel(buffer, sizeof(buffer)); + ret = select_kernel(buffer, CMDLINE_MAXLEN); if (ret == -1) return -1; -+ + /* this function takes really the number of bytes ... */ argc = argify(buffer,sizeof(buffer), argv); index = 0; diff --git a/elilo-strncpy-overflow-fix.diff b/elilo-fix-strncpy-overflow.diff similarity index 73% rename from elilo-strncpy-overflow-fix.diff rename to elilo-fix-strncpy-overflow.diff index 7a36efb..48eb79e 100644 --- a/elilo-strncpy-overflow-fix.diff +++ b/elilo-fix-strncpy-overflow.diff @@ -1,10 +1,15 @@ From: Jarrod Johnson -Fix StrnCpy bug that would overflow dst buffer if length of src met or exceeded passed size value. -diff -urN elilo/strops.c elilo-strncpy-overflow-fix/strops.c ---- elilo/strops.c 2003-08-19 12:47:41.000000000 -0400 -+++ elilo-strncpy-overflow-fix/strops.c 2009-02-07 11:17:10.000000000 -0500 -@@ -41,11 +41,11 @@ +Fix StrnCpy bug that would overflow dst buffer if length of src met or +exceeded passed size value. + +--- + strops.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/strops.c ++++ b/strops.c +@@ -41,11 +41,11 @@ StrnCpy(OUT CHAR16 *dst, IN const CHAR16 { CHAR16 *res = dst; @@ -18,7 +23,7 @@ diff -urN elilo/strops.c elilo-strncpy-overflow-fix/strops.c return res; } -@@ -55,11 +55,11 @@ +@@ -55,11 +55,11 @@ StrnXCpy(OUT CHAR8 *dst, IN const CHAR16 { CHAR8 *res = dst; @@ -32,7 +37,7 @@ diff -urN elilo/strops.c elilo-strncpy-overflow-fix/strops.c return res; } -@@ -76,11 +76,11 @@ +@@ -76,11 +76,11 @@ strncpya(OUT CHAR8 *dst, IN const CHAR8 { CHAR8 *res = dst; diff --git a/elilo-longer-commandline.diff b/elilo-longer-commandline.diff index 6d99467..6b78a8c 100644 --- a/elilo-longer-commandline.diff +++ b/elilo-longer-commandline.diff @@ -1,6 +1,8 @@ -References: 242702 +From: Bernhard Walle +Subject: Increase command line size to 2048 chars. +References: bnc#242702 -Increase command line size to 2048 chars. +Signed-off-by: Bernhard Walle --- choosers/simple.c | 10 +++++----- @@ -12,7 +14,7 @@ Increase command line size to 2048 chars. --- a/choosers/simple.c +++ b/choosers/simple.c -@@ -36,8 +36,8 @@ static VOID +@@ -41,8 +41,8 @@ static VOID display_label_info(CHAR16 *name) { CHAR16 *desc; @@ -23,7 +25,7 @@ Increase command line size to 2048 chars. CHAR16 options_tmp[CMDLINE_MAXLEN]; CHAR16 options[CMDLINE_MAXLEN]; CHAR16 kname[FILENAME_MAXLEN]; -@@ -248,10 +248,10 @@ simple_choose(CHAR16 **argv, INTN argc, +@@ -254,10 +254,10 @@ simple_choose(CHAR16 **argv, INTN argc, # define BOOT_IMG_STR L"BOOT_IMAGE=" CHAR16 buffer[CMDLINE_MAXLEN]; CHAR16 alt_buffer[CMDLINE_MAXLEN]; @@ -39,7 +41,7 @@ Increase command line size to 2048 chars. UINTN len; --- a/choosers/textmenu.c +++ b/choosers/textmenu.c -@@ -362,10 +362,10 @@ textmenu_choose(CHAR16 **argv, INTN argc +@@ -363,10 +363,10 @@ textmenu_choose(CHAR16 **argv, INTN argc { # define BOOT_IMG_STR L"BOOT_IMAGE=" CHAR16 label[CMDLINE_MAXLEN]; @@ -55,7 +57,7 @@ Increase command line size to 2048 chars. UINTN len; --- a/config.c +++ b/config.c -@@ -51,7 +51,7 @@ +@@ -56,7 +56,7 @@ */ #define ELILO_DEFAULT_CONFIG L"elilo.conf" @@ -64,7 +66,7 @@ Increase command line size to 2048 chars. #define CONFIG_BUFSIZE 512 /* input buffer size */ /* -@@ -66,7 +66,7 @@ typedef struct boot_image { +@@ -71,7 +71,7 @@ typedef struct boot_image { struct boot_image *next; CHAR16 label[MAX_STRING]; CHAR16 kname[FILENAME_MAXLEN]; @@ -73,7 +75,7 @@ Increase command line size to 2048 chars. CHAR16 initrd[FILENAME_MAXLEN]; CHAR16 vmcode[FILENAME_MAXLEN]; CHAR16 root[FILENAME_MAXLEN]; -@@ -95,7 +95,7 @@ typedef struct { +@@ -100,7 +100,7 @@ typedef struct { CHAR16 root[FILENAME_MAXLEN]; /* globally defined root fs */ CHAR16 initrd[FILENAME_MAXLEN];/* globally defined initrd */ CHAR16 vmcode[FILENAME_MAXLEN];/* globally defined boot-time module */ @@ -84,7 +86,7 @@ Increase command line size to 2048 chars. CHAR16 chooser[FILENAME_MAXLEN];/* which image chooser to use */ --- a/elilo.c +++ b/elilo.c -@@ -87,7 +87,7 @@ do_kernel_load(CHAR16 *kname, kdesc_t *k +@@ -93,7 +93,7 @@ do_kernel_load(CHAR16 *kname, kdesc_t *k INTN kernel_load(EFI_HANDLE image, CHAR16 *kname, kdesc_t *kd, memdesc_t *imem, memdesc_t *mmem) { @@ -95,7 +97,7 @@ Increase command line size to 2048 chars. * Do the vm image switch here --- a/elilo.h +++ b/elilo.h -@@ -57,7 +57,8 @@ +@@ -69,7 +69,8 @@ #define ELILO_DEFAULT_TIMEOUT ELILO_TIMEOUT_INFINITY #define ELILO_TIMEOUT_INFINITY (~0UL) @@ -105,4 +107,3 @@ Increase command line size to 2048 chars. #define FILENAME_MAXLEN 256 #define MAX_ARGS 256 /* Just pick an arbitrary number that's high enough for now :o) */ - diff --git a/elilo-spelling.diff b/elilo-spelling.diff deleted file mode 100644 index c34abeb..0000000 --- a/elilo-spelling.diff +++ /dev/null @@ -1,20 +0,0 @@ ---- config.c -+++ config.c -@@ -580,7 +580,7 @@ - */ - tok = get_token(numstr, MAX_STRING); - if (tok != TOK_EQUAL) { -- config_error(L"Option %s expects an equal signal + value", p->name); -+ config_error(L"Option %s expects an equal sign + value", p->name); - return -1; - } - -@@ -673,7 +673,7 @@ - */ - tok = get_token(str, maxlen); - if (tok != TOK_EQUAL) { -- config_error(L"Option %s expects an equal signal + %s", p->name, msg); -+ config_error(L"Option %s expects an equal sign + %s", p->name, msg); - return -1; - } - diff --git a/elilo-text-mode.diff b/elilo-text-mode.diff index 26b6f3f..c08ce88 100644 --- a/elilo-text-mode.diff +++ b/elilo-text-mode.diff @@ -1,5 +1,11 @@ ---- elilo/x86_64/config.c -+++ elilo/x86_64/config.c +--- + x86_64/config.c | 19 ++++++++++++++++--- + x86_64/sysdeps.h | 4 +++- + x86_64/system.c | 4 ++++ + 3 files changed, 23 insertions(+), 4 deletions(-) + +--- a/x86_64/config.c ++++ b/x86_64/config.c @@ -33,15 +33,23 @@ typedef struct { @@ -24,7 +30,7 @@ /* * X86_64 operations that need to be done only once and just before * entering the main loop of the loader -@@ -81,6 +89,14 @@ +@@ -81,6 +89,14 @@ x86_64_use_legacy_free_boot(VOID) return x86_64_gconf.legacy_free_boot ? 1 : 0; } @@ -39,7 +45,7 @@ INTN sysdeps_register_options(VOID) { -@@ -89,14 +105,11 @@ +@@ -89,14 +105,11 @@ sysdeps_register_options(VOID) ret = register_config_options(sysdeps_global_options, sizeof(sysdeps_global_options)/sizeof(config_option_t), OPTIONS_GROUP_GLOBAL); @@ -54,9 +60,9 @@ return ret; } ---- elilo/x86_64/sysdeps.h -+++ elilo/x86_64/sysdeps.h -@@ -369,6 +369,7 @@ +--- a/x86_64/sysdeps.h ++++ b/x86_64/sysdeps.h +@@ -364,6 +364,7 @@ extern UINT8 rmswitch_image[]; extern UINTN rmswitch_size; extern INTN x86_64_use_legacy_free_boot(); @@ -64,7 +70,7 @@ /* * How to jump to kernel code -@@ -471,7 +472,8 @@ +@@ -457,7 +458,8 @@ start_kernel(VOID *kentry, boot_params_t } typedef struct sys_img_options { @@ -74,9 +80,9 @@ } sys_img_options_t; #endif /* __ELILO_SYSDEPS_X86_64_H__ */ ---- elilo/x86_64/system.c -+++ elilo/x86_64/system.c -@@ -198,6 +198,10 @@ +--- a/x86_64/system.c ++++ b/x86_64/system.c +@@ -251,6 +251,10 @@ static INTN get_video_info(boot_params_t UINTN size1; UINT8 i; diff --git a/elilo-x86-64-bootproto-update.diff b/elilo-x86-64-bootproto-update.diff new file mode 100644 index 0000000..6725251 --- /dev/null +++ b/elilo-x86-64-bootproto-update.diff @@ -0,0 +1,186 @@ +--- + x86_64/sysdeps.h | 34 +++++++++++++--------------------- + x86_64/system.c | 34 +++++++--------------------------- + 2 files changed, 20 insertions(+), 48 deletions(-) + +--- a/x86_64/sysdeps.h ++++ b/x86_64/sysdeps.h +@@ -107,12 +107,12 @@ typedef union x86_64_boot_params { + /* 0x06 */ UINT8 orig_video_mode; /* LDR */ + /* 0x07 */ UINT8 orig_video_cols; /* LDR */ + +-/* 0x08 */ UINT16 unused_1; /* unused */ ++/* 0x08 */ UINT16 pad_1; /* unused */ + + /* %%TBD */ + /* 0x0A */ UINT16 orig_ega_bx; /* LDR */ + +-/* 0x0C */ UINT16 unused_2; /* unused */ ++/* 0x0C */ UINT16 pad_2; /* unused */ + + /* Screen height before passing control to kernel. */ + /* 0x0E */ UINT8 orig_video_rows; /* LDR */ +@@ -174,7 +174,7 @@ typedef union x86_64_boot_params { + /* 0x4E */ UINT32 bios_code_len; /* LDR */ + /* 0x52 */ UINT16 bios_data_len; /* LDR */ + +-/* 0x54 */ UINT8 unused_3[0x2C]; /* unused */ ++/* 0x54 */ UINT8 pad_3[0x2C]; /* unused */ + + /* %%TBD */ + /* 0x80 */ UINT8 hd0_info[0x10]; /* LDR */ +@@ -184,7 +184,7 @@ typedef union x86_64_boot_params { + /* 0xA0 */ UINT16 mca_info_len; /* LDR */ + /* 0xA2 */ UINT8 mca_info_buf[0x10]; /* LDR */ + +-/* 0xB2 */ UINT8 unused_4[0x10E]; /* unused */ ++/* 0xB2 */ UINT8 pad_4[0x10E]; /* unused */ + + /* EFI boot loader signature. */ + /* 0x1C0 */ UINT8 efi_loader_sig[4]; /* LDR */ +@@ -209,9 +209,9 @@ typedef union x86_64_boot_params { + /* Available contiguous extended memory in KB. */ + /* 0x1E0 */ UINT32 alt_mem_k; /* LDR */ + +-/* 0x1E4 */ UINT32 unused_51; /* unused */ ++/* 0x1E4 */ UINT32 pad_51; /* unused */ + /* 0x1E8 */ UINT8 e820_nrmap; +-/* 0x1E9 */ UINT32 unused_52[2]; /* unused */ ++/* 0x1E9 */ UINT32 pad_52[2]; /* unused */ + + /* Size of setup code in sectors (1 sector == 512 bytes). */ + /* 0x1F1 */ UINT8 setup_sectors; /* BLD */ +@@ -220,15 +220,10 @@ typedef union x86_64_boot_params { + /* 0x1F2 */ UINT16 mount_root_rdonly; /* BLD */ + + /* %%TBD */ +-/* 0x1F4 */ UINT16 sys_size; /* BLD */ ++/* 0x1F4 */ UINT32 sys_size; /* BLD */ + + /* %%TBD */ +-/* 0x1F6 */ UINT16 swap_dev; /* BLD */ +- +-/* %%TBD */ +-/* 0x1F8 */ UINT16 ramdisk_flags; /* BLD */ +-#define RAMDISK_PROMPT 0x8000 +-#define RAMDISK_LOAD 0x4000 ++/* 0x1F8 */ UINT16 ram_size_DNU; /* BLD */ + + /* %%TBD */ + /* 0x1FA */ UINT16 video_mode_flag; /* BLD */ +@@ -236,12 +231,8 @@ typedef union x86_64_boot_params { + /* %%TBD */ + /* 0x1FC */ UINT16 orig_root_dev; /* BLD */ + +-/* 0x1FE */ UINT8 unused_6; /* unused */ +- + /* %%TBD */ +-/* 0x1FF */ UINT8 aux_dev_info; /* LDR */ +-#define NO_MOUSE 0x00 +-#define FOUND_MOUSE 0xAA ++/* 0x1FE */ UINT16 boot_flag; /* ? */ + + /* Jump past setup data (not used in EFI). */ + /* 0x200 */ UINT16 jump; /* BLD */ +@@ -283,16 +274,17 @@ typedef union x86_64_boot_params { + /* 0x21C */ UINT32 initrd_size; /* LDR */ + + /* %%TBD */ +-/* 0x220 */ UINT32 bootsect_helper; /* BLD */ ++/* 0x220 */ UINT32 bootsect_helper_DNU; /* BLD */ + + /* %%TBD */ + /* 0x224 */ UINT16 heap_end_ptr; /* LDR */ + + /* %%TBD */ +-/* 0x226 */ UINT16 unused_7; /* LDR */ ++/* 0x226 */ UINT8 ext_loader_ver; /* LDR */ ++/* 0x227 */ UINT8 ext_loader_type; /* LDR */ + + /* 0x228 */ UINT32 cmdline_addr; /* LDR */ +-/* 0x22C */ UINT32 unused_8[41]; ++/* 0x22C */ UINT32 pad_8[41]; + /* 0x2D0 */ UINT8 e820_map[2560]; + } s; + } boot_params_t; +--- a/x86_64/system.c ++++ b/x86_64/system.c +@@ -493,17 +493,9 @@ sysdeps_create_boot_params( + hdr_version = (bp->s.hdr_major << 8) | bp->s.hdr_minor; + + /* +- * Clear out unused memory in boot sector image. ++ * Do NOT clear out unknown memory in boot sector image. ++ * This breaks boot protocol >= 2.10 (2.6.31). + */ +- 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_51, sizeof bp->s.unused_51); +- ZeroMem(&bp->s.unused_52, sizeof bp->s.unused_52); +- bp->s.unused_6 = 0; +- bp->s.unused_7 = 0; +- ZeroMem(bp->s.unused_8, sizeof bp->s.unused_8); + + /* + * Tell kernel this was loaded by an advanced loader type. +@@ -553,19 +545,14 @@ sysdeps_create_boot_params( + DBG_PRT((L"initrd->start_addr="PTR_FMT" initrd->pgcnt=%d\n", + initrd->start_addr, initrd->pgcnt)); + +- /* These RAMdisk flags are not needed, just zero them. */ +- bp->s.ramdisk_flags = 0; ++ /* These RAMdisk flags are not needed, just zero them. NOT!*/ ++ /* 'ramdisk_flags' (@0x1F8) is called 'ram_size' in the meantime, */ ++ /* see Documentation/x86/boot.txt. */ + + if (initrd->start_addr && initrd->pgcnt) { + /* %%TBD - This will probably have to be changed. */ + bp->s.initrd_start = (UINT32)(UINT64)initrd->start_addr; + bp->s.initrd_size = (UINT32)(initrd->size); +- /* +- * This is the RAMdisk root device for RedHat 2.2.x +- * kernels (major 0x01, minor 0x00). +- */ +- +- bp->s.orig_root_dev = 0x0100; + } else { + bp->s.initrd_start = 0; + bp->s.initrd_size = 0; +@@ -590,11 +577,6 @@ sysdeps_create_boot_params( + ZeroMem(bp->s.mca_info_buf, sizeof bp->s.mca_info_buf); + + /* +- * Pointing device presence. The kernel will detect this. +- */ +- bp->s.aux_dev_info = NO_MOUSE; +- +- /* + * EFI loader signature + */ + CopyMem(bp->s.efi_loader_sig, EFI_LOADER_SIG_X64, 4); +@@ -692,11 +674,9 @@ sysdeps_create_boot_params( + CHECK_OFFSET(setup_sectors, 0x1F1, L"%xh"); + CHECK_OFFSET(mount_root_rdonly, 0x1F2, L"%xh"); + CHECK_OFFSET(sys_size, 0x1F4, L"%xh"); +- CHECK_OFFSET(swap_dev, 0x1F6, L"%xh"); +- CHECK_OFFSET(ramdisk_flags, 0x1F8, L"%xh"); + CHECK_OFFSET(video_mode_flag, 0x1FA, L"%xh"); + CHECK_OFFSET(orig_root_dev, 0x1FC, L"%xh"); +- CHECK_OFFSET(aux_dev_info, 0x1FF, L"%xh"); ++ CHECK_OFFSET(boot_flag, 0x1FE, L"%xh"); + CHECK_OFFSET(jump, 0x200, L"%xh"); + CHECK_OFFSET(setup_sig, 0x202, L"'%-4.4a'"); + CHECK_OFFSET(hdr_minor, 0x206, L"%xh"); +@@ -710,9 +690,9 @@ sysdeps_create_boot_params( + CHECK_OFFSET(kernel_start, 0x214, L"%xh"); + CHECK_OFFSET(initrd_start, 0x218, L"%xh"); + CHECK_OFFSET(initrd_size, 0x21C, L"%xh"); +- CHECK_OFFSET(bootsect_helper, 0x220, L"%xh"); + CHECK_OFFSET(heap_end_ptr, 0x224, L"%xh"); + CHECK_OFFSET(cmdline_addr, 0x228, L"%xh"); ++ CHECK_OFFSET(e820_map, 0x2D0, L"%xh"); + + if (test) { + ERR_PRT((L"Boot sector and/or setup parameter alignment error.")); diff --git a/elilo-x86-64-e820-max.diff b/elilo-x86-64-e820-max.diff new file mode 100644 index 0000000..f5b6b48 --- /dev/null +++ b/elilo-x86-64-e820-max.diff @@ -0,0 +1,230 @@ +--- + bootparams.c | 2 + x86_64/system.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 134 insertions(+), 7 deletions(-) + +--- a/bootparams.c ++++ b/bootparams.c +@@ -96,6 +96,8 @@ create_boot_params(CHAR16 *args, memdesc + */ + Memset(bp, 0, BOOT_PARAM_MEMSIZE); + ++ U2ascii(args, cp, cmdline_size); ++ + if (sysdeps_create_boot_params(bp, cp, initrd, vmcode, cookie) == -1) return 0; + + /* +--- a/x86_64/system.c ++++ b/x86_64/system.c +@@ -38,11 +38,19 @@ + */ + #include + #include ++#include + + #include "elilo.h" + #include "loader.h" + #include "rmswitch.h" + ++#define DEBUG_CREATE_BOOT_PARAMS 0 ++#if DEBUG_CREATE_BOOT_PARAMS ++#define DPR(a) do { if (elilo_opt.debug) { Print a; } } while ( 0 ) ++#else ++#define DPR(a) ++#endif ++ + extern loader_ops_t bzimage_loader, plain_loader, gzip_loader; + + /* +@@ -113,6 +121,8 @@ VOID *kernel_load_address = (VOID *)DEFA + VOID *initrd_start = NULL; + UINTN initrd_size = 0; + ++INTN e820_map_overflow = 0; ++ + INTN + sysdeps_init(EFI_HANDLE dev) + { +@@ -368,10 +378,56 @@ static INTN get_video_info(boot_params_t + return 0; + } + ++CHAR16 * ++StrStr(IN const CHAR16 *h, IN const CHAR16 *n) ++{ ++ const CHAR16 *t = h; ++ CHAR16 *res; ++ int len = 0, i; ++ ++ len = StrLen((CHAR16 *)n); ++ while(*t != CHAR_NULL) { ++ res = StrChr( t, n[0]); ++ if (!res) return res; ++ for( i = 1; i < len && res[i] != CHAR_NULL && res[i] == n[i]; i++); ++ if ( i == len ) return res; ++ t = res + 1; ++ if (t > h + CMDLINE_MAXLEN) return (CHAR16 *)0; ++ } ++ ++ return (CHAR16 *)0; ++} ++ ++CHAR8 * ++StrStr8(IN const CHAR8 *h, IN const CHAR8 *n) ++{ ++ const CHAR8 *t = h; ++ CHAR8 *res; ++ int len = 0, i; ++ ++ len = strlena((CHAR8 *)n); ++ while(*t != 0) { ++ res = strchra( t, n[0]); ++ if (!res) return res; ++ for( i = 1; i < len && res[i] != 0 && res[i] == n[i]; i++); ++ if ( i == len ) return res; ++ t = res + 1; ++ if (t > (h + CMDLINE_MAXLEN)) return (CHAR8 *)0; ++ } ++ ++ return (CHAR8 *)0; ++} ++ + /* Convert EFI memory map to E820 map for the operating system + * This code is based on a Linux kernel patch submitted by Edgar Hucek + */ + ++#if DEBUG_CREATE_BOOT_PARAMS ++static int e820_max = 6; ++#else ++static int e820_max = E820_MAX; ++#endif ++ + /* Add a memory region to the e820 map */ + static void add_memory_region (struct e820entry *e820_map, + int *e820_nr_map, +@@ -380,21 +436,56 @@ static void add_memory_region (struct e8 + unsigned int type) + { + int x = *e820_nr_map; ++ static unsigned long long estart = 0ULL; ++ static unsigned long esize = 0L; ++ static unsigned int etype = -1; ++ static int merge = 0; ++ ++ if (x == 0) ++ DPR((L"AMR: %3s %4s %16s/%12s/%s\n", ++ L"idx", L" ", L"start", L"size", L"type")); + +- if (x == E820_MAX) { +- Print(L"Too many entries in the memory map!\n"); +- return; +- } +- ++ /* merge adjacent regions of same type */ + if ((x > 0) && e820_map[x-1].addr + e820_map[x-1].size == start +- && e820_map[x-1].type == type) ++ && e820_map[x-1].type == type) { + e820_map[x-1].size += size; +- else { ++ estart = e820_map[x-1].addr; ++ esize = e820_map[x-1].size; ++ etype = e820_map[x-1].type; ++ merge++; ++ return; ++ } ++ /* fill up to E820_MAX */ ++ if ( x < e820_max ) { + e820_map[x].addr = start; + e820_map[x].size = size; + e820_map[x].type = type; + (*e820_nr_map)++; ++ if (merge) DPR((L"AMR: %3d ==> %016llx/%012lx/%d (%d)\n", ++ x-1, estart, esize, etype, merge)); ++ merge=0; ++ DPR((L"AMR: %3d add %016llx/%012lx/%d\n", ++ x, start, size, type)); ++ return; ++ } ++ /* different type means another region didn't fit */ ++ /* or same type, but there's a hole */ ++ if (etype != type || (estart + esize) != start) { ++ if (merge) DPR((L"AMR: %3d ===> %016llx/%012lx/%d (%d)\n", ++ e820_map_overflow, estart, esize, etype, merge)); ++ merge = 0; ++ estart = start; ++ esize = size; ++ etype = type; ++ e820_map_overflow++; ++ DPR((L"AMR: %3d OVER %016llx/%012lx/%d\n", ++ e820_map_overflow, start, size, type)); ++ return; + } ++ /* same type and no hole, merge it */ ++ estart += esize; ++ esize += size; ++ merge++; + } + + void fill_e820map(boot_params_t *bp, mmap_desc_t *mdesc) +@@ -473,6 +564,7 @@ void fill_e820map(boot_params_t *bp, mma + break; + default: + /* We should not hit this case */ ++ DBG_PRT((L"hit default!?")); + add_memory_region(e820_map, &e820_nr_map, + md->PhysicalStart, + md->NumberOfPages << EFI_PAGE_SHIFT, +@@ -486,6 +578,8 @@ void fill_e820map(boot_params_t *bp, mma + + /* + * x86_64 specific boot parameters initialization routine ++ * ++ * Note: debug and verbose messages have already been turned off! + */ + INTN + sysdeps_create_boot_params( +@@ -501,6 +595,12 @@ sysdeps_create_boot_params( + UINT8 row, col; + UINT8 mode; + UINT16 hdr_version; ++ UINT8 e820_map_overflow_warned = 0; ++ ++#if DEBUG_CREATE_BOOT_PARAMS ++ elilo_opt.debug=1; ++ elilo_opt.verbose=5; ++#endif + + DBG_PRT((L"fill_boot_params()\n")); + +@@ -834,6 +934,31 @@ do_memmap: + * and update the bootparam accordingly + */ + fill_e820map(bp, &mdesc); ++ ++#if DEBUG_CREATE_BOOT_PARAMS ++ if ( e820_map_overflow == 0 ) ++ e820_map_overflow = -1; /* force second get_memmap()! */ ++#endif ++ if (e820_map_overflow && !e820_map_overflow_warned) { ++ CHAR8 *aem = (CHAR8 *)"add_efi_memmap"; ++ e820_map_overflow_warned++; ++ ++#if DEBUG_CREATE_BOOT_PARAMS ++ elilo_opt.debug=0; ++ elilo_opt.verbose=0; ++#endif ++ if (e820_map_overflow == -1 || StrStr8(cmdline, aem)) { ++ /* Print(L"...mapping again, silently!\n"); */ ++ goto do_memmap; ++ } ++ ++ Print(L"\nCAUTION: EFI memory map has %d more entr%a" ++ " than E820 map supports.\n" ++ "To access all memory, '%a' may be necessary.\n\n", ++ e820_map_overflow, (e820_map_overflow==1)?"y":"ies", ++ aem); ++ goto do_memmap; ++ } + + return 0; + } diff --git a/elilo-x86-64-initrd.diff b/elilo-x86-64-initrd.diff new file mode 100644 index 0000000..ae2ee79 --- /dev/null +++ b/elilo-x86-64-initrd.diff @@ -0,0 +1,228 @@ +--- + elilo.h | 5 ++++ + ia32/system.c | 6 +++++ + ia64/system.c | 6 +++++ + initrd.c | 12 +++++++++- + x86_64/sysdeps.h | 20 ++++++------------ + x86_64/system.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++------- + 6 files changed, 88 insertions(+), 22 deletions(-) + +--- a/elilo.h ++++ b/elilo.h +@@ -54,6 +54,10 @@ + #define ROUNDUP(x,a) (((x) + (a) - 1) & ~((a) - 1)) + #define ROUNDDOWN(x,a) ((x) & ~((a) - 1)) + ++#ifndef UINT32_MAX ++#define UINT32_MAX ((UINT32)-1) ++#endif ++ + /* + * Elilo Boot modes + */ +@@ -212,6 +216,7 @@ extern CHAR16 *sysdeps_get_cmdline_opts( + extern INTN sysdeps_getopt(INTN, INTN, CHAR16 *); + extern VOID sysdeps_print_cmdline_opts(VOID); + extern INTN sysdeps_register_options(VOID); ++extern VOID *sysdeps_checkfix_initrd(VOID *, memdesc_t *); + + #define CHAR_SLASH L'/' + #define CHAR_BACKSLASH L'\\' +--- a/ia32/system.c ++++ b/ia32/system.c +@@ -149,6 +149,12 @@ sysdeps_initrd_get_addr(kdesc_t *kd, mem + return 0; + } + ++VOID * ++sysdeps_checkfix_initrd(VOID *start_addr, memdesc_t *imem) ++{ ++ return start_addr; ++} ++ + VOID + sysdeps_free_boot_params(boot_params_t *bp) + { +--- a/ia64/system.c ++++ b/ia64/system.c +@@ -140,6 +140,12 @@ sysdeps_initrd_get_addr(kdesc_t *kd, mem + return 0; + } + ++VOID * ++sysdeps_checkfix_initrd(VOID *start_addr, memdesc_t *imem) ++{ ++ return start_addr; ++} ++ + /* Flush data cache [addr; addr + len], and sync with icache. */ + void + flush_dcache (CHAR8 *addr, UINT64 len) +--- a/initrd.c ++++ b/initrd.c +@@ -41,7 +41,11 @@ INTN + load_file(CHAR16 *filename, memdesc_t *image) + { + EFI_STATUS status; +- VOID *start_addr = NULL; ++ /* ++ * Actually using the value from sysdeps_initrd_get_addr() ++ * instead of NULL is no change for ia64! ++ */ ++ VOID *start_addr = image->start_addr; + UINTN pgcnt; + UINT64 size = 0; + fops_fd_t fd; +@@ -71,7 +75,11 @@ load_file(CHAR16 *filename, memdesc_t *i + /* round up to get required number of pages (4KB) */ + image->pgcnt = pgcnt = EFI_SIZE_TO_PAGES(image->size); + +- start_addr = alloc_pages(pgcnt, EfiLoaderData, start_addr ? AllocateAddress : AllocateAnyPages, 0 ); ++ start_addr = alloc_pages(pgcnt, EfiLoaderData, ++ start_addr ? AllocateAddress : AllocateAnyPages, start_addr); ++ ++ start_addr = sysdeps_checkfix_initrd(start_addr, image); ++ + if (start_addr == NULL) { + ERR_PRT((L"Failed to allocate %d pages for %s image", pgcnt, + filename)); +--- a/x86_64/sysdeps.h ++++ b/x86_64/sysdeps.h +@@ -284,7 +284,8 @@ typedef union x86_64_boot_params { + /* 0x227 */ UINT8 ext_loader_type; /* LDR */ + + /* 0x228 */ UINT32 cmdline_addr; /* LDR */ +-/* 0x22C */ UINT32 pad_8[41]; ++/* 0x22C */ UINT32 initrd_addr_max; /* BLD */ ++/* 0x230 */ UINT32 pad_8[40]; + /* 0x2D0 */ UINT8 e820_map[2560]; + } s; + } boot_params_t; +@@ -374,7 +375,6 @@ start_kernel(VOID *kentry, boot_params_t + UINT16 kernel_cs; + } jumpvector; + VOID *jump_start; +- uint64_t temp; + + /* + * Disable interrupts. +@@ -382,22 +382,16 @@ start_kernel(VOID *kentry, boot_params_t + asm volatile ( "cli" : : ); + + /* +- * Relocate kernel (if needed), and initrd (if present). +- * Copy kernel first, in case kernel was loaded overlapping where we're +- * planning to copy the initrd. This assumes that the initrd didn't +- * get loaded overlapping where we're planning to copy the kernel, but +- * that's pretty unlikely since we couldn't alloc that space for the +- * kernel (or the kernel would already be there). ++ * Relocate kernel (if needed). ++ * This assumes that the initrd didn't get loaded overlapping where ++ * we're planning to copy the kernel, but that's pretty unlikely ++ * since we couldn't alloc that space for the kernel (or the kernel ++ * would already be there). + */ + if (kernel_start != kernel_load_address) { + MEMCPY(kernel_start, kernel_load_address, kernel_size); + } + +- if (bp->s.initrd_start) { +- temp = bp->s.initrd_start; +- MEMCPY(INITRD_START, temp , bp->s.initrd_size); +- bp->s.initrd_start = INITRD_START; +- } + /* + * Copy boot sector, setup data and command line + * to final resting place. We need to copy +--- a/x86_64/system.c ++++ b/x86_64/system.c +@@ -131,10 +131,8 @@ sysdeps_init(EFI_HANDLE dev) + /* + * initrd_get_addr() + * Compute a starting address for the initial RAMdisk image. +- * For now, this image is placed immediately after the end of +- * the kernel memory. Inside the start_kernel() code, the +- * RAMdisk image will be relocated to the top of available +- * extended memory. ++ * For now we suggest 'initrd_addr_max' with room for 32MB, ++ * as image->pgcnt is not initialized yet. + */ + INTN + sysdeps_initrd_get_addr(kdesc_t *kd, memdesc_t *imem) +@@ -146,10 +144,12 @@ sysdeps_initrd_get_addr(kdesc_t *kd, mem + return -1; + } + +- VERB_PRT(3, Print(L"kstart="PTR_FMT" kentry="PTR_FMT" kend="PTR_FMT"\n", +- kd->kstart, kd->kentry, kd->kend)); ++ VERB_PRT(3, Print(L"initrd_addr_max="PTR_FMT" reserve=%d\n", ++ param_start->s.initrd_addr_max, 32*MB)); + +- imem->start_addr = kd->kend; ++ imem->start_addr = (VOID *) ++ (((UINT64)param_start->s.initrd_addr_max - 32*MB + 1) ++ & ~EFI_PAGE_MASK); + + VERB_PRT(3, Print(L"initrd start_addr="PTR_FMT" pgcnt=%d\n", + imem->start_addr, imem->pgcnt)); +@@ -157,6 +157,48 @@ sysdeps_initrd_get_addr(kdesc_t *kd, mem + return 0; + } + ++ ++/* ++ * checkfix_initrd() ++ * Check and possibly fix allocation of initrd memory. ++ */ ++VOID * ++sysdeps_checkfix_initrd(VOID *start_addr, memdesc_t *imem) ++{ ++ UINTN pgcnt = EFI_SIZE_TO_PAGES(imem->size); ++ UINT64 initrd_addr_max = (UINT64)param_start->s.initrd_addr_max; ++ UINT64 ki_max = initrd_addr_max - imem->size + 1; ++ VOID *ki_max_addr; ++ ++ VERB_PRT( 3, Print(L"loadfile: start_addr="PTR_FMT ++ " ki_max_addr="PTR_FMT"\n", start_addr, (VOID *)ki_max)); ++ if (ki_max > UINT32_MAX) { ++ ERR_PRT((L"Force kernel specified initrd_addr_max="PTR_FMT ++ " below 4GB\n", (VOID *)initrd_addr_max)); ++ ki_max = UINT32_MAX - imem->size + 1; ++ } ++ ki_max_addr = (VOID *)ki_max; ++ ++ if ((UINT64)start_addr > ki_max) { ++ VERB_PRT(1, Print(L"initrd start_addr="PTR_FMT" above " ++ "limit="PTR_FMT"\n", start_addr, ki_max_addr)); ++ free(start_addr); ++ start_addr = NULL; ++ } ++ /* so either the initial allocation failed or it's been to high! */ ++ if (start_addr == NULL) { ++ start_addr = alloc_pages(pgcnt, EfiLoaderData, ++ AllocateMaxAddress, ki_max_addr); ++ } ++ if ((UINT64)start_addr > ki_max) { ++ ERR_PRT((L"Failed to allocate %d pages below %dMB", ++ pgcnt, (param_start->s.initrd_addr_max+1)>>20)); ++ free(start_addr); ++ start_addr = NULL; ++ } ++ return start_addr; ++} ++ + VOID + sysdeps_free_boot_params(boot_params_t *bp) + { +@@ -550,6 +592,11 @@ sysdeps_create_boot_params( + /* see Documentation/x86/boot.txt. */ + + if (initrd->start_addr && initrd->pgcnt) { ++ if ( (UINT64)initrd->start_addr > UINT32_MAX ) { ++ ERR_PRT((L"Start of initrd out of reach (>4GB).")); ++ free_kmem(); ++ return -1; ++ } + /* %%TBD - This will probably have to be changed. */ + bp->s.initrd_start = (UINT32)(UINT64)initrd->start_addr; + bp->s.initrd_size = (UINT32)(initrd->size); diff --git a/elilo-x86-64-kernel.diff b/elilo-x86-64-kernel.diff new file mode 100644 index 0000000..ecb1895 --- /dev/null +++ b/elilo-x86-64-kernel.diff @@ -0,0 +1,257 @@ +--- + alloc.c | 10 +++ + ia32/bzimage.c | 2 + x86_64/bzimage.c | 160 +++++++++++++++++++++++++++++++++++++++++++++---------- + x86_64/sysdeps.h | 5 + + x86_64/system.c | 9 ++- + 5 files changed, 152 insertions(+), 34 deletions(-) + +--- a/alloc.c ++++ b/alloc.c +@@ -217,7 +217,15 @@ INTN + alloc_kmem_anywhere(VOID **start_addr, UINTN pgcnt) + { + void * tmp; +- if ((tmp = alloc_pages(pgcnt, EfiLoaderData, AllocateAnyPages, *start_addr)) == 0) return -1; ++ /* ++ * During "AllocateAnyPages" *start_addr will be ignored. ++ * Therefore we can safely subvert it to reuse this function with ++ * an alloc_kmem_anyhwere_below() semantic... ++ */ ++ tmp = alloc_pages(pgcnt, EfiLoaderData, ++ (*start_addr) ? AllocateMaxAddress : AllocateAnyPages, ++ *start_addr); ++ if (tmp == NULL) return -1; + + kmem_addr = tmp; + kmem_pgcnt = pgcnt; +--- a/ia32/bzimage.c ++++ b/ia32/bzimage.c +@@ -169,7 +169,7 @@ bzImage_probe(CHAR16 *kname) + kernel_start)); + } + +- kernel_load_address = kernel_start; ++ kernel_load_address = NULL; /* allocate anywhere! */ + + if (alloc_kmem(kernel_start, EFI_SIZE_TO_PAGES(kernel_size)) != 0) { + /* +--- a/x86_64/bzimage.c ++++ b/x86_64/bzimage.c +@@ -36,6 +36,129 @@ UINTN param_size = 0; + + UINTN kernel_size = 0x800000; /* 8M (default x86_64 bzImage size limit) */ + ++static VOID * ++bzImage_alloc() ++{ ++ UINTN pages = EFI_SIZE_TO_PAGES(kernel_size); ++ int reloc_kernel = 0; ++ VOID *kla, *kend = kernel_start + kernel_size; ++ UINT32 kalign, kmask; ++ boot_params_t *ps = param_start; ++ ++ /* ++ * Get address for kernel from header, if applicable & available. ++ */ ++ if ((ps->s.hdr_major < 2) || ++ (ps->s.hdr_major == 2 && ps->s.hdr_minor < 5)) { ++ reloc_kernel = 0; ++ } else { ++ if (ps->s.kernel_start >= DEFAULT_KERNEL_START) ++ kernel_start = (void *)(UINT64)ps->s.kernel_start; ++ reloc_kernel = ps->s.relocatable_kernel; ++ kalign = ps->s.kernel_alignment; ++ kmask = kalign - 1; ++ VERB_PRT(3, Print(L"kernel header (%d.%d) suggests kernel " ++ "start at address "PTR_FMT" (%srelocatable!)\n", ++ ps->s.hdr_major, ps->s.hdr_minor, ps->s.kernel_start, ++ (reloc_kernel ? L"": L"not "))); ++ } ++ ++ /* ++ * Best effort for old (< 2.6.20) and non-relocatable kernels ++ */ ++ if (alloc_kmem(kernel_start, pages) == 0) { ++ VERB_PRT(3, Print(L"kernel_start: "PTR_FMT" kernel_size: %d\n", ++ kernel_start, kernel_size)); ++ return kernel_start; ++ } else if ( ! reloc_kernel ) { ++ /* ++ * Couldn't get desired address--just load it anywhere and ++ * (try to) move it later. It's the only chance for non- ++ * relocatable kernels, but it breaks occassionally... ++ */ ++ ERR_PRT((L"Kernel header (%d.%d) suggests kernel " ++ "start at address "PTR_FMT" (non relocatable!)\n" ++ "This address is not available, so an attempt" ++ "is made to copy the kernel there later on\n" ++ "BEWARE: this is unsupported and may not work. " ++ "Please update your kernel.\n", ++ ps->s.hdr_major, ps->s.hdr_minor, ps->s.kernel_start)); ++ kla = (VOID *)(UINT32_MAX - kernel_size); ++ /* NULL would preserve the "anywhere" semantic, */ ++ /* but it would not prevent allocation above 4GB! */ ++ ++ if (alloc_kmem_anywhere(&kla, pages) != 0) { ++ /* out of luck */ ++ return NULL; ++ } ++ VERB_PRT(3, Print(L"kernel_start: "PTR_FMT ++ " kernel_size: %d loading at: "PTR_FMT"\n", ++ kernel_start, kernel_size, kla)); ++ return kla; ++ } ++ ++ ++ /* Is 'ps->s.kernel_alignment' guaranteed to be sane? */ ++ if (kalign < EFI_PAGE_SIZE) { ++ kalign = EFI_PAGE_SIZE; ++ kmask = EFI_PAGE_MASK; ++ } ++ DBG_PRT((L"alignment: kernel=0x%x efi_page=0x%x : 0x%x\n", ++ ps->s.kernel_alignment, EFI_PAGE_SIZE, kalign)); ++ ++ /* ++ * Couldn't get the preferred address, but luckily it's ++ * a relocatable kernel, so ... ++ * ++ * 1. use 'find_kernel_memory()' (like Itanium) ++ * 2. try out the 16 lowest possible aligned addresses (> 0) ++ * 3. get enough memory to align "creatively" ++ * 4. forget alignment (and start praying)... ++ */ ++ ++ /* 1. */ ++ if ((find_kernel_memory(kernel_start, kend, kalign, &kla) != 0) || ++ (alloc_kmem(kla, pages) != 0)) { ++ kla = NULL; ++ } ++ ++ /* 2. */ ++ if ( ! kla && (UINT64)kernel_start < kalign ) { ++ int i; ++ for ( i = 1; i < 16 && !kla; i++ ) { ++ VOID *tmp = (VOID *)((UINT64)kalign * i); ++ if (alloc_kmem(tmp, pages) == 0) { ++ kla = tmp; ++ } ++ } ++ } ++ ++ /* 3. */ ++ if ( ! kla ) { ++ UINTN apages = EFI_SIZE_TO_PAGES(kernel_size + kmask); ++ kla = (VOID *)(UINT32_MAX - kernel_size - kmask); ++ ++ if (alloc_kmem_anywhere(&kla, apages) == 0) { ++ kla = (VOID *)(((UINT64)kla + kmask) & ~kmask); ++ } else { ++ kla = NULL; ++ } ++ } ++ ++ /* 4. last resort */ ++ if ( ! kla ) { ++ kla = (VOID *)(UINT32_MAX - kernel_size); ++ if (alloc_kmem_anywhere(&kla, pages) != 0) { ++ return NULL; ++ } ++ } ++ ++ kernel_start = kla; ++ VERB_PRT(1, Print(L"relocating kernel_start: "PTR_FMT ++ " kernel_size: %d\n", kernel_start, kernel_size)); ++ return kla; ++} ++ + static INTN + bzImage_probe(CHAR16 *kname) + { +@@ -158,37 +281,16 @@ bzImage_probe(CHAR16 *kname) + * Allocate memory for kernel. + */ + +- /* +- * Get correct address for kernel from header, if applicable & available. +- */ +- if ((param_start->s.hdr_major == 2) && +- (param_start->s.hdr_minor >= 6) && +- (param_start->s.kernel_start >= DEFAULT_KERNEL_START)) { +- kernel_start = (void *)param_start->s.kernel_start; +- VERB_PRT(3, Print(L"kernel header suggests kernel start at address "PTR_FMT"\n", +- kernel_start)); +- } +- +- kernel_load_address = kernel_start; +- +- if (alloc_kmem(kernel_start, EFI_SIZE_TO_PAGES(kernel_size)) != 0) { +- /* +- * Couldn't get desired address--just load it anywhere and move it later. +- * (Easier than relocating kernel, and also works with non-relocatable kernels.) +- */ +- if (alloc_kmem_anywhere(&kernel_load_address, EFI_SIZE_TO_PAGES(kernel_size)) != 0) { +- ERR_PRT((L"Could not allocate memory for kernel.")); +- free(param_start); +- param_start = NULL; +- param_size = 0; +- fops_close(fd); +- return -1; +- } ++ kernel_load_address = bzImage_alloc(); ++ if ( ! kernel_load_address ) { ++ ERR_PRT((L"Could not allocate memory for kernel.")); ++ free(param_start); ++ param_start = NULL; ++ param_size = 0; ++ fops_close(fd); ++ return -1; + } + +- VERB_PRT(3, Print(L"kernel_start: "PTR_FMT" kernel_size: %d loading at: "PTR_FMT"\n", +- kernel_start, kernel_size, kernel_load_address)); +- + /* + * Now read the rest of the kernel image into memory. + */ +--- a/x86_64/sysdeps.h ++++ b/x86_64/sysdeps.h +@@ -285,7 +285,10 @@ typedef union x86_64_boot_params { + + /* 0x228 */ UINT32 cmdline_addr; /* LDR */ + /* 0x22C */ UINT32 initrd_addr_max; /* BLD */ +-/* 0x230 */ UINT32 pad_8[40]; ++/* 0x230 */ UINT32 kernel_alignment; /* BLD */ ++/* 0x234 */ UINT8 relocatable_kernel; /* BLD */ ++/* 0x235 */ UINT8 pad_8[3]; ++/* 0x238 */ UINT32 pad_9[38]; + /* 0x2D0 */ UINT8 e820_map[2560]; + } s; + } boot_params_t; +--- a/x86_64/system.c ++++ b/x86_64/system.c +@@ -105,10 +105,10 @@ UINTN high_base_mem = 0x90000; + UINTN high_ext_mem = 32 * 1024 * 1024; + + /* This starting address will hold true for all of the loader types for now */ +-VOID *kernel_start = (void *)DEFAULT_KERNEL_START; ++VOID *kernel_start = (VOID *)DEFAULT_KERNEL_START; + + /* The kernel may load elsewhere if EFI firmware reserves kernel_start */ +-VOID *kernel_load_address = DEFAULT_KERNEL_START; ++VOID *kernel_load_address = (VOID *)DEFAULT_KERNEL_START; + + VOID *initrd_start = NULL; + UINTN initrd_size = 0; +@@ -631,6 +631,11 @@ sysdeps_create_boot_params( + /* + * Kernel entry point. + */ ++ if ( (UINT64)kernel_start != (UINT32)(UINT64)kernel_start ) { ++ ERR_PRT((L"Start of kernel (will be) out of reach (>4GB).")); ++ free_kmem(); ++ return -1; ++ } + bp->s.kernel_start = (UINT32)(UINT64)kernel_start; + + /* diff --git a/elilo.changes b/elilo.changes index fd8407d..2253dd4 100644 --- a/elilo.changes +++ b/elilo.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Dec 17 10:51:23 UTC 2010 - coolo@novell.com + +* Update to elilo-3.12 from SLE11 to fix EFI boot (bnc#659368) + - see ChangeLog for a detailed log + ------------------------------------------------------------------- Mon Jul 20 08:16:44 CEST 2009 - coolo@novell.com diff --git a/elilo.pl b/elilo.pl index 704c341..ec63e4c 100644 --- a/elilo.pl +++ b/elilo.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# $Id: elilo.pl,v 0.17 2008/11/12 15:57:58 rw Exp $ +# $Id: elilo.pl,v 0.21 2010/12/10 20:31:09 rw Exp $ use strict; my $C = $0; $C =~ s{^.*/}{}; @@ -36,10 +36,9 @@ my $Disclaimer = < ) { next if ( m/$Reserved/xo ); - if ( m{^\s*(?:image|initrd)\s*=\s*} ) { + if ( m{^\s*(?:image|initrd|vmm)\s*=\s*} ) { chomp; - s{^(\s*(image|initrd)\s*=\s*)(/\S+/)?([^/\s]+)\s*$}{$1$4}; + s{^(\s*(image|initrd|vmm)\s*=\s*)(/\S+/)?([^/\s]+)\s*$}{$1$4}; my( $t, $p, $f) = ($2, $3, $4); #Info( 0, "$C: $in: $.: t=$t p=$p f=$f\n"); $_ .= "\n"; @@ -241,7 +240,7 @@ sub Purge($) { Info( 1, "## remove old files from '$d'\n"); my @F = glob( "$d/*"); foreach my $f ( @F ) { - next unless ( $f =~ m{.*/((vm|)linu(x|z)|initrd)-\S+$} ); + next unless ( $f =~ m{.*/((vm|)linu(x|z)|initrd)(|[-.]\S+)$} ); Info( 1, "> rm $f\n"); unlink( $f) unless ($test); } @@ -393,7 +392,7 @@ Info( 1, "## Using '$D'...\n"); System( 2, "mkdir", "-p", $D) unless ( -d $D ); if ( -r $Sconf ) { - # extract kernels and initrds and write fixed .conf + # extract kernels, etc. and write fixed .conf my @F = Transfer( $Sconf, $D); # remove old files Purge( $D); diff --git a/elilo.spec b/elilo.spec index 1e56dc4..264d48f 100644 --- a/elilo.spec +++ b/elilo.spec @@ -1,7 +1,7 @@ # -# spec file for package elilo (Version 3.8) +# spec file for package elilo (Version 3.12) # -# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,36 +17,43 @@ # norootforbuild +%ifarch x86_64 +%if 0%{?suse_version} < 1100 +BuildRequires: binutils219 +#!BuildIgnore: binutils +%endif +%endif +BuildRequires: gnu-efi >= 3.0e Name: elilo Summary: EFI Linux Loader -Version: 3.8 -Release: 28 +Version: 3.12 +Release: 0 ExclusiveArch: ia64 %ix86 x86_64 Group: System/Boot AutoReqProv: on PreReq: /usr/bin/perl License: GPL v2 or later Url: http://elilo.sourceforge.net/ -Source: http://dl.sourceforge.net/elilo/elilo-3.8.tar.gz +Source: http://dl.sourceforge.net/elilo/elilo-3.12-source.tar.gz Source1: elilo.pl Source2: debian.eliloalt.man8 Source3: elilo.conf.man5 Source9: rpmlintrc -Patch0: elilo-3.8-cvs20080127.diff -Patch1: elilo-MAC.diff -Patch2: elilo-spelling.diff -Patch3: elilo-longer-commandline.diff +Patch0: elilo-x86-64-bootproto-update.diff +Patch1: elilo-x86-64-initrd.diff +Patch2: elilo-x86-64-kernel.diff +Patch3: elilo-x86-64-e820-max.diff Patch4: elilo-fix-possible-overflow.diff -Patch5: elilo-avoid-tab.diff -Patch6: elilo-bzimage-alloc.diff -Patch7: elilo-text-mode.diff -Patch8: elilo-fix-amd64-netboot.diff -Patch9: eliloalt-sysfs.diff -Patch10: elilo-strncpy-overflow-fix.diff -Patch11: elilo-cleanup.diff +Patch5: elilo-bzimage-alloc.diff +Patch6: elilo-fix-strncpy-overflow.diff +Patch7: elilo-longer-commandline.diff +Patch8: elilo-avoid-tab.diff +Patch9: elilo-cleanup.diff +Patch10: eliloalt-sysfs.diff +Patch11: elilo-MAC.diff +Patch12: elilo-text-mode.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build -BuildRequires: gnu-efi >= 3.0e %description The EFI Linux boot loader. @@ -61,10 +68,10 @@ Authors: Brett Johnson %prep -%setup -q -n elilo +%setup -q %patch0 -p1 %patch1 -p1 -%patch2 +%patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1 @@ -74,23 +81,25 @@ Authors: %patch9 -p1 %patch10 -p1 %patch11 -p1 -perl -pe 's{\@EDITION\@}{%{version}-%{release}}; - s{\@LIBEXECDIR\@}{%{_libdir}}; - s{\@ARCH\@}{%{_target_cpu}}; - ' < %{SOURCE1} > elilo.pl && -perl -pi -e 's{/usr/lib}{%{_libdir}}' Make.defaults -chmod 555 elilo.pl && touch -r %{SOURCE1} elilo.pl -! fgrep '%%{version}-%%{release}' elilo.pl +%patch12 -p1 %build +perl -pi -e 's{/usr/lib}{%{_libdir}}' Make.defaults make OPTIMFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -fno-stack-protector" + +perl -pe 's{\@EDITION\@}{%{version}-%{release}}; + s{\@LIBDIR\@}{%{_libdir}}; + s{\@ARCH\@}{%{_target_cpu}}; + ' < %{SOURCE1} > elilo.pl && +chmod 555 elilo.pl && touch -r %{SOURCE1} elilo.pl +! grep -F '%%{version}-%%{release}' elilo.pl pod2man -s 8 -c "System Boot" -r "SuSE Linux" \ -n elilo -d "%{version}-%{release}" elilo.pl elilo.8 touch -r elilo.pl elilo.8 %install install -d $RPM_BUILD_ROOT%{_libdir}/efi $RPM_BUILD_ROOT/sbin -install -m 444 elilo.efi $RPM_BUILD_ROOT%{_libdir}/efi +install -p -m 444 elilo.efi $RPM_BUILD_ROOT%{_libdir}/efi install tools/eliloalt $RPM_BUILD_ROOT/sbin install -p -m 555 elilo.pl $RPM_BUILD_ROOT/sbin/elilo install -D -p -m 644 elilo.8 $RPM_BUILD_ROOT/usr/share/man/man8/elilo.8 @@ -106,7 +115,7 @@ echo "Please run /sbin/elilo!" %files %defattr(-, root, root) -%doc README README.* TODO docs/*.txt +%doc README README.* TODO docs/*.txt ChangeLog %{_libdir}/efi /sbin/elilo /sbin/eliloalt diff --git a/eliloalt-sysfs.diff b/eliloalt-sysfs.diff index 58411be..be9ea2a 100644 --- a/eliloalt-sysfs.diff +++ b/eliloalt-sysfs.diff @@ -1,3 +1,7 @@ +--- + tools/eliloalt.c | 33 ++++++++++++++++++++++----------- + 1 file changed, 22 insertions(+), 11 deletions(-) + --- a/tools/eliloalt.c +++ b/tools/eliloalt.c @@ -47,8 +47,10 @@ @@ -12,7 +16,7 @@ #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 -@@ -80,7 +82,9 @@ +@@ -80,7 +82,9 @@ typedef struct _efi_variable_t { uint32_t attributes; } __attribute__((packed)) efi_variable_t; @@ -22,7 +26,7 @@ static struct option cmd_options[]={ { "version", 0, 0, 1}, -@@ -129,9 +133,15 @@ +@@ -129,9 +133,15 @@ check_proc_efi(int find_entry) if (getuid() != 0) { fatal_error("This program must be run as root\n"); } @@ -40,7 +44,7 @@ } if (!find_entry) { closedir(efi_vars); -@@ -143,9 +153,10 @@ +@@ -143,9 +153,10 @@ check_proc_efi(int find_entry) break; } if (entry == NULL) { @@ -53,7 +57,7 @@ closedir(efi_vars); return name; } -@@ -158,7 +169,7 @@ +@@ -158,7 +169,7 @@ delete_var(void) check_proc_efi(0); @@ -62,7 +66,7 @@ if (fd == -1) { fatal_error("variable not defined\n"); } -@@ -176,7 +187,7 @@ +@@ -176,7 +187,7 @@ delete_var(void) r = write(fd, &var, sizeof(var)); if (r != sizeof(var)) { @@ -71,7 +75,7 @@ } close(fd); } -@@ -191,7 +202,7 @@ +@@ -191,7 +202,7 @@ print_var(void) check_proc_efi(0); @@ -80,7 +84,7 @@ if (fd == -1) { fatal_error("variable not defined\n"); } -@@ -200,7 +211,7 @@ +@@ -200,7 +211,7 @@ print_var(void) r = read(fd, &var, sizeof(var)); if (r != sizeof(var)) { @@ -89,7 +93,7 @@ } printf("EliloAlt=\""); for(i=0; i < var.datasize; i+=1){ -@@ -231,7 +242,7 @@ +@@ -231,7 +242,7 @@ set_var(char *cmdline) fd = open(name, O_WRONLY); if (fd == -1) { @@ -98,7 +102,7 @@ } memset(&var, 0, sizeof(var)); -@@ -256,7 +267,7 @@ +@@ -256,7 +267,7 @@ set_var(char *cmdline) r = write(fd, &var, sizeof(var)); if (r != sizeof(var)) {