BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4172 This patch moves the TDX APs nasm code from SecEntry.nasm to IntelTdxAPs.nasm. IntelTdxX64 and OvmfPkgX64 use the same nasm so that it can be easier to be managed. In the following patch there will be AcceptMemory related changes in IntelTdxAPs.nasm. Cc: Erdem Aktas <erdemaktas@google.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Min Xu <min.m.xu@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
104 lines
3.3 KiB
NASM
104 lines
3.3 KiB
NASM
;------------------------------------------------------------------------------
|
|
;*
|
|
;* Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
|
;* SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;*
|
|
;* CpuAsm.asm
|
|
;*
|
|
;* Abstract:
|
|
;*
|
|
;------------------------------------------------------------------------------
|
|
|
|
#include <Base.h>
|
|
|
|
DEFAULT REL
|
|
SECTION .text
|
|
|
|
extern ASM_PFX(SecCoreStartupWithStack)
|
|
|
|
%macro tdcall 0
|
|
db 0x66, 0x0f, 0x01, 0xcc
|
|
%endmacro
|
|
|
|
;
|
|
; SecCore Entry Point
|
|
;
|
|
; Processor is in flat protected mode
|
|
;
|
|
; @param[in] RAX Initial value of the EAX register (BIST: Built-in Self Test)
|
|
; @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
|
|
; @param[in] RBP Pointer to the start of the Boot Firmware Volume
|
|
; @param[in] DS Selector allowing flat access to all addresses
|
|
; @param[in] ES Selector allowing flat access to all addresses
|
|
; @param[in] FS Selector allowing flat access to all addresses
|
|
; @param[in] GS Selector allowing flat access to all addresses
|
|
; @param[in] SS Selector allowing flat access to all addresses
|
|
;
|
|
; @return None This routine does not return
|
|
;
|
|
global ASM_PFX(_ModuleEntryPoint)
|
|
ASM_PFX(_ModuleEntryPoint):
|
|
|
|
;
|
|
; Guest type is stored in OVMF_WORK_AREA
|
|
;
|
|
%define OVMF_WORK_AREA FixedPcdGet32 (PcdOvmfWorkAreaBase)
|
|
%define VM_GUEST_TYPE_TDX 2
|
|
mov eax, OVMF_WORK_AREA
|
|
cmp byte[eax], VM_GUEST_TYPE_TDX
|
|
jne InitStack
|
|
|
|
%define TDCALL_TDINFO 1
|
|
mov rax, TDCALL_TDINFO
|
|
tdcall
|
|
|
|
;
|
|
; R8 [31:0] NUM_VCPUS
|
|
; [63:32] MAX_VCPUS
|
|
; R9 [31:0] VCPU_INDEX
|
|
; Td Guest set the VCPU0 as the BSP, others are the APs
|
|
; APs jump to spinloop and get released by DXE's MpInitLib
|
|
;
|
|
mov rax, r9
|
|
and rax, 0xffff
|
|
test rax, rax
|
|
jz InitStack
|
|
mov rsp, FixedPcdGet32 (PcdOvmfSecGhcbBackupBase)
|
|
jmp ParkAp
|
|
|
|
InitStack:
|
|
|
|
;
|
|
; Fill the temporary RAM with the initial stack value.
|
|
; The loop below will seed the heap as well, but that's harmless.
|
|
;
|
|
mov rax, (FixedPcdGet32 (PcdInitValueInTempStack) << 32) | FixedPcdGet32 (PcdInitValueInTempStack)
|
|
; qword to store
|
|
mov rdi, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) ; base address,
|
|
; relative to
|
|
; ES
|
|
mov rcx, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) / 8 ; qword count
|
|
cld ; store from base
|
|
; up
|
|
rep stosq
|
|
|
|
;
|
|
; Load temporary RAM stack based on PCDs
|
|
;
|
|
%define SEC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
|
|
FixedPcdGet32 (PcdOvmfSecPeiTempRamSize))
|
|
mov rsp, SEC_TOP_OF_STACK
|
|
nop
|
|
|
|
;
|
|
; Setup parameters and call SecCoreStartupWithStack
|
|
; rcx: BootFirmwareVolumePtr
|
|
; rdx: TopOfCurrentStack
|
|
;
|
|
mov rcx, rbp
|
|
mov rdx, rsp
|
|
sub rsp, 0x20
|
|
call ASM_PFX(SecCoreStartupWithStack)
|
|
|
|
%include "../../IntelTdx/Sec/X64/IntelTdxAPs.nasm"
|