Line data Source code
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_pgd; 29 : #endif 30 : /* ACPI S3 wakeup */ 31 : #ifdef CONFIG_ACPI_SLEEP 32 : u32 wakeup_start; 33 : u32 wakeup_header; 34 : #endif 35 : /* APM/BIOS reboot */ 36 : u32 machine_real_restart_asm; 37 : #ifdef CONFIG_X86_64 38 : u32 machine_real_restart_seg; 39 : #endif 40 : }; 41 : 42 : /* This must match data at realmode/rm/trampoline_{32,64}.S */ 43 : struct trampoline_header { 44 : #ifdef CONFIG_X86_32 45 : u32 start; 46 : u16 gdt_pad; 47 : u16 gdt_limit; 48 : u32 gdt_base; 49 : #else 50 : u64 start; 51 : u64 efer; 52 : u32 cr4; 53 : u32 flags; 54 : #endif 55 : }; 56 : 57 : extern struct real_mode_header *real_mode_header; 58 : extern unsigned char real_mode_blob_end[]; 59 : 60 : extern unsigned long initial_code; 61 : extern unsigned long initial_gs; 62 : extern unsigned long initial_stack; 63 : #ifdef CONFIG_AMD_MEM_ENCRYPT 64 : extern unsigned long initial_vc_handler; 65 : #endif 66 : 67 : extern unsigned char real_mode_blob[]; 68 : extern unsigned char real_mode_relocs[]; 69 : 70 : #ifdef CONFIG_X86_32 71 : extern unsigned char startup_32_smp[]; 72 : extern unsigned char boot_gdt[]; 73 : #else 74 : extern unsigned char secondary_startup_64[]; 75 : extern unsigned char secondary_startup_64_no_verify[]; 76 : #endif 77 : 78 1 : static inline size_t real_mode_size_needed(void) 79 : { 80 1 : if (real_mode_header) 81 : return 0; /* already allocated. */ 82 : 83 1 : return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE); 84 : } 85 : 86 1 : static inline void set_real_mode_mem(phys_addr_t mem) 87 : { 88 1 : real_mode_header = (struct real_mode_header *) __va(mem); 89 : } 90 : 91 : void reserve_real_mode(void); 92 : 93 : #endif /* __ASSEMBLY__ */ 94 : 95 : #endif /* _ARCH_X86_REALMODE_H */