*** linux/arch/arm/boot/compressed/head.S
--- linux/arch/arm/boot/compressed/head.S
***************
*** 239,245 ****
   */
  		cmp	r4, r2
  		bhs	wont_overwrite
! 		add	r0, r4, #4096*1024	@ 4MB largest kernel size
  		cmp	r0, r5
  		bls	wont_overwrite
  
--- 239,246 ----
   */
  		cmp	r4, r2
  		bhs	wont_overwrite
! 		sub	r3, sp, r5		@ > compressed kernel size
! 		add	r0, r4, r3, lsl #2	@ allow for 4x expansion
  		cmp	r0, r5
  		bls	wont_overwrite
  
*** linux/arch/arm/kernel/head.S
--- linux/arch/arm/kernel/head.S
***************
*** 265,281 ****
  	/*
  	 * Now setup the pagetables for our kernel direct
  	 * mapped region.  We round TEXTADDR down to the
! 	 * nearest megabyte boundary.  It is assumed that
! 	 * the kernel fits within 4 contigous 1MB sections.
  	 */
  	add	r0, r4,  #(TEXTADDR & 0xff000000) >> 18	@ start of kernel
  	str	r3, [r0, #(TEXTADDR & 0x00f00000) >> 18]!
! 	add	r3, r3, #1 << 20
! 	str	r3, [r0, #4]!			@ KERNEL + 1MB
! 	add	r3, r3, #1 << 20
! 	str	r3, [r0, #4]!			@ KERNEL + 2MB
! 	add	r3, r3, #1 << 20
! 	str	r3, [r0, #4]			@ KERNEL + 3MB
  
  	/*
  	 * Then map first 1MB of ram in case it contains our boot params.
--- 265,282 ----
  	/*
  	 * Now setup the pagetables for our kernel direct
  	 * mapped region.  We round TEXTADDR down to the
! 	 * nearest megabyte boundary.
  	 */
  	add	r0, r4,  #(TEXTADDR & 0xff000000) >> 18	@ start of kernel
  	str	r3, [r0, #(TEXTADDR & 0x00f00000) >> 18]!
! 
! 	ldr	r6, =(_end - VIRT_OFFSET -1)	@ r6 = number of sections
! 	mov	r6, r6, lsr #20			@ needed for kernel minus 1
! 
! 1:	add	r3, r3, #1 << 20
! 	str	r3, [r0, #4]!
! 	subs	r6, r6, #1
! 	bgt	1b
  
  	/*
  	 * Then map first 1MB of ram in case it contains our boot params.
