mirror of
https://xff.cz/git/u-boot/
synced 2025-09-03 09:42:22 +02:00
efi_loader: Fix loaded image alignment
We are ignoring the alignment communicated via the PE/COFF header. Starting 5.10 the Linux kernel will loudly complain about it. For more details look at [1] (in linux kernel). So add a function that can allocate aligned EFI memory and use it for our relocated loaded image. [1] c32ac11da3f83 ("efi/libstub: arm64: Double check image alignment at entry") Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Tested-by: Vincent Stehlé <vincent.stehle@arm.com> Acked-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
committed by
Heinrich Schuchardt
parent
fa00b6fc3f
commit
ebdea88d57
@@ -549,6 +549,58 @@ efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_alloc_aligned_pages - allocate
|
||||
*
|
||||
* @len: len in bytes
|
||||
* @memory_type: usage type of the allocated memory
|
||||
* @align: alignment in bytes
|
||||
* Return: aligned memory or NULL
|
||||
*/
|
||||
void *efi_alloc_aligned_pages(u64 len, int memory_type, size_t align)
|
||||
{
|
||||
u64 req_pages = efi_size_in_pages(len);
|
||||
u64 true_pages = req_pages + efi_size_in_pages(align) - 1;
|
||||
u64 free_pages;
|
||||
u64 aligned_mem;
|
||||
efi_status_t r;
|
||||
u64 mem;
|
||||
|
||||
/* align must be zero or a power of two */
|
||||
if (align & (align - 1))
|
||||
return NULL;
|
||||
|
||||
/* Check for overflow */
|
||||
if (true_pages < req_pages)
|
||||
return NULL;
|
||||
|
||||
if (align < EFI_PAGE_SIZE) {
|
||||
r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type,
|
||||
req_pages, &mem);
|
||||
return (r == EFI_SUCCESS) ? (void *)(uintptr_t)mem : NULL;
|
||||
}
|
||||
|
||||
r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type,
|
||||
true_pages, &mem);
|
||||
if (r != EFI_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
aligned_mem = ALIGN(mem, align);
|
||||
/* Free pages before alignment */
|
||||
free_pages = efi_size_in_pages(aligned_mem - mem);
|
||||
if (free_pages)
|
||||
efi_free_pages(mem, free_pages);
|
||||
|
||||
/* Free trailing pages */
|
||||
free_pages = true_pages - (req_pages + free_pages);
|
||||
if (free_pages) {
|
||||
mem = aligned_mem + req_pages * EFI_PAGE_SIZE;
|
||||
efi_free_pages(mem, free_pages);
|
||||
}
|
||||
|
||||
return (void *)(uintptr_t)aligned_mem;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_allocate_pool - allocate memory from pool
|
||||
*
|
||||
|
Reference in New Issue
Block a user