forked from pool/elilo
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
This commit is contained in:
parent
5d6438f663
commit
163b743a22
3
elilo-3.12-source.tar.gz
Normal file
3
elilo-3.12-source.tar.gz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5005534ae972603c65caa8debb2bf3c4a22b895588323bc1b0a7a9f114e030ee
|
||||
size 215125
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:eca0d67a6764d088a5526a2ef7b0f23ee51dc4a29ac58fb10e4d93421d6b7901
|
||||
size 206250
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 && (t<f)) { \
|
||||
while (n--) { \
|
||||
*t++ = *f++; \
|
||||
} \
|
||||
+ } else if (t && f && n && (t>f)) { \
|
||||
+ 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);
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
|
||||
|
@ -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);
|
@ -1,6 +1,6 @@
|
||||
From: Bernhard Walle <bwalle@suse.de>
|
||||
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 <bwalle@suse.de>
|
||||
|
||||
---
|
||||
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;
|
||||
|
@ -1,10 +1,15 @@
|
||||
From: Jarrod Johnson <jbjohnso@us.ibm.com>
|
||||
|
||||
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;
|
||||
|
@ -1,6 +1,8 @@
|
||||
References: 242702
|
||||
From: Bernhard Walle <bwalle@suse.de>
|
||||
Subject: Increase command line size to 2048 chars.
|
||||
References: bnc#242702
|
||||
|
||||
Increase command line size to 2048 chars.
|
||||
Signed-off-by: Bernhard Walle <bwalle@suse.de>
|
||||
|
||||
---
|
||||
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) */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
186
elilo-x86-64-bootproto-update.diff
Normal file
186
elilo-x86-64-bootproto-update.diff
Normal file
@ -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."));
|
230
elilo-x86-64-e820-max.diff
Normal file
230
elilo-x86-64-e820-max.diff
Normal file
@ -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 <efi.h>
|
||||
#include <efilib.h>
|
||||
+#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
228
elilo-x86-64-initrd.diff
Normal file
228
elilo-x86-64-initrd.diff
Normal file
@ -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);
|
257
elilo-x86-64-kernel.diff
Normal file
257
elilo-x86-64-kernel.diff
Normal file
@ -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;
|
||||
|
||||
/*
|
@ -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
|
||||
|
||||
|
13
elilo.pl
13
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 = <<EoD;
|
||||
EoD
|
||||
|
||||
$| = 1;
|
||||
$[ = 0;
|
||||
|
||||
sub Version() {
|
||||
my $v = q($Revision: 0.17 $ );
|
||||
my $v = q($Revision: 0.21 $ );
|
||||
$v =~ s/^\$ Rev.*:\ ([0-9.]+)\ \$\ /$1/x;
|
||||
$v .= " (part of elilo-$Edition)" if ( $Edition ne "\@EDITION\@" );
|
||||
print "$C version $v\n";
|
||||
@ -101,9 +100,9 @@ sub Transfer ($$) {
|
||||
}
|
||||
while ( <IN> ) {
|
||||
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);
|
||||
|
65
elilo.spec
65
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 <brett@hp.com>
|
||||
|
||||
%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
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user