xref: /linux/arch/loongarch/include/asm/image.h (revision fb5bc347311b1d78dc608c91c2d68327b0a1d1d4)
130ade4feSYouling Tang /* SPDX-License-Identifier: GPL-2.0 */
230ade4feSYouling Tang /*
330ade4feSYouling Tang  * LoongArch binary image header for EFI(PE/COFF) format.
430ade4feSYouling Tang  *
530ade4feSYouling Tang  * Author: Youling Tang <tangyouling@kylinos.cn>
630ade4feSYouling Tang  * Copyright (C) 2025 KylinSoft Corporation.
730ade4feSYouling Tang  */
830ade4feSYouling Tang 
930ade4feSYouling Tang #ifndef __ASM_IMAGE_H
1030ade4feSYouling Tang #define __ASM_IMAGE_H
1130ade4feSYouling Tang 
1230ade4feSYouling Tang #ifndef __ASSEMBLER__
1330ade4feSYouling Tang 
1430ade4feSYouling Tang /**
1530ade4feSYouling Tang  * struct loongarch_image_header
1630ade4feSYouling Tang  *
1730ade4feSYouling Tang  * @dos_sig: Optional PE format 'MZ' signature.
1830ade4feSYouling Tang  * @padding_1: Reserved.
1930ade4feSYouling Tang  * @kernel_entry: Kernel image entry pointer.
2030ade4feSYouling Tang  * @kernel_asize: An estimated size of the memory image size in LSB byte order.
2130ade4feSYouling Tang  * @text_offset: The image load offset in LSB byte order.
2230ade4feSYouling Tang  * @padding_2: Reserved.
2330ade4feSYouling Tang  * @pe_header: Optional offset to a PE format header.
2430ade4feSYouling Tang  **/
2530ade4feSYouling Tang 
2630ade4feSYouling Tang struct loongarch_image_header {
2730ade4feSYouling Tang 	uint8_t dos_sig[2];
2830ade4feSYouling Tang 	uint16_t padding_1[3];
2930ade4feSYouling Tang 	uint64_t kernel_entry;
3030ade4feSYouling Tang 	uint64_t kernel_asize;
3130ade4feSYouling Tang 	uint64_t text_offset;
3230ade4feSYouling Tang 	uint32_t padding_2[7];
3330ade4feSYouling Tang 	uint32_t pe_header;
3430ade4feSYouling Tang };
3530ade4feSYouling Tang 
36*55d990f0SYouling Tang /*
37*55d990f0SYouling Tang  * loongarch_header_check_dos_sig - Helper to check the header
38*55d990f0SYouling Tang  *
39*55d990f0SYouling Tang  * Returns true (non-zero) if 'MZ' signature is found.
40*55d990f0SYouling Tang  */
41*55d990f0SYouling Tang 
loongarch_header_check_dos_sig(const struct loongarch_image_header * h)42*55d990f0SYouling Tang static inline int loongarch_header_check_dos_sig(const struct loongarch_image_header *h)
43*55d990f0SYouling Tang {
44*55d990f0SYouling Tang 	if (!h)
45*55d990f0SYouling Tang 		return 0;
46*55d990f0SYouling Tang 
47*55d990f0SYouling Tang 	return (h->dos_sig[0] == 'M' && h->dos_sig[1] == 'Z');
48*55d990f0SYouling Tang }
49*55d990f0SYouling Tang 
5030ade4feSYouling Tang #endif /* __ASSEMBLER__ */
5130ade4feSYouling Tang 
5230ade4feSYouling Tang #endif /* __ASM_IMAGE_H */
53