linux/arch/x86/include/asm/realmode.h
<<
>>
Prefs
   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