forked from pool/elilo
This commit is contained in:
parent
d2abc5e393
commit
bdd129f371
@ -1,13 +1,14 @@
|
||||
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,18 @@ static CHAR16 netfs_default_path[FILENAM
|
||||
@@ -61,6 +61,19 @@ static CHAR16 netfs_default_path[FILENAM
|
||||
static CHAR16 *hexa=L"0123456789ABCDEF";
|
||||
|
||||
static VOID
|
||||
+convert_mac2hex(UINT8 *hw_addr,INTN l, CHAR16 *str)
|
||||
+{
|
||||
+ UINTN i;
|
||||
+
|
||||
+ for (i=0 ; i < l; i++) {
|
||||
+ str[3*i] = hexa[(hw_addr[i] & 0xf0)>>4];
|
||||
+ str[3*i+1] = hexa[hw_addr[i] & 0x0f];
|
||||
@ -20,7 +21,7 @@ diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c
|
||||
convert_ip2hex(UINT8 *ip, INTN l, CHAR16 *str)
|
||||
{
|
||||
UINTN i;
|
||||
@@ -197,6 +209,12 @@ netfs_setdefaults(VOID *intf, config_fil
|
||||
@@ -197,6 +210,12 @@ netfs_setdefaults(VOID *intf, config_fil
|
||||
|
||||
StrnCpy(config[6].fname, str, maxlen-1);
|
||||
StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6);
|
||||
|
118
elilo-cleanup.diff
Normal file
118
elilo-cleanup.diff
Normal file
@ -0,0 +1,118 @@
|
||||
--- elilo/alloc.c
|
||||
+++ elilo/alloc.c
|
||||
@@ -110,7 +110,7 @@
|
||||
}
|
||||
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));
|
||||
|
||||
return tmp;
|
||||
}
|
||||
@@ -140,7 +140,7 @@
|
||||
|
||||
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));
|
||||
|
||||
return addr;
|
||||
}
|
||||
@@ -161,7 +161,7 @@
|
||||
VERB_PRT(1, Print(L"allocator: invalid free @ 0x%lx\n", addr));
|
||||
return;
|
||||
found:
|
||||
- DBG_PRT((L"free: %s @0x%lx size=%ld\n",
|
||||
+ DBG_PRT((L"free: %s @0x%lx size=%ld",
|
||||
p->type == ALLOC_POOL ? L"Pool": L"Page",
|
||||
addr, p->size));
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
|
||||
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));
|
||||
|
||||
if (used_allocs->type == ALLOC_POOL)
|
||||
uefi_call_wrapper(BS->FreePool, 1, used_allocs->addr);
|
||||
@@ -239,13 +239,13 @@
|
||||
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));
|
||||
if (kmem_addr && kmem_pgcnt != 0) {
|
||||
free(kmem_addr);
|
||||
kmem_addr = NULL;
|
||||
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));
|
||||
}
|
||||
|
||||
VOID
|
||||
--- elilo/fileops.c
|
||||
+++ elilo/fileops.c
|
||||
@@ -497,7 +497,7 @@
|
||||
|
||||
str2 = str == NULL ? L"Unknown" : str;
|
||||
|
||||
- DBG_PRT((L"%s : %-8s : %s\n", dev_tab[idx].name,
|
||||
+ DBG_PRT((L"%s : %-8s : %s", dev_tab[idx].name,
|
||||
(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 @@
|
||||
set_var(VAR_NETFS_DOMAINAME, info.domainame);
|
||||
|
||||
if (info.using_pxe) {
|
||||
+ DBG_PRT((L"netfs_setdefaults: using_pxe"));
|
||||
+
|
||||
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 @@
|
||||
|
||||
# define CONFIG_EXTENSION L".conf\0"
|
||||
|
||||
+ DBG_PRT((L"netfs_setdefaults: not using_pxe, machine specific"));
|
||||
len = StrLen(CONFIG_ARCH_EXTENSION) + 1;
|
||||
/*
|
||||
* will try machine/subnet specific files first.
|
||||
--- elilo/x86_64/bzimage.c
|
||||
+++ elilo/x86_64/bzimage.c
|
||||
@@ -193,18 +193,20 @@
|
||||
* Now read the rest of the kernel image into memory.
|
||||
*/
|
||||
|
||||
- DBG_PRT((L"reading kernel image...\n"));
|
||||
+ Print(L"Loading kernel %s... ", kname);
|
||||
|
||||
size = kernel_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));
|
||||
+ ERR_PRT((L"Error reading kernel image (0x%x).", efi_status));
|
||||
free(param_start);
|
||||
param_start = NULL;
|
||||
param_size = 0;
|
||||
fops_close(fd);
|
||||
free_kmem();
|
||||
return -1;
|
||||
+ } else {
|
||||
+ Print(L" done\n");
|
||||
}
|
||||
|
||||
DBG_PRT((L"kernel image read: %d bytes, %d Kbytes\n", size, size / 1024));
|
44
elilo-fix-amd64-netboot.diff
Normal file
44
elilo-fix-amd64-netboot.diff
Normal file
@ -0,0 +1,44 @@
|
||||
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);
|
48
elilo-strncpy-overflow-fix.diff
Normal file
48
elilo-strncpy-overflow-fix.diff
Normal file
@ -0,0 +1,48 @@
|
||||
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 @@
|
||||
{
|
||||
CHAR16 *res = dst;
|
||||
|
||||
- while (size-- && (*dst++ = *src++) != CHAR_NULL);
|
||||
+ while (size && size-- && (*dst++ = *src++) != CHAR_NULL);
|
||||
/*
|
||||
* does the null padding
|
||||
*/
|
||||
- while (size-- > 0) *dst++ = CHAR_NULL;
|
||||
+ while (size && size-- > 0) *dst++ = CHAR_NULL;
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -55,11 +55,11 @@
|
||||
{
|
||||
CHAR8 *res = dst;
|
||||
|
||||
- while (size-- && (*dst++ = (CHAR8)*src++) != '\0');
|
||||
+ while (size && size-- && (*dst++ = (CHAR8)*src++) != '\0');
|
||||
/*
|
||||
* does the null padding
|
||||
*/
|
||||
- while (size-- > 0) *dst++ = '\0';
|
||||
+ while (size && size-- > 0) *dst++ = '\0';
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -76,11 +76,11 @@
|
||||
{
|
||||
CHAR8 *res = dst;
|
||||
|
||||
- while (size-- && (*dst++ = *src++) != '\0');
|
||||
+ while (size && size-- && (*dst++ = *src++) != '\0');
|
||||
/*
|
||||
* does the null padding
|
||||
*/
|
||||
- while (size-- > 0) *dst++ = '\0';
|
||||
+ while (size && size-- > 0) *dst++ = '\0';
|
||||
|
||||
return res;
|
||||
}
|
89
elilo-text-mode.diff
Normal file
89
elilo-text-mode.diff
Normal file
@ -0,0 +1,89 @@
|
||||
--- elilo/x86_64/config.c
|
||||
+++ elilo/x86_64/config.c
|
||||
@@ -33,15 +33,23 @@
|
||||
|
||||
typedef struct {
|
||||
UINTN legacy_free_boot;
|
||||
+ UINTN text_mode;
|
||||
} x86_64_global_config_t;
|
||||
|
||||
|
||||
+#define x86_64_opt_offsetof(option) (&((sys_img_options_t *)(0x0))->option)
|
||||
+
|
||||
static x86_64_global_config_t x86_64_gconf;
|
||||
|
||||
static config_option_t sysdeps_global_options[]={
|
||||
{OPT_BOOL, OPT_GLOBAL, L"legacy-free", NULL, NULL, &x86_64_gconf.legacy_free_boot}
|
||||
};
|
||||
|
||||
+static config_option_t sysdeps_image_options[]={
|
||||
+ {OPT_BOOL, OPT_IMAGE_SYS, L"text-mode", NULL, NULL, x86_64_opt_offsetof(text_mode)}
|
||||
+};
|
||||
+
|
||||
+
|
||||
/*
|
||||
* X86_64 operations that need to be done only once and just before
|
||||
* entering the main loop of the loader
|
||||
@@ -81,6 +89,14 @@
|
||||
return x86_64_gconf.legacy_free_boot ? 1 : 0;
|
||||
}
|
||||
|
||||
+
|
||||
+INTN
|
||||
+x86_64_text_mode(VOID)
|
||||
+{
|
||||
+ return (elilo_opt.sys_img_opts &&
|
||||
+ elilo_opt.sys_img_opts->text_mode == TRUE) ? 1 : 0;
|
||||
+}
|
||||
+
|
||||
INTN
|
||||
sysdeps_register_options(VOID)
|
||||
{
|
||||
@@ -89,14 +105,11 @@
|
||||
ret = register_config_options(sysdeps_global_options,
|
||||
sizeof(sysdeps_global_options)/sizeof(config_option_t),
|
||||
OPTIONS_GROUP_GLOBAL);
|
||||
-#if 0
|
||||
- /* no per image options yet */
|
||||
if (ret == -1 ) return ret;
|
||||
|
||||
ret = register_config_options(sysdeps_image_options,
|
||||
sizeof(sysdeps_image_options)/sizeof(config_option_t),
|
||||
OPTIONS_GROUP_IMAGE);
|
||||
-#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
--- elilo/x86_64/sysdeps.h
|
||||
+++ elilo/x86_64/sysdeps.h
|
||||
@@ -369,6 +369,7 @@
|
||||
extern UINTN rmswitch_size;
|
||||
|
||||
extern INTN x86_64_use_legacy_free_boot();
|
||||
+extern INTN x86_64_text_mode();
|
||||
|
||||
/*
|
||||
* How to jump to kernel code
|
||||
@@ -471,7 +472,8 @@
|
||||
}
|
||||
|
||||
typedef struct sys_img_options {
|
||||
- UINT8 nothing_yet;
|
||||
+ UINT8 dummy; /* forces non-zero offset for first field */
|
||||
+ UINT8 text_mode; /* do not try to initialize Graphics Output Protocol */
|
||||
} sys_img_options_t;
|
||||
|
||||
#endif /* __ELILO_SYSDEPS_X86_64_H__ */
|
||||
--- elilo/x86_64/system.c
|
||||
+++ elilo/x86_64/system.c
|
||||
@@ -198,6 +198,10 @@
|
||||
UINTN size1;
|
||||
UINT8 i;
|
||||
|
||||
+ if (x86_64_text_mode() == 1) {
|
||||
+ Print((L"Skip GOP init, force text-mode.\n"));
|
||||
+ return -1;
|
||||
+ }
|
||||
efi_status = uefi_call_wrapper(
|
||||
BS->LocateHandle,
|
||||
5,
|
@ -1,3 +1,12 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Feb 9 15:36:39 CET 2009 - rw@suse.de
|
||||
|
||||
- elilo.efi
|
||||
* Allow booting x86_64 from network. (bnc#473914)
|
||||
* Introduce new per-image option 'text-mode' for x86_64, which can
|
||||
be used to sidestep "dubious" GOP implementations. (bnc#466570)
|
||||
* Minor cleanup.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Dec 9 16:34:53 CET 2008 - rw@suse.de
|
||||
|
||||
|
18
elilo.spec
18
elilo.spec
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package elilo (Version 3.8)
|
||||
#
|
||||
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2009 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
|
||||
@ -21,7 +21,7 @@
|
||||
Name: elilo
|
||||
Summary: EFI Linux Loader
|
||||
Version: 3.8
|
||||
Release: 25
|
||||
Release: 27
|
||||
ExclusiveArch: ia64 %ix86 x86_64
|
||||
Group: System/Boot
|
||||
AutoReqProv: on
|
||||
@ -40,7 +40,11 @@ Patch3: elilo-longer-commandline.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
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
BuildRequires: gnu-efi >= 3.0e
|
||||
|
||||
@ -65,7 +69,11 @@ Authors:
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
perl -pe 's{\@EDITION\@}{%{version}-%{release}};
|
||||
s{\@LIBEXECDIR\@}{%{_libexecdir}};
|
||||
s{\@ARCH\@}{%{_target_cpu}};
|
||||
@ -106,6 +114,12 @@ echo "Please run /sbin/elilo!"
|
||||
/usr/share/man/man8/*
|
||||
|
||||
%changelog
|
||||
* Mon Feb 09 2009 rw@suse.de
|
||||
- elilo.efi
|
||||
* Allow booting x86_64 from network. (bnc#473914)
|
||||
* Introduce new per-image option 'text-mode' for x86_64, which can
|
||||
be used to sidestep "dubious" GOP implementations. (bnc#466570)
|
||||
* Minor cleanup.
|
||||
* Tue Dec 09 2008 rw@suse.de
|
||||
- elilo.efi
|
||||
* Second attempt to work around firmware problem. (bnc#437486)
|
||||
|
Loading…
Reference in New Issue
Block a user