diff options
Diffstat (limited to 'arch/arm/boot/compressed')
| -rw-r--r-- | arch/arm/boot/compressed/head.S | 41 | 
1 files changed, 31 insertions, 10 deletions
| diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 68be9017593d..c41a793b519c 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -178,7 +178,7 @@ not_angel:  		/*  		 * Set up a page table only if it won't overwrite ourself. -		 * That means r4 < pc && r4 - 16k page directory > &_end. +		 * That means r4 < pc || r4 - 16k page directory > &_end.  		 * Given that r4 > &_end is most unfrequent, we add a rough  		 * additional 1MB of room for a possible appended DTB.  		 */ @@ -263,16 +263,37 @@ restart:	adr	r0, LC0  		 * OK... Let's do some funky business here.  		 * If we do have a DTB appended to zImage, and we do have  		 * an ATAG list around, we want the later to be translated -		 * and folded into the former here.  To be on the safe side, -		 * let's temporarily move  the stack away into the malloc -		 * area.  No GOT fixup has occurred yet, but none of the -		 * code we're about to call uses any global variable. +		 * and folded into the former here. No GOT fixup has occurred +		 * yet, but none of the code we're about to call uses any +		 * global variable.  		*/ -		add	sp, sp, #0x10000 + +		/* Get the initial DTB size */ +		ldr	r5, [r6, #4] +#ifndef __ARMEB__ +		/* convert to little endian */ +		eor	r1, r5, r5, ror #16 +		bic	r1, r1, #0x00ff0000 +		mov	r5, r5, ror #8 +		eor	r5, r5, r1, lsr #8 +#endif +		/* 50% DTB growth should be good enough */ +		add	r5, r5, r5, lsr #1 +		/* preserve 64-bit alignment */ +		add	r5, r5, #7 +		bic	r5, r5, #7 +		/* clamp to 32KB min and 1MB max */ +		cmp	r5, #(1 << 15) +		movlo	r5, #(1 << 15) +		cmp	r5, #(1 << 20) +		movhi	r5, #(1 << 20) +		/* temporarily relocate the stack past the DTB work space */ +		add	sp, sp, r5 +  		stmfd	sp!, {r0-r3, ip, lr}  		mov	r0, r8  		mov	r1, r6 -		sub	r2, sp, r6 +		mov	r2, r5  		bl	atags_to_fdt  		/* @@ -285,11 +306,11 @@ restart:	adr	r0, LC0  		bic	r0, r0, #1  		add	r0, r0, #0x100  		mov	r1, r6 -		sub	r2, sp, r6 +		mov	r2, r5  		bleq	atags_to_fdt  		ldmfd	sp!, {r0-r3, ip, lr} -		sub	sp, sp, #0x10000 +		sub	sp, sp, r5  #endif  		mov	r8, r6			@ use the appended device tree @@ -306,7 +327,7 @@ restart:	adr	r0, LC0  		subs	r1, r5, r1  		addhi	r9, r9, r1 -		/* Get the dtb's size */ +		/* Get the current DTB size */  		ldr	r5, [r6, #4]  #ifndef __ARMEB__  		/* convert r5 (dtb size) to little endian */ |