summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
authorMichael Brown2016-10-29 01:08:48 +0200
committerMichael Brown2016-10-29 01:32:33 +0200
commitaa11f5deda29f91f5b8592965ed00f4a65002eff (patch)
treec2023ebd586dc7656df1448e7eb3102d8c2f24d7 /src/arch
parent[efi] Add EFI_BLOCK_IO2_PROTOCOL header and GUID definition (diff)
downloadipxe-aa11f5deda29f91f5b8592965ed00f4a65002eff.tar.gz
ipxe-aa11f5deda29f91f5b8592965ed00f4a65002eff.tar.xz
ipxe-aa11f5deda29f91f5b8592965ed00f4a65002eff.zip
[bzimage] Fix page alignment of initrd images
The initrd_addr_max field represents the highest byte address that may be used to hold initrd images, and is therefore almost certainly not aligned to a page boundary: a typical value might be 0x7fffffff. Fix the address calculations to ensure that the initrd images are always aligned to a page boundary. Reported-by: Sitsofe Wheeler <sitsofe@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/image/bzimage.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/arch/x86/image/bzimage.c b/src/arch/x86/image/bzimage.c
index d9b5ddc0..e3c4cb83 100644
--- a/src/arch/x86/image/bzimage.c
+++ b/src/arch/x86/image/bzimage.c
@@ -522,10 +522,12 @@ static void bzimage_load_initrds ( struct image *image,
/* Find highest usable address */
top = userptr_add ( highest->data, bzimage_align ( highest->len ) );
- if ( user_to_phys ( top, 0 ) > bzimg->mem_limit )
- top = phys_to_user ( bzimg->mem_limit );
+ if ( user_to_phys ( top, -1 ) > bzimg->mem_limit ) {
+ top = phys_to_user ( ( bzimg->mem_limit + 1 ) &
+ ~( INITRD_ALIGN - 1 ) );
+ }
DBGC ( image, "bzImage %p loading initrds from %#08lx downwards\n",
- image, user_to_phys ( top, 0 ) );
+ image, user_to_phys ( top, -1 ) );
/* Load initrds in order */
for_each_image ( initrd ) {