forked from mirrors/linux
		
	ARM: 8677/1: boot/compressed: fix decompressor header layout for v7-M
As reported by Patrice, the header layout of the decompressor is incorrect when building for v7-M. In this case, the __nop macro resolves to 'mov r0, r0', which is emitted as a narrow encoding, resulting in the header data fields to end up at lower offsets than required. Given the variety of targets we need to support with the same code, the startup sequence is a bit of a jumble, and uses instructions and macros whose encoding widths cannot be specified (badr), or only exist in a narrow encoding (bx) So force the use of a wide encoding in __nop, and replace the start sequence with a simple jump to the label marking the start of code, preceded by a Thumb2 mode switch if required (using explicit wide encodings where appropriate). The label itself can be moved to the start of code [where it belongs] due to the larger range of branch instructions as compared to adr instructions. Reported-by: Patrice CHOTARD <patrice.chotard@st.com> Acked-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
This commit is contained in:
		
							parent
							
								
									7ef4783e19
								
							
						
					
					
						commit
						06a4b6d009
					
				
					 2 changed files with 11 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -17,14 +17,12 @@
 | 
			
		|||
		@ there.
 | 
			
		||||
		.inst	'M' | ('Z' << 8) | (0x1310 << 16)   @ tstne r0, #0x4d000
 | 
			
		||||
#else
 | 
			
		||||
		mov	r0, r0
 | 
			
		||||
		W(mov)	r0, r0
 | 
			
		||||
#endif
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
		.macro	__EFI_HEADER
 | 
			
		||||
#ifdef CONFIG_EFI_STUB
 | 
			
		||||
		b	__efi_start
 | 
			
		||||
 | 
			
		||||
		.set	start_offset, __efi_start - start
 | 
			
		||||
		.org	start + 0x3c
 | 
			
		||||
		@
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,19 +130,22 @@ start:
 | 
			
		|||
		.rept	7
 | 
			
		||||
		__nop
 | 
			
		||||
		.endr
 | 
			
		||||
   ARM(		mov	r0, r0		)
 | 
			
		||||
   ARM(		b	1f		)
 | 
			
		||||
 THUMB(		badr	r12, 1f		)
 | 
			
		||||
 THUMB(		bx	r12		)
 | 
			
		||||
#ifndef CONFIG_THUMB2_KERNEL
 | 
			
		||||
		mov	r0, r0
 | 
			
		||||
#else
 | 
			
		||||
 AR_CLASS(	sub	pc, pc, #3	)	@ A/R: switch to Thumb2 mode
 | 
			
		||||
  M_CLASS(	nop.w			)	@ M: already in Thumb2 mode
 | 
			
		||||
		.thumb
 | 
			
		||||
#endif
 | 
			
		||||
		W(b)	1f
 | 
			
		||||
 | 
			
		||||
		.word	_magic_sig	@ Magic numbers to help the loader
 | 
			
		||||
		.word	_magic_start	@ absolute load/run zImage address
 | 
			
		||||
		.word	_magic_end	@ zImage end address
 | 
			
		||||
		.word	0x04030201	@ endianness flag
 | 
			
		||||
 | 
			
		||||
 THUMB(		.thumb			)
 | 
			
		||||
1:		__EFI_HEADER
 | 
			
		||||
 | 
			
		||||
		__EFI_HEADER
 | 
			
		||||
1:
 | 
			
		||||
 ARM_BE8(	setend	be		)	@ go BE8 if compiled for BE8
 | 
			
		||||
 AR_CLASS(	mrs	r9, cpsr	)
 | 
			
		||||
#ifdef CONFIG_ARM_VIRT_EXT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue