forked from Minki/linux
x86, boot: correct sanity checks in boot/compressed/misc.c
arch/x86/boot/compressed/misc.c contains several sanity checks on the output address. Correct constraints that are no longer correct: - the alignment test should be MIN_KERNEL_ALIGN on both 32 and 64 bits. - the 64 bit maximum address was set to 2^40, which was the limit of one specific x86-64 implementation. Change the test to 2^46, the current Linux limit, and at least try to test the end rather than the beginning. - for non-relocatable kernels, test against LOAD_PHYSICAL_ADDR on both 32 and 64 bits. [ Impact: fix potential boot failure due to invalid tests ] Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
5031296c57
commit
7ed42a28b2
@ -325,20 +325,18 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
|
|||||||
free_mem_ptr = heap; /* Heap */
|
free_mem_ptr = heap; /* Heap */
|
||||||
free_mem_end_ptr = heap + BOOT_HEAP_SIZE;
|
free_mem_end_ptr = heap + BOOT_HEAP_SIZE;
|
||||||
|
|
||||||
|
if ((unsigned long)output & (MIN_KERNEL_ALIGN - 1))
|
||||||
|
error("Destination address inappropriately aligned");
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
if ((unsigned long)output & (__KERNEL_ALIGN - 1))
|
if (heap > 0x3fffffffffffUL)
|
||||||
error("Destination address not 2M aligned");
|
|
||||||
if ((unsigned long)output >= 0xffffffffffUL)
|
|
||||||
error("Destination address too large");
|
error("Destination address too large");
|
||||||
#else
|
#else
|
||||||
if ((u32)output & (CONFIG_PHYSICAL_ALIGN - 1))
|
|
||||||
error("Destination address not CONFIG_PHYSICAL_ALIGN aligned");
|
|
||||||
if (heap > ((-__PAGE_OFFSET-(512<<20)-1) & 0x7fffffff))
|
if (heap > ((-__PAGE_OFFSET-(512<<20)-1) & 0x7fffffff))
|
||||||
error("Destination address too large");
|
error("Destination address too large");
|
||||||
#ifndef CONFIG_RELOCATABLE
|
|
||||||
if ((u32)output != LOAD_PHYSICAL_ADDR)
|
|
||||||
error("Wrong destination address");
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef CONFIG_RELOCATABLE
|
||||||
|
if ((unsigned long)output != LOAD_PHYSICAL_ADDR)
|
||||||
|
error("Wrong destination address");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
|
Loading…
Reference in New Issue
Block a user