1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2013 - 2017 Linaro, Ltd.
4  * Copyright (C) 2013, 2014 Red Hat, Inc.
5  * Copyright (C) 2020, 2021 Loongson, Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #include <linux/pe.h>
13 #include <linux/sizes.h>
14 #include <generated/utsrelease.h>
15 #include <generated/compile.h>
16 
17 	.macro	__EFI_PE_HEADER
18 	.long	PE_MAGIC
19 coff_header:
20 	.short	IMAGE_FILE_MACHINE_LOONGARCH		/* Machine */
21 	.short	section_count				/* NumberOfSections */
22 	.long	0 					/* TimeDateStamp */
23 	.long	0					/* PointerToSymbolTable */
24 	.long	0					/* NumberOfSymbols */
25 	.short	section_table - optional_header		/* SizeOfOptionalHeader */
26 	.short	IMAGE_FILE_DEBUG_STRIPPED | \
27 		IMAGE_FILE_EXECUTABLE_IMAGE | \
28 		IMAGE_FILE_LINE_NUMS_STRIPPED		/* Characteristics */
29 
30 optional_header:
31 	.short	PE_OPT_MAGIC_PE32PLUS			/* PE32+ format */
32 	.byte	0x02					/* MajorLinkerVersion */
33 	.byte	0x14					/* MinorLinkerVersion */
34 	.long	_data - efi_header_end			/* SizeOfCode */
35 	.long	_end - _data				/* SizeOfInitializedData */
36 	.long	0					/* SizeOfUninitializedData */
37 	.long	efi_pe_entry - _text			/* AddressOfEntryPoint */
38 	.long	efi_header_end - _text			/* BaseOfCode */
39 
40 extra_header_fields:
41 	.quad	0					/* ImageBase */
42 	.long	PECOFF_SEGMENT_ALIGN			/* SectionAlignment */
43 	.long	PECOFF_FILE_ALIGN			/* FileAlignment */
44 	.short	0					/* MajorOperatingSystemVersion */
45 	.short	0					/* MinorOperatingSystemVersion */
46 	.short	LINUX_EFISTUB_MAJOR_VERSION		/* MajorImageVersion */
47 	.short	LINUX_EFISTUB_MINOR_VERSION		/* MinorImageVersion */
48 	.short	0					/* MajorSubsystemVersion */
49 	.short	0					/* MinorSubsystemVersion */
50 	.long	0					/* Win32VersionValue */
51 
52 	.long	_end - _text				/* SizeOfImage */
53 
54 	/* Everything before the kernel image is considered part of the header */
55 	.long	efi_header_end - _head			/* SizeOfHeaders */
56 	.long	0					/* CheckSum */
57 	.short	IMAGE_SUBSYSTEM_EFI_APPLICATION		/* Subsystem */
58 	.short	0					/* DllCharacteristics */
59 	.quad	0					/* SizeOfStackReserve */
60 	.quad	0					/* SizeOfStackCommit */
61 	.quad	0					/* SizeOfHeapReserve */
62 	.quad	0					/* SizeOfHeapCommit */
63 	.long	0					/* LoaderFlags */
64 	.long	(section_table - .) / 8			/* NumberOfRvaAndSizes */
65 
66 	.quad	0					/* ExportTable */
67 	.quad	0					/* ImportTable */
68 	.quad	0					/* ResourceTable */
69 	.quad	0					/* ExceptionTable */
70 	.quad	0					/* CertificationTable */
71 	.quad	0					/* BaseRelocationTable */
72 
73 	/* Section table */
74 section_table:
75 	.ascii	".text\0\0\0"
76 	.long	_data - efi_header_end			/* VirtualSize */
77 	.long	efi_header_end - _text			/* VirtualAddress */
78 	.long	_data - efi_header_end			/* SizeOfRawData */
79 	.long	efi_header_end - _text			/* PointerToRawData */
80 
81 	.long	0					/* PointerToRelocations */
82 	.long	0					/* PointerToLineNumbers */
83 	.short	0					/* NumberOfRelocations */
84 	.short	0					/* NumberOfLineNumbers */
85 	.long	IMAGE_SCN_CNT_CODE | \
86 		IMAGE_SCN_MEM_READ | \
87 		IMAGE_SCN_MEM_EXECUTE			/* Characteristics */
88 
89 	.ascii	".data\0\0\0"
90 	.long	_end - _data				/* VirtualSize */
91 	.long	_data - _text				/* VirtualAddress */
92 	.long	_edata - _data				/* SizeOfRawData */
93 	.long	_data - _text				/* PointerToRawData */
94 
95 	.long	0					/* PointerToRelocations */
96 	.long	0					/* PointerToLineNumbers */
97 	.short	0					/* NumberOfRelocations */
98 	.short	0					/* NumberOfLineNumbers */
99 	.long	IMAGE_SCN_CNT_INITIALIZED_DATA | \
100 		IMAGE_SCN_MEM_READ | \
101 		IMAGE_SCN_MEM_WRITE			/* Characteristics */
102 
103 	.org 0x20e
104 	.word kernel_version - 512 -  _head
105 
106 	.set	section_count, (. - section_table) / 40
107 
108 	.balign	0x10000					/* PECOFF_SEGMENT_ALIGN */
109 efi_header_end:
110 	.endm
111 
112 	.section ".head.text","ax"
113 _head:
114 	/* "MZ", MS-DOS header */
115 	.byte 	0x4d
116 	.byte 	0x5a
117 	.org	0x3c
118 	/* Offset to the PE header */
119 	.long	pe_header - _head
120 
121 pe_header:
122 	__EFI_PE_HEADER
123 
124 start:
125 	.globl	start
126 
127 kernel_entaddr:
128 	.quad	KERNEL_ENTRY
129 	.globl	kernel_entaddr
130 
131 kernel_version:
132 	.ascii  UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") " UTS_VERSION "\0"
133