SHA256
1
0
forked from pool/elilo
elilo/elilo-auto-add_efi_memmap.diff

150 lines
4.1 KiB
Diff
Raw Normal View History

---
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;
}