From aa11f5deda29f91f5b8592965ed00f4a65002eff Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 29 Oct 2016 00:08:48 +0100 Subject: [PATCH] [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 Signed-off-by: Michael Brown --- src/arch/x86/image/bzimage.c | 8 +++++--- 1 file 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 ) {