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
19coff_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
30optional_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
40extra_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 */
74section_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 */
109efi_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
121pe_header:
122	__EFI_PE_HEADER
123
124start:
125	.globl	start
126
127kernel_entaddr:
128	.quad	KERNEL_ENTRY
129	.globl	kernel_entaddr
130
131kernel_version:
132	.ascii  UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") " UTS_VERSION "\0"
133