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 */ 18struct 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 */ 43struct 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 57extern struct real_mode_header *real_mode_header; 58extern unsigned char real_mode_blob_end[]; 59 60extern unsigned long initial_code; 61extern unsigned long initial_gs; 62extern unsigned long initial_stack; 63#ifdef CONFIG_AMD_MEM_ENCRYPT 64extern unsigned long initial_vc_handler; 65#endif 66 67extern unsigned char real_mode_blob[]; 68extern unsigned char real_mode_relocs[]; 69 70#ifdef CONFIG_X86_32 71extern unsigned char startup_32_smp[]; 72extern unsigned char boot_gdt[]; 73#else 74extern unsigned char secondary_startup_64[]; 75extern unsigned char secondary_startup_64_no_verify[]; 76#endif 77 78static inline size_t real_mode_size_needed(void) 79{ 80 if (real_mode_header) 81 return 0; /* already allocated. */ 82 83 return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE); 84} 85 86static inline void set_real_mode_mem(phys_addr_t mem) 87{ 88 real_mode_header = (struct real_mode_header *) __va(mem); 89} 90 91void reserve_real_mode(void); 92 93#endif /* __ASSEMBLY__ */ 94 95#endif /* _ARCH_X86_REALMODE_H */ 96