forked from pool/grub2
992b86f38f
- Support for UEFI Secure Boot on AArch64 (FATE#326541) * 0001-efi-refactor-grub_efi_allocate_pages.patch * 0002-Remove-grub_efi_allocate_pages.patch * 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch * 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch * 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch * 0006-Add-support-for-EFI-handover-on-ARM64.patch OBS-URL: https://build.opensuse.org/request/show/660470 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=319
76 lines
2.4 KiB
Diff
76 lines
2.4 KiB
Diff
From 226e83d10e35d1a76e93114366740f994548fe04 Mon Sep 17 00:00:00 2001
|
|
From: Leif Lindholm <leif.lindholm@linaro.org>
|
|
Date: Mon, 9 Jul 2018 18:33:01 +0100
|
|
Subject: [PATCH 5/6] efi: Add grub_efi_get_ram_base() function for arm64
|
|
|
|
Since ARM platforms do not have a common memory map, add a helper
|
|
function that finds the lowest address region with the EFI_MEMORY_WB
|
|
attribute set in the UEFI memory map.
|
|
|
|
Required for the arm64 efi linux loader to restrict the initrd
|
|
location to where it will be accessible by the kernel at runtime.
|
|
|
|
Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org>
|
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
|
---
|
|
grub-core/kern/efi/mm.c | 31 +++++++++++++++++++++++++++++++
|
|
include/grub/efi/efi.h | 3 +++
|
|
2 files changed, 34 insertions(+)
|
|
|
|
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
|
index 021d750b6..270d0b8cc 100644
|
|
--- a/grub-core/kern/efi/mm.c
|
|
+++ b/grub-core/kern/efi/mm.c
|
|
@@ -660,3 +660,34 @@ grub_efi_mm_init (void)
|
|
grub_efi_free_pages ((grub_addr_t) memory_map,
|
|
2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
|
}
|
|
+
|
|
+#if defined (__aarch64__)
|
|
+grub_err_t
|
|
+grub_efi_get_ram_base(grub_addr_t *base_addr)
|
|
+{
|
|
+ grub_efi_memory_descriptor_t *memory_map, *desc;
|
|
+ grub_efi_uintn_t memory_map_size, desc_size;
|
|
+ int ret;
|
|
+
|
|
+ memory_map_size = grub_efi_find_mmap_size();
|
|
+
|
|
+ memory_map = grub_malloc (memory_map_size);
|
|
+ if (! memory_map)
|
|
+ return GRUB_ERR_OUT_OF_MEMORY;
|
|
+ ret = grub_efi_get_memory_map (&memory_map_size, memory_map, NULL,
|
|
+ &desc_size, NULL);
|
|
+
|
|
+ if (ret < 1)
|
|
+ return GRUB_ERR_BUG;
|
|
+
|
|
+ for (desc = memory_map, *base_addr = GRUB_UINT_MAX;
|
|
+ (grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size);
|
|
+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
|
+ if (desc->attribute & GRUB_EFI_MEMORY_WB)
|
|
+ *base_addr = grub_min (*base_addr, desc->physical_start);
|
|
+
|
|
+ grub_free(memory_map);
|
|
+
|
|
+ return GRUB_ERR_NONE;
|
|
+}
|
|
+#endif
|
|
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
|
|
index e8ae60931..13bc67d57 100644
|
|
--- a/include/grub/efi/efi.h
|
|
+++ b/include/grub/efi/efi.h
|
|
@@ -97,6 +97,9 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
|
|
#if defined(__arm__) || defined(__aarch64__)
|
|
void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
|
|
#endif
|
|
+#if defined(__aarch64__)
|
|
+grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *);
|
|
+#endif
|
|
|
|
grub_addr_t grub_efi_modules_addr (void);
|
|
|
|
--
|
|
2.16.4
|
|
|