]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/IntelTdx/Sec/X64/IntelTdxAPs.nasm
OvmfPkg: Enable APs to accept memory for TDVF
[mirror_edk2.git] / OvmfPkg / IntelTdx / Sec / X64 / IntelTdxAPs.nasm
CommitLineData
0547ffbf
MX
1;------------------------------------------------------------------------------\r
2; @file\r
3; Intel TDX APs\r
4;\r
5; Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved.<BR>\r
6; SPDX-License-Identifier: BSD-2-Clause-Patent\r
7;\r
8;------------------------------------------------------------------------------\r
9\r
10%include "TdxCommondefs.inc"\r
11\r
12 ;\r
13 ; Note: BSP never gets here. APs will be unblocked by DXE\r
14 ;\r
15 ; R8 [31:0] NUM_VCPUS\r
16 ; [63:32] MAX_VCPUS\r
17 ; R9 [31:0] VCPU_INDEX\r
18 ;\r
19ParkAp:\r
20\r
21do_wait_loop:\r
22 ;\r
23 ; register itself in [rsp + CpuArrivalOffset]\r
24 ;\r
25 mov rax, 1\r
26 lock xadd dword [rsp + CpuArrivalOffset], eax\r
27 inc eax\r
28\r
29.check_arrival_cnt:\r
30 cmp eax, r8d\r
31 je .check_command\r
32 mov eax, dword[rsp + CpuArrivalOffset]\r
33 jmp .check_arrival_cnt\r
34\r
35.check_command:\r
36 mov eax, dword[rsp + CommandOffset]\r
37 cmp eax, MpProtectedModeWakeupCommandNoop\r
38 je .check_command\r
39\r
40 cmp eax, MpProtectedModeWakeupCommandWakeup\r
41 je .do_wakeup\r
42\r
c55cf3f7
MX
43 cmp eax, MpProtectedModeWakeupCommandAcceptPages\r
44 je .do_accept_pages\r
45\r
0547ffbf
MX
46 ; Don't support this command, so ignore\r
47 jmp .check_command\r
48\r
c55cf3f7
MX
49.do_accept_pages:\r
50 ;\r
51 ; Read the top stack address from arguments\r
52 mov rsi, [rsp + AcceptPageArgsTopStackAddress]\r
53\r
54 ;\r
55 ; Calculate the top stack address of the AP.\r
56 ; ApStackAddr = BaseStackAddr + (vCpuIndex) * ApStackSize\r
57 xor rdx, rdx\r
58 xor rbx, rbx\r
59 xor rax, rax\r
60 mov eax, [rsp + AcceptPageArgsApStackSize]\r
61 mov ebx, r9d ; vCpuIndex\r
62 mul ebx\r
63 add rsi, rax ; now rsi is ApStackAddr\r
64\r
65.start_accept_pages:\r
66 ;\r
67 ; Read the function address which will be called\r
68 mov rax, [rsp + WakeupVectorOffset]\r
69\r
70 ;\r
71 ; vCPU index as the first argument\r
72 mov ecx, r9d\r
73 mov rdx, [rsp + AcceptPageArgsPhysicalStart]\r
74 mov r8, [rsp + AcceptPageArgsPhysicalEnd]\r
75\r
76 ; save the Mailbox address to rbx\r
77 mov rbx, rsp\r
78\r
79 ;\r
80 ; set AP Stack\r
81 mov rsp, rsi\r
82 nop\r
83\r
84 ; save rax (the Mailbox address)\r
85 push rbx\r
86\r
87 call rax\r
88\r
89 ; recove rsp\r
90 pop rbx\r
91 mov rsp, rbx\r
92 ;\r
93 ; recover r8, r9\r
94 mov rax, 1\r
95 tdcall\r
96\r
97 mov eax, 0FFFFFFFFh\r
98 lock xadd dword [rsp + CpusExitingOffset], eax\r
99 dec eax\r
100\r
101.check_exiting_cnt:\r
102 cmp eax, 0\r
103 je do_wait_loop\r
104 mov eax, dword[rsp + CpusExitingOffset]\r
105 jmp .check_exiting_cnt\r
106\r
0547ffbf
MX
107.do_wakeup:\r
108 ;\r
109 ; BSP sets these variables before unblocking APs\r
110 ; RAX: WakeupVectorOffset\r
111 ; RBX: Relocated mailbox address\r
112 ; RBP: vCpuId\r
113 ;\r
114 mov rax, 0\r
115 mov eax, dword[rsp + WakeupVectorOffset]\r
116 mov rbx, [rsp + WakeupArgsRelocatedMailBox]\r
117 nop\r
118 jmp rax\r
119 jmp $\r