/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */
/*
 * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
 * Copright (C) 2018 Alexander Graf <agraf@suse.de>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice and this list of conditions, without modification.
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or (at your option) any later version.
 */

#ifndef EFI_SUBSYSTEM
#define EFI_SUBSYSTEM 10
#endif

	.section	.text.head

	/*
	 * Magic "MZ" signature for PE/COFF
	 */
	.globl	ImageBase
ImageBase:
	.ascii	"MZ"
	.skip	58				// 'MZ' + pad + offset == 64
	.4byte	pe_header - ImageBase		// Offset to the PE header.
pe_header:
	.ascii	"PE"
	.2byte 	0
coff_header:
	.2byte	0x5064				// riscv64
	.2byte	4				// nr_sections
	.4byte	0 				// TimeDateStamp
	.4byte	0				// PointerToSymbolTable
	.4byte	0				// NumberOfSymbols
	.2byte	section_table - optional_header	// SizeOfOptionalHeader
	.2byte	0x206				// Characteristics.
						// IMAGE_FILE_DEBUG_STRIPPED |
						// IMAGE_FILE_EXECUTABLE_IMAGE |
						// IMAGE_FILE_LINE_NUMS_STRIPPED
optional_header:
	.2byte	0x20b				// PE32+ format
	.byte	0x02				// MajorLinkerVersion
	.byte	0x14				// MinorLinkerVersion
	.4byte	_text_size - ImageBase		// SizeOfCode
	.4byte	_alldata_size - ImageBase		// SizeOfInitializedData
	.4byte	0				// SizeOfUninitializedData
	.4byte	_start - ImageBase		// AddressOfEntryPoint
	.4byte	_text - ImageBase		// BaseOfCode

extra_header_fields:
	.8byte	0				// ImageBase
	.4byte	0x1000				// SectionAlignment
	.4byte	0x1000				// FileAlignment
	.2byte	0				// MajorOperatingSystemVersion
	.2byte	0				// MinorOperatingSystemVersion
	.2byte	0				// MajorImageVersion
	.2byte	0				// MinorImageVersion
	.2byte	0				// MajorSubsystemVersion
	.2byte	0				// MinorSubsystemVersion
	.4byte	0				// Win32VersionValue

	.4byte	_image_end - ImageBase		// SizeOfImage

	// Everything before the kernel image is considered part of the header
	.4byte	_text - ImageBase		// SizeOfHeaders
	.4byte	0				// CheckSum
	.2byte	EFI_SUBSYSTEM			// Subsystem
	.2byte	0				// DllCharacteristics
	.8byte	0				// SizeOfStackReserve
	.8byte	0				// SizeOfStackCommit
	.8byte	0				// SizeOfHeapReserve
	.8byte	0				// SizeOfHeapCommit
	.4byte	0				// LoaderFlags
	.4byte	0x10				// NumberOfRvaAndSizes

	.8byte	0				// ExportTable
	.8byte	0				// ImportTable
	.8byte	0				// ResourceTable
	.8byte	0				// ExceptionTable
	.8byte	0				// CertificationTable
	.4byte	_reloc - ImageBase				// BaseRelocationTable (VirtualAddress)
	.4byte	_reloc_vsize - ImageBase				// BaseRelocationTable (Size)
	.8byte	0				// Debug
	.8byte	0				// Architecture
	.8byte	0				// Global Ptr
	.8byte	0				// TLS Table
	.8byte	0				// Load Config Table
	.8byte	0				// Bound Import
	.8byte	0				// IAT
	.8byte	0				// Delay Import Descriptor
	.8byte	0				// CLR Runtime Header
	.8byte	0				// Reserved, must be zero

	// Section table
section_table:

	.ascii	".text\0\0\0"
	.4byte	_text_vsize - ImageBase		// VirtualSize
	.4byte	_text - ImageBase	// VirtualAddress
	.4byte	_text_size - ImageBase		// SizeOfRawData
	.4byte	_text - ImageBase	// PointerToRawData
	.4byte	0		// PointerToRelocations (0 for executables)
	.4byte	0		// PointerToLineNumbers (0 for executables)
	.2byte	0		// NumberOfRelocations  (0 for executables)
	.2byte	0		// NumberOfLineNumbers  (0 for executables)
	.4byte	0x60000020	// Characteristics (section flags)

	/*
	 * 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\0\0"
	.4byte	_reloc_vsize - ImageBase			// VirtualSize
	.4byte	_reloc - ImageBase			// VirtualAddress
	.4byte	_reloc_size - ImageBase			// SizeOfRawData
	.4byte	_reloc - ImageBase			// PointerToRawData
	.4byte	0			// PointerToRelocations
	.4byte	0			// PointerToLineNumbers
	.2byte	0			// NumberOfRelocations
	.2byte	0			// NumberOfLineNumbers
	.4byte	0x42000040		// Characteristics (section flags)

	.ascii	".data\0\0\0"
	.4byte	_data_vsize - ImageBase			// VirtualSize
	.4byte	_data - ImageBase			// VirtualAddress
	.4byte	_data_size - ImageBase			// SizeOfRawData
	.4byte	_data - ImageBase			// PointerToRawData
	.4byte	0			// PointerToRelocations
	.4byte	0			// PointerToLineNumbers
	.2byte	0			// NumberOfRelocations
	.2byte	0			// NumberOfLineNumbers
	.4byte	0xC0000040		// Characteristics (section flags)

	.ascii	".rodata\0"
	.4byte	_rodata_vsize - ImageBase			// VirtualSize
	.4byte	_rodata - ImageBase			// VirtualAddress
	.4byte	_rodata_size - ImageBase			// SizeOfRawData
	.4byte	_rodata - ImageBase			// PointerToRawData
	.4byte	0			// PointerToRelocations
	.4byte	0			// PointerToLineNumbers
	.2byte	0			// NumberOfRelocations
	.2byte	0			// NumberOfLineNumbers
	.4byte	0x40000040		// Characteristics (section flags)

	.text
	.globl _start
	.type _start,%function
_start:
	addi		sp, sp, -24
	sd		a0, 0(sp)
	sd		a1, 8(sp)
	sd		ra, 16(sp)
	lla		a0, ImageBase
	lla		a1, _DYNAMIC
	call		_relocate
	bne		a0, zero, 0f
	ld		a1, 8(sp)
	ld		a0, 0(sp)

	/* Switch to our own stack */
	mv		a2, sp
	la		sp, stacktop
	mv		fp, zero
	push_fp zero
	addi		sp, sp, -16
	sd		a2, 0(sp)

	call		efi_main

	/* Restore sp */
	ld		sp, 0(sp)

	ld		ra, 16(sp)
0:	addi		sp, sp, 24
	ret

// hand-craft a dummy .reloc section so EFI knows it's a relocatable executable:
 
 	.data

.balign 16384
.space 16384
stacktop:

dummy:	.4byte	0

#define IMAGE_REL_ABSOLUTE	0
 	.section .reloc, "a"
label1:
	.4byte	dummy-label1				// Page RVA
	.4byte	12					// Block Size (2*4+2*2), must be aligned by 32 Bits
	.2byte	(IMAGE_REL_ABSOLUTE<<12) +  0		// reloc for dummy
	.2byte	(IMAGE_REL_ABSOLUTE<<12) +  0		// reloc for dummy

#if defined(__ELF__) && defined(__linux__)
	.section .note.GNU-stack,"",%progbits
#endif
