1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ARCH_X86_REALMODE_H 3 #define _ARCH_X86_REALMODE_H 4 5 /* 6 * Flag bit definitions for use with the flags field of the trampoline header 7 * in the CONFIG_X86_64 variant. 8 */ 9 #define TH_FLAGS_SME_ACTIVE_BIT 0 10 #define TH_FLAGS_SME_ACTIVE BIT(TH_FLAGS_SME_ACTIVE_BIT) 11 12 #ifndef __ASSEMBLY__ 13 14 #include <linux/types.h> 15 #include <asm/io.h> 16 17 /* This must match data at realmode/rm/header.S */ 18 struct real_mode_header { 19 u32 text_start; 20 u32 ro_end; 21 /* SMP trampoline */ 22 u32 trampoline_start; 23 u32 trampoline_header; 24 #ifdef CONFIG_AMD_MEM_ENCRYPT 25 u32 sev_es_trampoline_start; 26 #endif 27 #ifdef CONFIG_X86_64 28 u32 trampoline_start64; 29 u32 trampoline_pgd; 30 #endif 31 /* ACPI S3 wakeup */ 32 #ifdef CONFIG_ACPI_SLEEP 33 u32 wakeup_start; 34 u32 wakeup_header; 35 #endif 36 /* APM/BIOS reboot */ 37 u32 machine_real_restart_asm; 38 #ifdef CONFIG_X86_64 39 u32 machine_real_restart_seg; 40 #endif 41 }; 42 43 /* This must match data at realmode/rm/trampoline_{32,64}.S */ 44 struct trampoline_header { 45 #ifdef CONFIG_X86_32 46 u32 start; 47 u16 gdt_pad; 48 u16 gdt_limit; 49 u32 gdt_base; 50 #else 51 u64 start; 52 u64 efer; 53 u32 cr4; 54 u32 flags; 55 u32 lock; 56 #endif 57 }; 58 59 extern struct real_mode_header *real_mode_header; 60 extern unsigned char real_mode_blob_end[]; 61 62 extern unsigned long initial_code; 63 extern unsigned long initial_stack; 64 #ifdef CONFIG_AMD_MEM_ENCRYPT 65 extern unsigned long initial_vc_handler; 66 #endif 67 68 extern u32 *trampoline_lock; 69 70 extern unsigned char real_mode_blob[]; 71 extern unsigned char real_mode_relocs[]; 72 73 #ifdef CONFIG_X86_32 74 extern unsigned char startup_32_smp[]; 75 extern unsigned char boot_gdt[]; 76 #else 77 extern unsigned char secondary_startup_64[]; 78 extern unsigned char secondary_startup_64_no_verify[]; 79 #endif 80 81 static inline size_t real_mode_size_needed(void) 82 { 83 if (real_mode_header) 84 return 0; /* already allocated. */ 85 86 return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE); 87 } 88 89 static inline void set_real_mode_mem(phys_addr_t mem) 90 { 91 real_mode_header = (struct real_mode_header *) __va(mem); 92 } 93 94 void reserve_real_mode(void); 95 void load_trampoline_pgtable(void); 96 void init_real_mode(void); 97 98 #endif /* __ASSEMBLY__ */ 99 100 #endif /* _ARCH_X86_REALMODE_H */ 101