mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 12:08:19 +00:00 
			
		
		
		
	The fields SizeOfCode, SizeOfInitializedData, and SizeOfUninitializedData are define in the PE-COFF specification [1]. * SizeOfCode must match the size of all .text sections. * SizeOfInitializedData must match the size of all .data sections. * SizeOfUninitializedData must match the size of all .bss sections. We only have one .text and one .data section. SizeOfCode and SizeOfInitializedData have to be calculated as the difference between the end and the start of the respective section. As we don't have any .bss sections in the generated EFI binaries. SizeOfUninitializedData must remain 0. [1] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
		
			
				
	
	
		
			201 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ */
 | |
| /*
 | |
|  * crt0-efi-riscv.S - PE/COFF header for RISC-V EFI applications
 | |
|  *
 | |
|  * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
 | |
|  * Copright (C) 2018 Alexander Graf <agraf@suse.de>
 | |
|  *
 | |
|  * This file is inspired by arch/arm/lib/crt0_aarch64_efi.S
 | |
|  */
 | |
| 
 | |
| #include <asm-generic/pe.h>
 | |
| 
 | |
| #if __riscv_xlen == 64
 | |
| #define SIZE_LONG	8
 | |
| #define SAVE_LONG(reg, idx)	sd	reg, (idx*SIZE_LONG)(sp)
 | |
| #define LOAD_LONG(reg, idx)	ld	reg, (idx*SIZE_LONG)(sp)
 | |
| #define PE_MACHINE	IMAGE_FILE_MACHINE_RISCV64
 | |
| #define PE_MAGIC    IMAGE_NT_OPTIONAL_HDR64_MAGIC
 | |
| #define IMG_CHARACTERISTICS \
 | |
| 	(IMAGE_FILE_EXECUTABLE_IMAGE | \
 | |
| 	 IMAGE_FILE_LINE_NUMS_STRIPPED | \
 | |
| 	 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
 | |
| 	 IMAGE_FILE_LARGE_ADDRESS_AWARE | \
 | |
| 	 IMAGE_FILE_DEBUG_STRIPPED)
 | |
| #else
 | |
| #define SIZE_LONG	4
 | |
| #define SAVE_LONG(reg, idx)	sw	reg, (idx*SIZE_LONG)(sp)
 | |
| #define LOAD_LONG(reg, idx)	lw	reg, (idx*SIZE_LONG)(sp)
 | |
| #define PE_MACHINE	IMAGE_FILE_MACHINE_RISCV32
 | |
| #define PE_MAGIC    IMAGE_NT_OPTIONAL_HDR32_MAGIC
 | |
| #define IMG_CHARACTERISTICS \
 | |
| 	(IMAGE_FILE_EXECUTABLE_IMAGE | \
 | |
| 	 IMAGE_FILE_LINE_NUMS_STRIPPED | \
 | |
| 	 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
 | |
| 	 IMAGE_FILE_DEBUG_STRIPPED)
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 	.section	.text.head
 | |
| 
 | |
| 	/*
 | |
| 	 * Magic "MZ" signature for PE/COFF
 | |
| 	 */
 | |
| 	.globl	ImageBase
 | |
| ImageBase:
 | |
| 	.short	IMAGE_DOS_SIGNATURE		/* 'MZ' */
 | |
| 	.skip	46				/* 'MZ' + pad + offset == 64 */
 | |
| 	.long	0x43534952			/* Linux magic "RISCV */
 | |
| 	.long	0x00000056
 | |
| 	.long	0x05435352			/* Linux magic2 "RSC\x05*/
 | |
| 	.long	pe_header - ImageBase		/* Offset to the PE header */
 | |
| pe_header:
 | |
| 	.long	IMAGE_NT_SIGNATURE		/* 'PE' */
 | |
| coff_header:
 | |
| 	.short	PE_MACHINE			/* RISC-V 64/32-bit */
 | |
| 	.short	3				/* nr_sections */
 | |
| 	.long	0				/* TimeDateStamp */
 | |
| 	.long	0				/* PointerToSymbolTable */
 | |
| 	.long	0				/* NumberOfSymbols */
 | |
| 	.short	section_table - optional_header	/* SizeOfOptionalHeader */
 | |
| 	.short	IMG_CHARACTERISTICS		/* Characteristics */
 | |
| optional_header:
 | |
| 	.short	PE_MAGIC			/* PE32(+) format */
 | |
| 	.byte	0x02				/* MajorLinkerVersion */
 | |
| 	.byte	0x14				/* MinorLinkerVersion */
 | |
| 	.long	_etext - _start			/* SizeOfCode */
 | |
| 	.long	_data_size			/* SizeOfInitializedData */
 | |
| 	.long	0				/* SizeOfUninitializedData */
 | |
| 	.long	_start - ImageBase		/* AddressOfEntryPoint */
 | |
| 	.long	_start - ImageBase		/* BaseOfCode */
 | |
| #if __riscv_xlen == 32
 | |
| 	.long	0				/* BaseOfData */
 | |
| #endif
 | |
| 
 | |
| extra_header_fields:
 | |
| #if __riscv_xlen == 32
 | |
| 	.long	0				/* ImageBase */
 | |
| #else
 | |
| 	.quad	0				/* ImageBase */
 | |
| #endif
 | |
| 	.long	0x200				/* SectionAlignment */
 | |
| 	.long	0x200				/* FileAlignment */
 | |
| 	.short	0				/* MajorOperatingSystemVersion */
 | |
| 	.short	0				/* MinorOperatingSystemVersion */
 | |
| 	.short	1				/* MajorImageVersion */
 | |
| 	.short	0				/* MinorImageVersion */
 | |
| 	.short	0				/* MajorSubsystemVersion */
 | |
| 	.short	0				/* MinorSubsystemVersion */
 | |
| 	.long	0				/* Win32VersionValue */
 | |
| 
 | |
| 	.long	_edata - ImageBase		/* SizeOfImage */
 | |
| 
 | |
| 	/*
 | |
| 	 * Everything before the kernel image is considered part of the header
 | |
| 	 */
 | |
| 	.long	_start - ImageBase		/* SizeOfHeaders */
 | |
| 	.long	0				/* CheckSum */
 | |
| 	.short	IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
 | |
| #if CONFIG_VENDOR_EFI
 | |
| 	.short	0				/* DllCharacteristics */
 | |
| #else
 | |
| 	.short	IMAGE_DLLCHARACTERISTICS_NX_COMPAT
 | |
| #endif
 | |
| #if __riscv_xlen == 32
 | |
| 	.long	0				/* SizeOfStackReserve */
 | |
| 	.long	0				/* SizeOfStackCommit */
 | |
| 	.long	0				/* SizeOfHeapReserve */
 | |
| 	.long	0				/* SizeOfHeapCommit */
 | |
| #else
 | |
| 	.quad	0				/* SizeOfStackReserve */
 | |
| 	.quad	0				/* SizeOfStackCommit */
 | |
| 	.quad	0				/* SizeOfHeapReserve */
 | |
| 	.quad	0				/* SizeOfHeapCommit */
 | |
| #endif
 | |
| 	.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 */
 | |
| 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	_etext - _start		/* VirtualSize */
 | |
| 	.long	_start - ImageBase	/* VirtualAddress */
 | |
| 	.long	_etext - _start		/* SizeOfRawData */
 | |
| 	.long	_start - ImageBase	/* 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) */
 | |
| 	/* Characteristics (section flags) */
 | |
| 	.long	(IMAGE_SCN_MEM_READ | \
 | |
| 		 IMAGE_SCN_MEM_EXECUTE | \
 | |
| 		 IMAGE_SCN_CNT_CODE)
 | |
| 
 | |
| 	.ascii	".data"
 | |
| 	.byte	0
 | |
| 	.byte	0
 | |
| 	.byte	0			/* end of 0 padding of section name */
 | |
| 	.long	_edata - _data		/* VirtualSize */
 | |
| 	.long	_data - ImageBase	/* VirtualAddress */
 | |
| 	.long	_edata - _data		/* SizeOfRawData */
 | |
| 	.long	_data - ImageBase	/* PointerToRawData */
 | |
| 	.long	0			/* PointerToRelocations */
 | |
| 	.long	0			/* PointerToLineNumbers */
 | |
| 	.short	0			/* NumberOfRelocations */
 | |
| 	.short	0			/* NumberOfLineNumbers */
 | |
| 	/* Characteristics (section flags) */
 | |
| 	.long	(IMAGE_SCN_MEM_WRITE | \
 | |
| 		 IMAGE_SCN_MEM_READ | \
 | |
| 		 IMAGE_SCN_CNT_INITIALIZED_DATA)
 | |
| 
 | |
| 	.align		12
 | |
| _start:
 | |
| 	addi		sp, sp, -(SIZE_LONG * 3)
 | |
| 	SAVE_LONG(a0, 0)
 | |
| 	SAVE_LONG(a1, 1)
 | |
| 	SAVE_LONG(ra, 2)
 | |
| 
 | |
| 	lla		a0, ImageBase
 | |
| 	lla		a1, _DYNAMIC
 | |
| 	call		_relocate
 | |
| 	bne		a0, zero, 0f
 | |
| 
 | |
| 	LOAD_LONG(a1, 1)
 | |
| 	LOAD_LONG(a0, 0)
 | |
| 	call		efi_main
 | |
| 
 | |
| 	LOAD_LONG(ra, 2)
 | |
| 
 | |
| 0:	addi		sp, sp, (SIZE_LONG * 3)
 | |
| 	ret
 |