xref: /openbmc/linux/arch/x86/include/asm/realmode.h (revision bf5ff276448f64f1f9ef9ffc9e231026e3887d3d)
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 
17957a227dSSean 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;
24*bf5ff276SJoerg Roedel #ifdef CONFIG_AMD_MEM_ENCRYPT
25*bf5ff276SJoerg Roedel 	u32	sev_es_trampoline_start;
26*bf5ff276SJoerg Roedel #endif
27f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_64
28f37240f1SJarkko Sakkinen 	u32	trampoline_pgd;
2948927bbbSJarkko Sakkinen #endif
30f37240f1SJarkko Sakkinen 	/* ACPI S3 wakeup */
31c9b77ccbSJarkko Sakkinen #ifdef CONFIG_ACPI_SLEEP
32c9b77ccbSJarkko Sakkinen 	u32	wakeup_start;
33c9b77ccbSJarkko Sakkinen 	u32	wakeup_header;
34c9b77ccbSJarkko Sakkinen #endif
35f37240f1SJarkko Sakkinen 	/* APM/BIOS reboot */
36f37240f1SJarkko Sakkinen 	u32	machine_real_restart_asm;
3765051397SH. Peter Anvin #ifdef CONFIG_X86_64
3865051397SH. Peter Anvin 	u32	machine_real_restart_seg;
39f37240f1SJarkko Sakkinen #endif
40cda846f1SJarkko Sakkinen };
41f37240f1SJarkko Sakkinen 
42957a227dSSean Christopherson /* This must match data at realmode/rm/trampoline_{32,64}.S */
43f37240f1SJarkko Sakkinen struct trampoline_header {
44f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_32
45f37240f1SJarkko Sakkinen 	u32 start;
46cda846f1SJarkko Sakkinen 	u16 gdt_pad;
47f37240f1SJarkko Sakkinen 	u16 gdt_limit;
48f37240f1SJarkko Sakkinen 	u32 gdt_base;
49f37240f1SJarkko Sakkinen #else
50f37240f1SJarkko Sakkinen 	u64 start;
51638d957bSH. Peter Anvin 	u64 efer;
52cda846f1SJarkko Sakkinen 	u32 cr4;
5346d010e0STom Lendacky 	u32 flags;
54f37240f1SJarkko Sakkinen #endif
55cda846f1SJarkko Sakkinen };
56084ee1c6SJarkko Sakkinen 
57b429dbf6SJarkko Sakkinen extern struct real_mode_header *real_mode_header;
58b429dbf6SJarkko Sakkinen extern unsigned char real_mode_blob_end[];
59084ee1c6SJarkko Sakkinen 
60084ee1c6SJarkko Sakkinen extern unsigned long initial_code;
61084ee1c6SJarkko Sakkinen extern unsigned long initial_gs;
62b32f96c7SJosh Poimboeuf extern unsigned long initial_stack;
631aa9aa8eSJoerg Roedel #ifdef CONFIG_AMD_MEM_ENCRYPT
641aa9aa8eSJoerg Roedel extern unsigned long initial_vc_handler;
651aa9aa8eSJoerg Roedel #endif
66084ee1c6SJarkko Sakkinen 
67084ee1c6SJarkko Sakkinen extern unsigned char real_mode_blob[];
68084ee1c6SJarkko Sakkinen extern unsigned char real_mode_relocs[];
69084ee1c6SJarkko Sakkinen 
7048927bbbSJarkko Sakkinen #ifdef CONFIG_X86_32
7148927bbbSJarkko Sakkinen extern unsigned char startup_32_smp[];
7248927bbbSJarkko Sakkinen extern unsigned char boot_gdt[];
7348927bbbSJarkko Sakkinen #else
7448927bbbSJarkko Sakkinen extern unsigned char secondary_startup_64[];
7548927bbbSJarkko Sakkinen #endif
7648927bbbSJarkko Sakkinen 
775ff3e2c3SAndy Lutomirski static inline size_t real_mode_size_needed(void)
785ff3e2c3SAndy Lutomirski {
795ff3e2c3SAndy Lutomirski 	if (real_mode_header)
805ff3e2c3SAndy Lutomirski 		return 0;	/* already allocated. */
815ff3e2c3SAndy Lutomirski 
825ff3e2c3SAndy Lutomirski 	return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE);
835ff3e2c3SAndy Lutomirski }
845ff3e2c3SAndy Lutomirski 
85f560bd19SMatteo Croce static inline void set_real_mode_mem(phys_addr_t mem)
86f560bd19SMatteo Croce {
87f560bd19SMatteo Croce 	real_mode_header = (struct real_mode_header *) __va(mem);
88f560bd19SMatteo Croce }
89f560bd19SMatteo Croce 
904f7b9226SYinghai Lu void reserve_real_mode(void);
91084ee1c6SJarkko Sakkinen 
9246d010e0STom Lendacky #endif /* __ASSEMBLY__ */
9346d010e0STom Lendacky 
94084ee1c6SJarkko Sakkinen #endif /* _ARCH_X86_REALMODE_H */
95