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