xref: /openbmc/linux/arch/x86/include/asm/realmode.h (revision 46d010e04a637ca5bbdd0ff72554d9c06f2961c9)
1084ee1c6SJarkko Sakkinen #ifndef _ARCH_X86_REALMODE_H
2084ee1c6SJarkko Sakkinen #define _ARCH_X86_REALMODE_H
3084ee1c6SJarkko Sakkinen 
4*46d010e0STom Lendacky /*
5*46d010e0STom Lendacky  * Flag bit definitions for use with the flags field of the trampoline header
6*46d010e0STom Lendacky  * in the CONFIG_X86_64 variant.
7*46d010e0STom Lendacky  */
8*46d010e0STom Lendacky #define TH_FLAGS_SME_ACTIVE_BIT		0
9*46d010e0STom Lendacky #define TH_FLAGS_SME_ACTIVE		BIT(TH_FLAGS_SME_ACTIVE_BIT)
10*46d010e0STom Lendacky 
11*46d010e0STom Lendacky #ifndef __ASSEMBLY__
12*46d010e0STom Lendacky 
13084ee1c6SJarkko Sakkinen #include <linux/types.h>
14084ee1c6SJarkko Sakkinen #include <asm/io.h>
15084ee1c6SJarkko Sakkinen 
16084ee1c6SJarkko Sakkinen /* This must match data at realmode.S */
17084ee1c6SJarkko Sakkinen struct real_mode_header {
18084ee1c6SJarkko Sakkinen 	u32	text_start;
19084ee1c6SJarkko Sakkinen 	u32	ro_end;
2048927bbbSJarkko Sakkinen 	/* SMP trampoline */
21f37240f1SJarkko Sakkinen 	u32	trampoline_start;
2248927bbbSJarkko Sakkinen 	u32	trampoline_status;
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 
39f37240f1SJarkko Sakkinen /* This must match data at 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;
50*46d010e0STom 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 
795ff3e2c3SAndy Lutomirski void set_real_mode_mem(phys_addr_t mem, size_t size);
804f7b9226SYinghai Lu void reserve_real_mode(void);
81084ee1c6SJarkko Sakkinen 
82*46d010e0STom Lendacky #endif /* __ASSEMBLY__ */
83*46d010e0STom Lendacky 
84084ee1c6SJarkko Sakkinen #endif /* _ARCH_X86_REALMODE_H */
85