mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-22 18:44:44 +08:00
ff2e64684f
Historically, x86 platforms have booted secondary processors (APs) using INIT followed by the start up IPI (SIPI) messages. In regular VMs, this boot sequence is supported by the VMM emulation. But such a wakeup model is fatal for secure VMs like TDX in which VMM is an untrusted entity. To address this issue, a new wakeup model was added in ACPI v6.4, in which firmware (like TDX virtual BIOS) will help boot the APs. More details about this wakeup model can be found in ACPI specification v6.4, the section titled "Multiprocessor Wakeup Structure". Since the existing trampoline code requires processors to boot in real mode with 16-bit addressing, it will not work for this wakeup model (because it boots the AP in 64-bit mode). To handle it, extend the trampoline code to support 64-bit mode firmware handoff. Also, extend IDT and GDT pointers to support 64-bit mode hand off. There is no TDX-specific detection for this new boot method. The kernel will rely on it as the sole boot method whenever the new ACPI structure is present. The ACPI table parser for the MADT multiprocessor wake up structure and the wakeup method that uses this structure will be added by the following patch in this series. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/20220405232939.73860-21-kirill.shutemov@linux.intel.com
46 lines
1.0 KiB
ArmAsm
46 lines
1.0 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Real-mode blob header; this should match realmode.h and be
|
|
* readonly; for mutable data instead add pointers into the .data
|
|
* or .bss sections as appropriate.
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/page_types.h>
|
|
#include <asm/segment.h>
|
|
|
|
#include "realmode.h"
|
|
|
|
.section ".header", "a"
|
|
|
|
.balign 16
|
|
SYM_DATA_START(real_mode_header)
|
|
.long pa_text_start
|
|
.long pa_ro_end
|
|
/* SMP trampoline */
|
|
.long pa_trampoline_start
|
|
.long pa_trampoline_header
|
|
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
|
.long pa_sev_es_trampoline_start
|
|
#endif
|
|
#ifdef CONFIG_X86_64
|
|
.long pa_trampoline_start64
|
|
.long pa_trampoline_pgd;
|
|
#endif
|
|
/* ACPI S3 wakeup */
|
|
#ifdef CONFIG_ACPI_SLEEP
|
|
.long pa_wakeup_start
|
|
.long pa_wakeup_header
|
|
#endif
|
|
/* APM/BIOS reboot */
|
|
.long pa_machine_real_restart_asm
|
|
#ifdef CONFIG_X86_64
|
|
.long __KERNEL32_CS
|
|
#endif
|
|
SYM_DATA_END(real_mode_header)
|
|
|
|
/* End signature, used to verify integrity */
|
|
.section ".signature","a"
|
|
.balign 4
|
|
SYM_DATA(end_signature, .long REALMODE_END_SIGNATURE)
|