;------------------------------------------------------------------------------ ; ; Copyright (c) 2021, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Module Name: ; ; ApRunLoop.nasm ; ; Abstract: ; ; This is the assembly code for run loop for APs in the guest TD ; ;------------------------------------------------------------------------------- %include "TdxCommondefs.inc" DEFAULT REL SECTION .text BITS 64 %define TDVMCALL_EXPOSE_REGS_MASK 0xffcc %define TDVMCALL 0x0 %define EXIT_REASON_CPUID 0xa %macro tdcall 0 db 0x66, 0x0f, 0x01, 0xcc %endmacro %macro tdcall_regs_preamble 2 mov rax, %1 xor rcx, rcx mov ecx, %2 ; R10 = 0 (standard TDVMCALL) xor r10d, r10d ; Zero out unused (for standard TDVMCALL) registers to avoid leaking ; secrets to the VMM. xor esi, esi xor edi, edi xor edx, edx xor ebp, ebp xor r8d, r8d xor r9d, r9d xor r14, r14 xor r15, r15 %endmacro ; ; Relocated Ap Mailbox loop ; ; @param[in] RBX: Relocated mailbox address ; @param[in] RBP: vCpuId ; ; @return None This routine does not return ; global ASM_PFX(AsmRelocateApMailBoxLoop) ASM_PFX(AsmRelocateApMailBoxLoop): AsmRelocateApMailBoxLoopStart: mov r11, EXIT_REASON_CPUID mov r12, 0xb tdcall_regs_preamble TDVMCALL, TDVMCALL_EXPOSE_REGS_MASK tdcall test r10, r10 jnz Panic mov r8, r15 MailBoxLoop: ; Spin until command set cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandNoop je MailBoxLoop ; Determine if this is a broadcast or directly for my apic-id, if not, ignore cmp dword [rbx + ApicidOffset], MailboxApicidBroadcast je MailBoxProcessCommand cmp dword [rbx + ApicidOffset], r8d jne MailBoxLoop MailBoxProcessCommand: cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandWakeup je MailBoxWakeUp cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandSleep je MailBoxSleep ; Don't support this command, so ignore jmp MailBoxLoop MailBoxWakeUp: mov rax, [rbx + WakeupVectorOffset] ; OS sends a wakeup command for a given APIC ID, firmware is supposed to reset ; the command field back to zero as acknowledgement. mov qword [rbx + CommandOffset], 0 jmp rax MailBoxSleep: jmp $ Panic: ud2 BITS 64 AsmRelocateApMailBoxLoopEnd: ;------------------------------------------------------------------------------------- ; AsmGetRelocationMap (&RelocationMap); ;------------------------------------------------------------------------------------- global ASM_PFX(AsmGetRelocationMap) ASM_PFX(AsmGetRelocationMap): lea rax, [AsmRelocateApMailBoxLoopStart] mov qword [rcx], rax mov qword [rcx + 8h], AsmRelocateApMailBoxLoopEnd - AsmRelocateApMailBoxLoopStart ret