[U-Boot] [PATCH] efi_loader: Reserve unaccessible memory

Alexander Graf agraf at suse.de
Fri Nov 30 00:19:13 UTC 2018



On 30.11.18 01:05, Heinrich Schuchardt wrote:
> On 11/30/18 12:47 AM, Alexander Graf wrote:
>> On some systems, not all RAM may be usable within U-Boot. Maybe the
>> memory maps are incomplete, maybe it's used as workaround for broken
>> DMA. But whatever the reason may be, a platform can say that it does
>> not wish to have its RAM accessed above a certain address by defining
>> board_get_usable_ram_top().
>>
>> In the efi_loader world, we ignored that hint, mostly because very few
>> boards actually have real restrictions around this.
>>
>> So let's honor the board's wish to not access high addresses during
>> boot time. The best way to do so is by indicating the respective pages
>> as "allocated by firmware". That way, Operating Systems will still
>> use the pages after boot, but before boot no allocation will use them.
>>
>> Reported-by: Baruch Siach <baruch at tkos.co.il>
>> Signed-off-by: Alexander Graf <agraf at suse.de>
>> ---
>>  include/common.h            | 11 +++++++++++
>>  lib/efi_loader/efi_memory.c |  9 +++++++++
>>  2 files changed, 20 insertions(+)
>>
>> diff --git a/include/common.h b/include/common.h
>> index 3f69943887..8f295c2f30 100644
>> --- a/include/common.h
>> +++ b/include/common.h
>> @@ -106,6 +106,17 @@ int mdm_init(void);
>>  void board_show_dram(phys_size_t size);
>>  
>>  /**
>> + * Get the uppermost pointer that is valid to access
>> + *
>> + * Some systems may not map all of their address space. This function allows
>> + * boards to indicate what their highest support pointer value is for DRAM
>> + * access.
>> + *
>> + * @param total_size	Size of U-Boot (unused?)
>> + */
>> +ulong board_get_usable_ram_top(ulong total_size);
>> +
>> +/**
>>   * arch_fixup_fdt() - Write arch-specific information to fdt
>>   *
>>   * Defined in arch/$(ARCH)/lib/bootm-fdt.c
>> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>> index f225a9028c..2f13bf8a75 100644
>> --- a/lib/efi_loader/efi_memory.c
>> +++ b/lib/efi_loader/efi_memory.c
>> @@ -551,6 +551,7 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
>>  
>>  __weak void efi_add_known_memory(void)
>>  {
>> +	u64 ram_top = board_get_usable_ram_top(0) & ~EFI_PAGE_MASK;

^

>>  	int i;
>>  
>>  	/* Add RAM */
>> @@ -570,6 +571,14 @@ __weak void efi_add_known_memory(void)
>>  			efi_add_memory_map(ram_start, pages,
>>  					   EFI_CONVENTIONAL_MEMORY, false);
>>  		}
>> +
>> +		/* Reserve memory above ram_top, as that may not be mapped */
>> +		if ((ram_top >= ram_start) && (ram_top < ram_end)) {
>> +			pages = (ram_end - ram_top) >> EFI_PAGE_SHIFT;
> 
> Please, do not assume that ram_end is page aligned.

See above. I align it manually, no?

Alex

> You could use the
> macro efi_size_in_pages() here. See
> https://patchwork.ozlabs.org/patch/999522/
> 
> Best regards
> 
> Heinrich
> 
>> +
>> +			efi_add_memory_map(ram_top, pages,
>> +					   EFI_BOOT_SERVICES_DATA, true);
>> +		}
>>  	}
>>  }
>>  
>>
> 


More information about the U-Boot mailing list