File elilo-auto-add_efi_memmap.diff of Package elilo

---
 bootparams.c     |   15 ++++-----------
 x86_64/config.c  |   18 ++++++++++++++++++
 x86_64/sysdeps.h |    5 ++++-
 x86_64/system.c  |   30 +++++++++++++++++++++++++-----
 4 files changed, 51 insertions(+), 17 deletions(-)

--- a/x86_64/system.c
+++ b/x86_64/system.c
@@ -953,6 +953,11 @@ do_memmap:
 #endif
 	if (e820_map_overflow && !e820_map_overflow_warned) {
 		CHAR8 *aem = (CHAR8 *)"add_efi_memmap";
+		UINTN al = strlena( aem) + 1;
+		UINTN cl = strlena( (CHAR8 *)cmdline);
+		INT8 autoadd = (x86_64_auto_add_efi_memmap() &&
+				(cl + al) < CMDLINE_MAXLEN);
+		CHAR16 *severity = (autoadd) ? L"Notice" : L"CAUTION";
 		e820_map_overflow_warned++;
 
 #if DEBUG_CREATE_BOOT_PARAMS
@@ -964,11 +969,26 @@ do_memmap:
 			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);
+		Print(L"\n%s: EFI memory map has %d more entr%a than E820 map"
+			" supports.\n", severity, e820_map_overflow,
+			(e820_map_overflow==1)?"y":"ies");
+
+		if (autoadd) {
+			strcpya( cmdline + cl, (CHAR8 *)" ");
+			strcpya( cmdline + cl + 1, aem);
+			Print(L"To allow access to all memory, '%a' has been"
+				" auto-added!\n\n", aem);
+			wait_timeout(30);
+			goto do_memmap;
+		}
+		if ((cl + al) >= CMDLINE_MAXLEN)
+			Print(L"But adding '%a' would exceed the maximum"
+				" command-line length", aem);
+		else
+			Print(L"But auto-adding of '%a' is disabled in"
+				" 'elilo.conf'", aem);
+		wait_timeout(60);
+		Print(L"\n\n");
 		goto do_memmap;
 	}
 	
--- a/x86_64/config.c
+++ b/x86_64/config.c
@@ -34,6 +34,7 @@
 typedef struct {
 	UINTN legacy_free_boot;
 	UINTN text_mode;
+	CHAR16 add_efi_memmap[MAX_STRING];
 } x86_64_global_config_t;
 
 
@@ -42,10 +43,14 @@ typedef struct {
 static x86_64_global_config_t x86_64_gconf;
 
 static config_option_t sysdeps_global_options[]={
+	{OPT_STR,	OPT_GLOBAL, L"add-efi-memmap",
+			NULL,	NULL,	&x86_64_gconf.add_efi_memmap},
 	{OPT_BOOL,	OPT_GLOBAL, L"legacy-free",	NULL,	NULL,	&x86_64_gconf.legacy_free_boot}
 };
 
 static config_option_t sysdeps_image_options[]={
+	{OPT_STR,	OPT_IMAGE_SYS, L"add-efi-memmap",
+			NULL,	NULL,	x86_64_opt_offsetof(add_efi_memmap)},
 	{OPT_BOOL,	OPT_IMAGE_SYS, L"text-mode",	NULL,	NULL,	x86_64_opt_offsetof(text_mode)}
 };
 
@@ -89,6 +94,19 @@ x86_64_use_legacy_free_boot(VOID)
 	return x86_64_gconf.legacy_free_boot ? 1 : 0;
 }
 
+INT8
+x86_64_auto_add_efi_memmap(VOID)
+{
+	if (elilo_opt.sys_img_opts) {
+		if (!StrCmp(elilo_opt.sys_img_opts->add_efi_memmap, L"false"))
+			return 0;
+		if (!StrCmp(elilo_opt.sys_img_opts->add_efi_memmap, L"auto"))
+			return 1;
+	}
+	if (!StrCmp(x86_64_gconf.add_efi_memmap, L"false"))
+		return 0;
+	return 1;
+}
 
 INTN
 x86_64_text_mode(VOID)
--- a/x86_64/sysdeps.h
+++ b/x86_64/sysdeps.h
@@ -365,6 +365,7 @@ extern UINTN rmswitch_size;
 
 extern INTN x86_64_use_legacy_free_boot();
 extern INTN x86_64_text_mode();
+extern INT8 x86_64_auto_add_efi_memmap();
 
 /*
  * How to jump to kernel code
@@ -457,9 +458,11 @@ start_kernel(VOID *kentry, boot_params_t
 	/* Never come back to here. */
 }
 
+#define MAX_STRING 512 /* ToDo: move to 'config.h' */
 typedef struct sys_img_options {
 	UINT8 dummy;	 /* forces non-zero offset for first field */
-	UINT8 text_mode; /* do not try to initialize Graphics Output Protocol */
+	UINT8 text_mode; /* don't try to initialize GraphicsOutputProtocol */
+	CHAR16 add_efi_memmap[MAX_STRING]; /* "false" | "auto" */
 } sys_img_options_t;
 
 #endif /* __ELILO_SYSDEPS_X86_64_H__ */
--- a/bootparams.c
+++ b/bootparams.c
@@ -93,21 +93,14 @@ create_boot_params(CHAR16 *args, memdesc
 	 */
 	Memset(bp, 0, BOOT_PARAM_MEMSIZE);
 
+	/*
+	 * Convert kernel command line args from UNICODE to ASCII
+	 * and put them where the kernel expects them:
+	 */
 	U2ascii(args, cp, cmdline_size);
 
 	if (sysdeps_create_boot_params(bp, cp, initrd, vmcode, cookie) == -1) return 0;
 
-	/*
-	 * Convert kernel command line args from UNICODE to ASCII and put them where
-	 * the kernel expects them:
-	 */
-	while (1) {
-		ch = *args++;
-		if (!ch) break;
-		*cp++ = ch;
-	}
-	*cp++ = '\0';
-
 	return bp;
 }