forked from pool/elilo
150 lines
4.1 KiB
Diff
150 lines
4.1 KiB
Diff
|
---
|
||
|
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;
|
||
|
}
|
||
|
|