[U-Boot] [PATCH] efi_loader: Respect DT reserved regions
Mark Kettenis
mark.kettenis at xs4all.nl
Fri Apr 6 09:25:24 UTC 2018
> From: Alexander Graf <agraf at suse.de>
> Date: Fri, 6 Apr 2018 09:42:47 +0200
>
> With legacy boot (booti, bootz), people can declare memory regions as
> reserved using device tree memory reservations. This feature is some
> times used to indicate memory regions that should not be touched.
>
> Since in a UEFI world, the DT memory reservations do not get honored,
> let's copy them into the UEFI memory map so everyone has a coherent
> view of the world and we give people the chance to add reservations
> on demand.
This won't fix the issue raised here:
https://lists.denx.de/pipermail/u-boot/2018-March/324336.html
but would open up yet another way to solve that issue.
But with my analysis of that issue still in the back of my mind I have
a question. What happens with regions added by U-Boot itself through
fdt_add_mem_rsv() calls? Also note that the is code in
arch/arm/mach-meson/board.c that explicitly calls efi_add_memory_map()
to reserve memory it adds using fdt_add_mem_rsv().
> ---
> cmd/bootefi.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index 2a31a914cd..5a2a81005f 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -178,6 +178,27 @@ static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*entry)(
> }
> #endif
>
> +/* Carve out DT reserved memory ranges */
> +static efi_status_t efi_carve_out_dt_rsv(void *fdt)
> +{
> + int nr_rsv, i;
> + uint64_t addr, size, pages;
> +
> + nr_rsv = fdt_num_mem_rsv(fdt);
> +
> + /* Look for an existing entry and add it to the efi mem map. */
> + for (i = 0; i < nr_rsv; i++) {
> + if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
> + continue;
> +
> + pages = ALIGN(size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT;
> + efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
> + false);
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> static efi_status_t efi_install_fdt(void *fdt)
> {
> bootm_headers_t img = { 0 };
> @@ -199,6 +220,11 @@ static efi_status_t efi_install_fdt(void *fdt)
> return EFI_LOAD_ERROR;
> }
>
> + if (efi_carve_out_dt_rsv(fdt) != EFI_SUCCESS) {
> + printf("ERROR: failed to carve out memory\n");
> + return EFI_LOAD_ERROR;
> + }
> +
> /* Link to it in the efi tables */
> ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
> if (ret != EFI_SUCCESS)
> --
> 2.12.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
>
More information about the U-Boot
mailing list