EFI supports allocating memory below a specified address; use that to implement GRUB_MMAP_MALLOC_LOW by requesting memory below 1M. ---
ChangeLog entry: 2013-11-13 Josh Triplett <j...@joshtriplett.org> * include/grub/efi/memory.h (GRUB_MMAP_MALLOC_LOW): Define. * grub-core/mmap/efi/mmap.c (grub_mmap_malign_and_register): Add support for GRUB_MMAP_MALLOC_LOW, to allocate memory below 1M via the EFI firmware. grub-core/mmap/efi/mmap.c | 15 ++++++++++----- include/grub/efi/memory.h | 2 ++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/grub-core/mmap/efi/mmap.c b/grub-core/mmap/efi/mmap.c index e6cd185..64ad05c 100644 --- a/grub-core/mmap/efi/mmap.c +++ b/grub-core/mmap/efi/mmap.c @@ -239,9 +239,9 @@ void * grub_mmap_malign_and_register (grub_uint64_t align __attribute__ ((unused)), grub_uint64_t size, int *handle, int type, - int flags __attribute__ ((unused))) + int flags) { - grub_efi_physical_address_t address; + grub_efi_physical_address_t address, max_address; grub_efi_boot_services_t *b; grub_efi_uintn_t pages; grub_efi_status_t status; @@ -254,13 +254,18 @@ grub_mmap_malign_and_register (grub_uint64_t align __attribute__ ((unused)), b = grub_efi_system_table->boot_services; - address = 0xffffffff; + if (flags & GRUB_MMAP_MALLOC_LOW) + max_address = 0xfffff; + else + max_address = 0xffffffff; + address = max_address; #if GRUB_TARGET_SIZEOF_VOID_P < 8 /* Limit the memory access to less than 4GB for 32-bit platforms. */ atype = GRUB_EFI_ALLOCATE_MAX_ADDRESS; #else - atype = GRUB_EFI_ALLOCATE_ANY_PAGES; + atype = (flags & GRUB_MMAP_MALLOC_LOW) ? GRUB_EFI_ALLOCATE_MAX_ADDRESS + : GRUB_EFI_ALLOCATE_ANY_PAGES; #endif pages = (size + 0xfff) >> 12; @@ -276,7 +281,7 @@ grub_mmap_malign_and_register (grub_uint64_t align __attribute__ ((unused)), { /* Uggh, the address 0 was allocated... This is too annoying, so reallocate another one. */ - address = 0xffffffff; + address = max_address; status = efi_call_4 (b->allocate_pages, atype, make_efi_memtype (type), pages, &address); grub_efi_free_pages (0, pages); diff --git a/include/grub/efi/memory.h b/include/grub/efi/memory.h index 20526b1..b4940af 100644 --- a/include/grub/efi/memory.h +++ b/include/grub/efi/memory.h @@ -24,6 +24,8 @@ #define GRUB_MMAP_REGISTER_BY_FIRMWARE 1 +#define GRUB_MMAP_MALLOC_LOW 1 + grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size, int type, int handle); grub_err_t grub_machine_mmap_unregister (int handle); -- 1.8.4.3 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel