xref: /openbmc/linux/arch/x86/include/asm/realmode.h (revision 957a227d413b06130b7d57d1954d821edf6991c1)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2084ee1c6SJarkko Sakkinen #ifndef _ARCH_X86_REALMODE_H
3084ee1c6SJarkko Sakkinen #define _ARCH_X86_REALMODE_H
4084ee1c6SJarkko Sakkinen 
546d010e0STom Lendacky /*
646d010e0STom Lendacky  * Flag bit definitions for use with the flags field of the trampoline header
746d010e0STom Lendacky  * in the CONFIG_X86_64 variant.
846d010e0STom Lendacky  */
946d010e0STom Lendacky #define TH_FLAGS_SME_ACTIVE_BIT		0
1046d010e0STom Lendacky #define TH_FLAGS_SME_ACTIVE		BIT(TH_FLAGS_SME_ACTIVE_BIT)
1146d010e0STom Lendacky 
1246d010e0STom Lendacky #ifndef __ASSEMBLY__
1346d010e0STom Lendacky 
14084ee1c6SJarkko Sakkinen #include <linux/types.h>
15084ee1c6SJarkko Sakkinen #include <asm/io.h>
16084ee1c6SJarkko Sakkinen 
17*957a227dSSean Christopherson /* This must match data at realmode/rm/header.S */
18084ee1c6SJarkko Sakkinen struct real_mode_header {
19084ee1c6SJarkko Sakkinen 	u32	text_start;
20084ee1c6SJarkko Sakkinen 	u32	ro_end;
2148927bbbSJarkko Sakkinen 	/* SMP trampoline */
22f37240f1SJarkko Sakkinen 	u32	trampoline_start;
23f37240f1SJarkko Sakkinen 	u32	trampoline_header;
24f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_64
25f37240f1SJarkko Sakkinen 	u32	trampoline_pgd;
2648927bbbSJarkko Sakkinen #endif
27f37240f1SJarkko Sakkinen 	/* ACPI S3 wakeup */
28c9b77ccbSJarkko Sakkinen #ifdef CONFIG_ACPI_SLEEP
29c9b77ccbSJarkko Sakkinen 	u32	wakeup_start;
30c9b77ccbSJarkko Sakkinen 	u32	wakeup_header;
31c9b77ccbSJarkko Sakkinen #endif
32f37240f1SJarkko Sakkinen 	/* APM/BIOS reboot */
33f37240f1SJarkko Sakkinen 	u32	machine_real_restart_asm;
3465051397SH. Peter Anvin #ifdef CONFIG_X86_64
3565051397SH. Peter Anvin 	u32	machine_real_restart_seg;
36f37240f1SJarkko Sakkinen #endif
37cda846f1SJarkko Sakkinen };
38f37240f1SJarkko Sakkinen 
39*957a227dSSean Christopherson /* This must match data at realmode/rm/trampoline_{32,64}.S */
40f37240f1SJarkko Sakkinen struct trampoline_header {
41f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_32
42f37240f1SJarkko Sakkinen 	u32 start;
43cda846f1SJarkko Sakkinen 	u16 gdt_pad;
44f37240f1SJarkko Sakkinen 	u16 gdt_limit;
45f37240f1SJarkko Sakkinen 	u32 gdt_base;
46f37240f1SJarkko Sakkinen #else
47f37240f1SJarkko Sakkinen 	u64 start;
48638d957bSH. Peter Anvin 	u64 efer;
49cda846f1SJarkko Sakkinen 	u32 cr4;
5046d010e0STom Lendacky 	u32 flags;
51f37240f1SJarkko Sakkinen #endif
52cda846f1SJarkko Sakkinen };
53084ee1c6SJarkko Sakkinen 
54b429dbf6SJarkko Sakkinen extern struct real_mode_header *real_mode_header;
55b429dbf6SJarkko Sakkinen extern unsigned char real_mode_blob_end[];
56084ee1c6SJarkko Sakkinen 
57084ee1c6SJarkko Sakkinen extern unsigned long initial_code;
58084ee1c6SJarkko Sakkinen extern unsigned long initial_gs;
59b32f96c7SJosh Poimboeuf extern unsigned long initial_stack;
60084ee1c6SJarkko Sakkinen 
61084ee1c6SJarkko Sakkinen extern unsigned char real_mode_blob[];
62084ee1c6SJarkko Sakkinen extern unsigned char real_mode_relocs[];
63084ee1c6SJarkko Sakkinen 
6448927bbbSJarkko Sakkinen #ifdef CONFIG_X86_32
6548927bbbSJarkko Sakkinen extern unsigned char startup_32_smp[];
6648927bbbSJarkko Sakkinen extern unsigned char boot_gdt[];
6748927bbbSJarkko Sakkinen #else
6848927bbbSJarkko Sakkinen extern unsigned char secondary_startup_64[];
6948927bbbSJarkko Sakkinen #endif
7048927bbbSJarkko Sakkinen 
715ff3e2c3SAndy Lutomirski static inline size_t real_mode_size_needed(void)
725ff3e2c3SAndy Lutomirski {
735ff3e2c3SAndy Lutomirski 	if (real_mode_header)
745ff3e2c3SAndy Lutomirski 		return 0;	/* already allocated. */
755ff3e2c3SAndy Lutomirski 
765ff3e2c3SAndy Lutomirski 	return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE);
775ff3e2c3SAndy Lutomirski }
785ff3e2c3SAndy Lutomirski 
79f560bd19SMatteo Croce static inline void set_real_mode_mem(phys_addr_t mem)
80f560bd19SMatteo Croce {
81f560bd19SMatteo Croce 	real_mode_header = (struct real_mode_header *) __va(mem);
82f560bd19SMatteo Croce }
83f560bd19SMatteo Croce 
844f7b9226SYinghai Lu void reserve_real_mode(void);
85084ee1c6SJarkko Sakkinen 
8646d010e0STom Lendacky #endif /* __ASSEMBLY__ */
8746d010e0STom Lendacky 
88084ee1c6SJarkko Sakkinen #endif /* _ARCH_X86_REALMODE_H */
89