xref: /openbmc/linux/arch/x86/include/asm/realmode.h (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
1*b2441318SGreg 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 
17084ee1c6SJarkko Sakkinen /* This must match data at realmode.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;
2348927bbbSJarkko Sakkinen 	u32	trampoline_status;
24f37240f1SJarkko Sakkinen 	u32	trampoline_header;
25f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_64
26f37240f1SJarkko Sakkinen 	u32	trampoline_pgd;
2748927bbbSJarkko Sakkinen #endif
28f37240f1SJarkko Sakkinen 	/* ACPI S3 wakeup */
29c9b77ccbSJarkko Sakkinen #ifdef CONFIG_ACPI_SLEEP
30c9b77ccbSJarkko Sakkinen 	u32	wakeup_start;
31c9b77ccbSJarkko Sakkinen 	u32	wakeup_header;
32c9b77ccbSJarkko Sakkinen #endif
33f37240f1SJarkko Sakkinen 	/* APM/BIOS reboot */
34f37240f1SJarkko Sakkinen 	u32	machine_real_restart_asm;
3565051397SH. Peter Anvin #ifdef CONFIG_X86_64
3665051397SH. Peter Anvin 	u32	machine_real_restart_seg;
37f37240f1SJarkko Sakkinen #endif
38cda846f1SJarkko Sakkinen };
39f37240f1SJarkko Sakkinen 
40f37240f1SJarkko Sakkinen /* This must match data at trampoline_32/64.S */
41f37240f1SJarkko Sakkinen struct trampoline_header {
42f37240f1SJarkko Sakkinen #ifdef CONFIG_X86_32
43f37240f1SJarkko Sakkinen 	u32 start;
44cda846f1SJarkko Sakkinen 	u16 gdt_pad;
45f37240f1SJarkko Sakkinen 	u16 gdt_limit;
46f37240f1SJarkko Sakkinen 	u32 gdt_base;
47f37240f1SJarkko Sakkinen #else
48f37240f1SJarkko Sakkinen 	u64 start;
49638d957bSH. Peter Anvin 	u64 efer;
50cda846f1SJarkko Sakkinen 	u32 cr4;
5146d010e0STom Lendacky 	u32 flags;
52f37240f1SJarkko Sakkinen #endif
53cda846f1SJarkko Sakkinen };
54084ee1c6SJarkko Sakkinen 
55b429dbf6SJarkko Sakkinen extern struct real_mode_header *real_mode_header;
56b429dbf6SJarkko Sakkinen extern unsigned char real_mode_blob_end[];
57084ee1c6SJarkko Sakkinen 
58084ee1c6SJarkko Sakkinen extern unsigned long initial_code;
59084ee1c6SJarkko Sakkinen extern unsigned long initial_gs;
60b32f96c7SJosh Poimboeuf extern unsigned long initial_stack;
61084ee1c6SJarkko Sakkinen 
62084ee1c6SJarkko Sakkinen extern unsigned char real_mode_blob[];
63084ee1c6SJarkko Sakkinen extern unsigned char real_mode_relocs[];
64084ee1c6SJarkko Sakkinen 
6548927bbbSJarkko Sakkinen #ifdef CONFIG_X86_32
6648927bbbSJarkko Sakkinen extern unsigned char startup_32_smp[];
6748927bbbSJarkko Sakkinen extern unsigned char boot_gdt[];
6848927bbbSJarkko Sakkinen #else
6948927bbbSJarkko Sakkinen extern unsigned char secondary_startup_64[];
7048927bbbSJarkko Sakkinen #endif
7148927bbbSJarkko Sakkinen 
725ff3e2c3SAndy Lutomirski static inline size_t real_mode_size_needed(void)
735ff3e2c3SAndy Lutomirski {
745ff3e2c3SAndy Lutomirski 	if (real_mode_header)
755ff3e2c3SAndy Lutomirski 		return 0;	/* already allocated. */
765ff3e2c3SAndy Lutomirski 
775ff3e2c3SAndy Lutomirski 	return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE);
785ff3e2c3SAndy Lutomirski }
795ff3e2c3SAndy Lutomirski 
805ff3e2c3SAndy Lutomirski void set_real_mode_mem(phys_addr_t mem, size_t size);
814f7b9226SYinghai Lu void reserve_real_mode(void);
82084ee1c6SJarkko Sakkinen 
8346d010e0STom Lendacky #endif /* __ASSEMBLY__ */
8446d010e0STom Lendacky 
85084ee1c6SJarkko Sakkinen #endif /* _ARCH_X86_REALMODE_H */
86