Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ARCH_X86_REALMODE_H
0003 #define _ARCH_X86_REALMODE_H
0004 
0005 /*
0006  * Flag bit definitions for use with the flags field of the trampoline header
0007  * in the CONFIG_X86_64 variant.
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 /* This must match data at realmode/rm/header.S */
0018 struct real_mode_header {
0019     u32 text_start;
0020     u32 ro_end;
0021     /* SMP trampoline */
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     /* ACPI S3 wakeup */
0032 #ifdef CONFIG_ACPI_SLEEP
0033     u32 wakeup_start;
0034     u32 wakeup_header;
0035 #endif
0036     /* APM/BIOS reboot */
0037     u32 machine_real_restart_asm;
0038 #ifdef CONFIG_X86_64
0039     u32 machine_real_restart_seg;
0040 #endif
0041 };
0042 
0043 /* This must match data at realmode/rm/trampoline_{32,64}.S */
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;   /* already allocated. */
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 /* __ASSEMBLY__ */
0096 
0097 #endif /* _ARCH_X86_REALMODE_H */