mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 00:11:51 +01:00 
			
		
		
		
	The alignment of sections in the EFI binaries generated by U-Boot is incorrect. According to the PE-COFF specification [1] the minimum value for FileAlignment is 512. If the value of SectionAlignment is less then the page size, it must equal FileAlignment. Let's set both values to 512 for the ARM and RISC-V architectures. [1] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */
 | |
| /*
 | |
|  * crt0-efi-arm.S - PE/COFF header for ARM EFI applications
 | |
|  *
 | |
|  * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
 | |
|  *
 | |
|  * This file is taken and modified from the gnu-efi project.
 | |
|  */
 | |
| 
 | |
| #include <asm-generic/pe.h>
 | |
| 
 | |
| 	.section	.text.head
 | |
| 
 | |
| 	/*
 | |
| 	 * Magic "MZ" signature for PE/COFF
 | |
| 	 */
 | |
| 	.globl	image_base
 | |
| image_base:
 | |
| 	.short	IMAGE_DOS_SIGNATURE		/* 'MZ' */
 | |
| 	.skip	58				/* 'MZ' + pad + offset == 64 */
 | |
| 	.long	pe_header - image_base		/* Offset to the PE header */
 | |
| pe_header:
 | |
| 	.long	IMAGE_NT_SIGNATURE		/* 'PE' */
 | |
| coff_header:
 | |
| 	.short	IMAGE_FILE_MACHINE_THUMB	/* Mixed ARM/Thumb */
 | |
| 	.short	2				/* nr_sections */
 | |
| 	.long	0				/* TimeDateStamp */
 | |
| 	.long	0				/* PointerToSymbolTable */
 | |
| 	.long	0				/* NumberOfSymbols */
 | |
| 	.short	section_table - optional_header	/* SizeOfOptionalHeader */
 | |
| 	/* Characteristics */
 | |
| 	.short	(IMAGE_FILE_EXECUTABLE_IMAGE | \
 | |
| 		 IMAGE_FILE_LINE_NUMS_STRIPPED | \
 | |
| 		 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
 | |
| 		 IMAGE_FILE_32BIT_MACHINE | \
 | |
| 		 IMAGE_FILE_DEBUG_STRIPPED)
 | |
| optional_header:
 | |
| 	.short	IMAGE_NT_OPTIONAL_HDR32_MAGIC	/* PE32 format */
 | |
| 	.byte	0x02				/* MajorLinkerVersion */
 | |
| 	.byte	0x14				/* MinorLinkerVersion */
 | |
| 	.long	_edata - _start			/* SizeOfCode */
 | |
| 	.long	0				/* SizeOfInitializedData */
 | |
| 	.long	0				/* SizeOfUninitializedData */
 | |
| 	.long	_start - image_base		/* AddressOfEntryPoint */
 | |
| 	.long	_start - image_base		/* BaseOfCode */
 | |
| 	.long	0				/* BaseOfData */
 | |
| 
 | |
| extra_header_fields:
 | |
| 	.long	0				/* image_base */
 | |
| 	.long	0x200				/* SectionAlignment */
 | |
| 	.long	0x200				/* FileAlignment */
 | |
| 	.short	0				/* MajorOperatingSystemVersion */
 | |
| 	.short	0				/* MinorOperatingSystemVersion */
 | |
| 	.short	0				/* MajorImageVersion */
 | |
| 	.short	0				/* MinorImageVersion */
 | |
| 	.short	0				/* MajorSubsystemVersion */
 | |
| 	.short	0				/* MinorSubsystemVersion */
 | |
| 	.long	0				/* Win32VersionValue */
 | |
| 
 | |
| 	.long	_edata - image_base		/* SizeOfImage */
 | |
| 
 | |
| 	/*
 | |
| 	 * Everything before the kernel image is considered part of the header
 | |
| 	 */
 | |
| 	.long	_start - image_base		/* SizeOfHeaders */
 | |
| 	.long	0				/* CheckSum */
 | |
| 	.short	IMAGE_SUBSYSTEM_EFI_APPLICATION	/* Subsystem */
 | |
| 	.short	0				/* DllCharacteristics */
 | |
| 	.long	0				/* SizeOfStackReserve */
 | |
| 	.long	0				/* SizeOfStackCommit */
 | |
| 	.long	0				/* SizeOfHeapReserve */
 | |
| 	.long	0				/* SizeOfHeapCommit */
 | |
| 	.long	0				/* LoaderFlags */
 | |
| 	.long	0x6				/* NumberOfRvaAndSizes */
 | |
| 
 | |
| 	.quad	0				/* ExportTable */
 | |
| 	.quad	0				/* ImportTable */
 | |
| 	.quad	0				/* ResourceTable */
 | |
| 	.quad	0				/* ExceptionTable */
 | |
| 	.quad	0				/* CertificationTable */
 | |
| 	.quad	0				/* BaseRelocationTable */
 | |
| 
 | |
| section_table:
 | |
| 
 | |
| 	/*
 | |
| 	 * The EFI application loader requires a relocation section
 | |
| 	 * because EFI applications must be relocatable.  This is a
 | |
| 	 * dummy section as far as we are concerned.
 | |
| 	 */
 | |
| 	.ascii	".reloc"
 | |
| 	.byte	0
 | |
| 	.byte	0			/* end of 0 padding of section name */
 | |
| 	.long	0
 | |
| 	.long	0
 | |
| 	.long	0			/* SizeOfRawData */
 | |
| 	.long	0			/* PointerToRawData */
 | |
| 	.long	0			/* PointerToRelocations */
 | |
| 	.long	0			/* PointerToLineNumbers */
 | |
| 	.short	0			/* NumberOfRelocations */
 | |
| 	.short	0			/* NumberOfLineNumbers */
 | |
| 	.long	0x42100040		/* Characteristics (section flags) */
 | |
| 
 | |
| 	.ascii	".text"
 | |
| 	.byte	0
 | |
| 	.byte	0
 | |
| 	.byte	0			/* end of 0 padding of section name */
 | |
| 	.long	_edata - _start		/* VirtualSize */
 | |
| 	.long	_start - image_base	/* VirtualAddress */
 | |
| 	.long	_edata - _start		/* SizeOfRawData */
 | |
| 	.long	_start - image_base	/* PointerToRawData */
 | |
| 
 | |
| 	.long	0		/* PointerToRelocations (0 for executables) */
 | |
| 	.long	0		/* PointerToLineNumbers (0 for executables) */
 | |
| 	.short	0		/* NumberOfRelocations  (0 for executables) */
 | |
| 	.short	0		/* NumberOfLineNumbers  (0 for executables) */
 | |
| 	.long	0xe0500020	/* Characteristics (section flags) */
 | |
| 
 | |
| 	.align		9
 | |
| _start:
 | |
| 	stmfd		sp!, {r0-r2, lr}
 | |
| 
 | |
| 	adr		r1, .L_DYNAMIC
 | |
| 	ldr		r0, [r1]
 | |
| 	add		r1, r0, r1
 | |
| 	adr		r0, image_base
 | |
| 	bl		_relocate
 | |
| 	teq		r0, #0
 | |
| 	bne		0f
 | |
| 
 | |
| 	ldmfd		sp, {r0-r1}
 | |
| 	bl		efi_main
 | |
| 
 | |
| 0:	add		sp, sp, #12
 | |
| 	ldr		pc, [sp], #4
 | |
| 
 | |
| .L_DYNAMIC:
 | |
| 	.word		_DYNAMIC - .
 |