[U-Boot] [PATCH 1/1] efi_loader: efi_allocate_pages is too restrictive
Alexander Graf
agraf at suse.de
Fri Mar 9 16:19:37 UTC 2018
On 03/09/2018 04:58 PM, Heinrich Schuchardt wrote:
> On 03/09/2018 01:48 PM, Alexander Graf wrote:
>> On 03/03/2018 03:48 PM, Heinrich Schuchardt wrote:
>>> When running on the sandbox the stack is not necessarily at a higher
>>> memory
>>> address than the highest free memory.
>>>
>>> There is no reason why the checking of the highest memory address
>>> should be
>>> more restrictive for EFI_ALLOCATE_ANY_PAGES than for
>>> EFI_ALLOCATE_MAX_ADDRESS.
>>>
>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>> ---
>>> lib/efi_loader/efi_memory.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>>> index cc271e0709d..0efbb973231 100644
>>> --- a/lib/efi_loader/efi_memory.c
>>> +++ b/lib/efi_loader/efi_memory.c
>>> @@ -294,7 +294,7 @@ efi_status_t efi_allocate_pages(int type, int
>>> memory_type,
>>> switch (type) {
>>> case EFI_ALLOCATE_ANY_PAGES:
>>> /* Any page */
>>> - addr = efi_find_free_memory(len, gd->start_addr_sp);
>>> + addr = efi_find_free_memory(len, (uint64_t)-1);
>> This will break on systems that do not map high address space into the
>> linear map (IIRC nvidia systems had that issue).
>>
> The memory map is also passed on to the operating system when booting.
> If a memory reservation is missing for any board it has to be fixed in
> the board or driver files, cf.
>
> sunxi: video: mark framebuffer as EFI reserved memory
> https://lists.denx.de/pipermail/u-boot/2018-March/321820.htm
>
> For type = EFI_ALLOCATE_MAX_ADDRESS we don't care about
> gd->start_addr_sp. So if the memory map is incomplete the current code
> may fail. Keeping things as they are is not a viable option.
>
> Could you, please, identify for which Nvidia system a problem was
> reported? Then we can add a call to efi_add_memory_map() for the board.
Git blame points to this commit. I guess -1 should do the same thing
then, true.
Andreas, would you see any reason -1 will not work?
Alex
commit dede284d1ce9f9d9e79a5114fe7eb814fec07679
Author: Andreas Färber <afaerber at suse.de>
Date: Wed Apr 13 14:04:38 2016 +0200
efi_loader: Handle memory overflows
jetson-tk1 has 2 GB of RAM at 0x80000000, causing gd->ram_top to be
zero.
Handle this by either avoiding ram_top or by using the same type as
ram_top to reverse the overflow effect.
Cc: Alexander Graf <agraf at suse.de>
Signed-off-by: Andreas Färber <afaerber at suse.de>
Reviewed-by: Alexander Graf <agraf at suse.de>
diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index df995858ed..71a3d19269 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -220,7 +220,7 @@ efi_status_t efi_allocate_pages(int type, int
memory_type,
switch (type) {
case 0:
/* Any page */
- addr = efi_find_free_memory(len, gd->ram_top);
+ addr = efi_find_free_memory(len, gd->start_addr_sp);
if (!addr) {
r = EFI_NOT_FOUND;
break;
@@ -320,9 +320,9 @@ efi_status_t efi_get_memory_map(unsigned long
*memory_map_size,
int efi_memory_init(void)
{
- uint64_t runtime_start, runtime_end, runtime_pages;
- uint64_t uboot_start, uboot_pages;
- uint64_t uboot_stack_size = 16 * 1024 * 1024;
+ unsigned long runtime_start, runtime_end, runtime_pages;
+ unsigned long uboot_start, uboot_pages;
+ unsigned long uboot_stack_size = 16 * 1024 * 1024;
int i;
/* Add RAM */
More information about the U-Boot
mailing list