0001
0002 #ifndef _ARCH_X86_REALMODE_H
0003 #define _ARCH_X86_REALMODE_H
0004
0005
0006
0007
0008
0009 #define TH_FLAGS_SME_ACTIVE_BIT 0
0010 #define TH_FLAGS_SME_ACTIVE BIT(TH_FLAGS_SME_ACTIVE_BIT)
0011
0012 #ifndef __ASSEMBLY__
0013
0014 #include <linux/types.h>
0015 #include <asm/io.h>
0016
0017
0018 struct real_mode_header {
0019 u32 text_start;
0020 u32 ro_end;
0021
0022 u32 trampoline_start;
0023 u32 trampoline_header;
0024 #ifdef CONFIG_AMD_MEM_ENCRYPT
0025 u32 sev_es_trampoline_start;
0026 #endif
0027 #ifdef CONFIG_X86_64
0028 u32 trampoline_start64;
0029 u32 trampoline_pgd;
0030 #endif
0031
0032 #ifdef CONFIG_ACPI_SLEEP
0033 u32 wakeup_start;
0034 u32 wakeup_header;
0035 #endif
0036
0037 u32 machine_real_restart_asm;
0038 #ifdef CONFIG_X86_64
0039 u32 machine_real_restart_seg;
0040 #endif
0041 };
0042
0043
0044 struct trampoline_header {
0045 #ifdef CONFIG_X86_32
0046 u32 start;
0047 u16 gdt_pad;
0048 u16 gdt_limit;
0049 u32 gdt_base;
0050 #else
0051 u64 start;
0052 u64 efer;
0053 u32 cr4;
0054 u32 flags;
0055 #endif
0056 };
0057
0058 extern struct real_mode_header *real_mode_header;
0059 extern unsigned char real_mode_blob_end[];
0060
0061 extern unsigned long initial_code;
0062 extern unsigned long initial_gs;
0063 extern unsigned long initial_stack;
0064 #ifdef CONFIG_AMD_MEM_ENCRYPT
0065 extern unsigned long initial_vc_handler;
0066 #endif
0067
0068 extern unsigned char real_mode_blob[];
0069 extern unsigned char real_mode_relocs[];
0070
0071 #ifdef CONFIG_X86_32
0072 extern unsigned char startup_32_smp[];
0073 extern unsigned char boot_gdt[];
0074 #else
0075 extern unsigned char secondary_startup_64[];
0076 extern unsigned char secondary_startup_64_no_verify[];
0077 #endif
0078
0079 static inline size_t real_mode_size_needed(void)
0080 {
0081 if (real_mode_header)
0082 return 0;
0083
0084 return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE);
0085 }
0086
0087 static inline void set_real_mode_mem(phys_addr_t mem)
0088 {
0089 real_mode_header = (struct real_mode_header *) __va(mem);
0090 }
0091
0092 void reserve_real_mode(void);
0093 void load_trampoline_pgtable(void);
0094
0095 #endif
0096
0097 #endif