[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 2/6] efi: add grub_efi_get_ram_base() function for arm64
From: |
Leif Lindholm |
Subject: |
[PATCH v4 2/6] efi: add grub_efi_get_ram_base() function for arm64 |
Date: |
Mon, 9 Jul 2018 18:33:01 +0100 |
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 <address@hidden>
---
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 fd39d23b4..b7cf144e5 100644
--- a/grub-core/kern/efi/mm.c
+++ b/grub-core/kern/efi/mm.c
@@ -629,3 +629,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 1021273c1..57db74b57 100644
--- a/include/grub/efi/efi.h
+++ b/include/grub/efi/efi.h
@@ -93,6 +93,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.11.0
- [PATCH v4 0/6] efi: arm linux loader unification and correctness, Leif Lindholm, 2018/07/09
- [PATCH v4 1/6] efi: add central copy of grub_efi_find_mmap_size, Leif Lindholm, 2018/07/09
- [PATCH v4 2/6] efi: add grub_efi_get_ram_base() function for arm64,
Leif Lindholm <=
- [PATCH v4 3/6] arm64 linux loader: rename functions and macros and move to common headers, Leif Lindholm, 2018/07/09
- [PATCH v4 4/6] arm/efi: switch to arm64 linux loader, Leif Lindholm, 2018/07/09
- [PATCH v4 6/6] efi: restrict arm/arm64 linux loader initrd placement, Leif Lindholm, 2018/07/09
- [PATCH v4 5/6] arm: delete unused efi support from loader/arm, Leif Lindholm, 2018/07/09
- Re: [PATCH v4 0/6] efi: arm linux loader unification and correctness, Daniel Kiper, 2018/07/10