When building for 32 bit architectures, casting from
64 bit EFI_PHYSICAL_ADDRESS to 32 bit VOID * elicits a
compiler warning (-Wint-to-pointer-cast).
Check that the cast will not drop high order bits by using
uintptr_t as an intermediate type to transform the address
quietly.
Signed-off-by: Earl Chew <
earl...@yahoo.com>
---
kernel-stub/main.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/kernel-stub/main.c b/kernel-stub/main.c
index c0be1f6..c2e9482 100644
--- a/kernel-stub/main.c
+++ b/kernel-stub/main.c
@@ -104,6 +104,7 @@ EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
BOOLEAN has_dtbs = FALSE;
const VOID *kernel_source;
EFI_PHYSICAL_ADDRESS kernel_buffer;
+ EFI_PHYSICAL_ADDRESS aligned_kernel_buffer;
const CHAR8 *fdt_compatible;
VOID *fdt, *alt_fdt = NULL;
EFI_IMAGE_ENTRY_POINT kernel_entry;
@@ -193,10 +194,16 @@ EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
goto cleanup_initrd;
}
- kernel_image.ImageBase = (VOID *)
- align_addr(kernel_buffer, pe_header->Opt.SectionAlignment);
+ aligned_kernel_buffer = align_addr(kernel_buffer, pe_header->Opt.SectionAlignment);
+
+ kernel_image.ImageBase = (VOID *) (uintptr_t) aligned_kernel_buffer;
kernel_image.ImageSize = kernel_section->VirtualSize;
+ if ((uintptr_t) kernel_image.ImageBase != aligned_kernel_buffer) {
+ error(L"Error aligning memory for kernel image", EFI_LOAD_ERROR);
+ goto cleanup_buffer;
+ }
+
CopyMem(kernel_image.ImageBase, kernel_source, kernel_image.ImageSize);
/* Clear the rest so that .bss is definitely zero. */
SetMem((UINT8 *) kernel_image.ImageBase + kernel_image.ImageSize,
--
2.39.1