]>
Commit | Line | Data |
---|---|---|
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 | |
19 | ParkAp:\r | |
20 | \r | |
21 | do_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 |