]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm
MdePkg: Support IoFifo for Tdx guest in BaseIoLibIntrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / X64 / IoFifoSev.nasm
CommitLineData
b6d11d7c
LD
1;------------------------------------------------------------------------------\r
2;\r
3; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
4; Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
5;\r
9344f092 6; SPDX-License-Identifier: BSD-2-Clause-Patent\r
b6d11d7c
LD
7;\r
8;------------------------------------------------------------------------------\r
9\r
10 DEFAULT REL\r
11 SECTION .text\r
12\r
13;------------------------------------------------------------------------------\r
14; Check whether we need to unroll the String I/O in SEV guest\r
15;\r
16; Return // eax (1 - unroll, 0 - no unroll)\r
17;------------------------------------------------------------------------------\r
18global ASM_PFX(SevNoRepIo)\r
19ASM_PFX(SevNoRepIo):\r
20\r
21 ; CPUID clobbers ebx, ecx and edx\r
22 push rbx\r
23 push rcx\r
24 push rdx\r
25\r
26 ; Check if we are runing under hypervisor\r
27 ; CPUID(1).ECX Bit 31\r
28 mov eax, 1\r
29 cpuid\r
30 bt ecx, 31\r
31 jnc @UseRepIo\r
32\r
33 ; Check if we have Memory encryption CPUID leaf\r
34 mov eax, 0x80000000\r
35 cpuid\r
36 cmp eax, 0x8000001f\r
37 jl @UseRepIo\r
38\r
39 ; Check for memory encryption feature:\r
40 ; CPUID Fn8000_001F[EAX] - Bit 1\r
41 ;\r
42 mov eax, 0x8000001f\r
43 cpuid\r
44 bt eax, 1\r
45 jnc @UseRepIo\r
46\r
47 ; Check if memory encryption is enabled\r
48 ; MSR_0xC0010131 - Bit 0 (SEV enabled)\r
49 ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)\r
50 mov ecx, 0xc0010131\r
51 rdmsr\r
52\r
53 ; Check for (SevEsEnabled == 0 && SevEnabled == 1)\r
54 and eax, 3\r
55 cmp eax, 1\r
56 je @SevNoRepIo_Done\r
57\r
58@UseRepIo:\r
59 xor eax, eax\r
60\r
61@SevNoRepIo_Done:\r
62 pop rdx\r
63 pop rcx\r
64 pop rbx\r
65 ret\r
66\r
67;------------------------------------------------------------------------------\r
68; VOID\r
69; EFIAPI\r
d74e9326 70; SevIoReadFifo8 (\r
b6d11d7c
LD
71; IN UINTN Port, // rcx\r
72; IN UINTN Size, // rdx\r
73; OUT VOID *Buffer // r8\r
74; );\r
75;------------------------------------------------------------------------------\r
d74e9326
MX
76global ASM_PFX(SevIoReadFifo8)\r
77ASM_PFX(SevIoReadFifo8):\r
b6d11d7c
LD
78 xchg rcx, rdx\r
79 xchg rdi, r8 ; rdi: buffer address; r8: save rdi\r
80\r
81 ; Check if we need to unroll String I/O\r
82 call ASM_PFX(SevNoRepIo)\r
83 test eax, eax\r
84 jnz @IoReadFifo8_NoRep\r
85\r
86 cld\r
87 rep insb\r
88 jmp @IoReadFifo8_Done\r
89\r
90@IoReadFifo8_NoRep:\r
91 jrcxz @IoReadFifo8_Done\r
92\r
93@IoReadFifo8_Loop:\r
94 in al, dx\r
95 mov byte [rdi], al\r
96 inc rdi\r
97 loop @IoReadFifo8_Loop\r
98\r
99@IoReadFifo8_Done:\r
100 mov rdi, r8 ; restore rdi\r
101 ret\r
102\r
103;------------------------------------------------------------------------------\r
104; VOID\r
105; EFIAPI\r
d74e9326 106; SevIoReadFifo16 (\r
b6d11d7c
LD
107; IN UINTN Port, // rcx\r
108; IN UINTN Size, // rdx\r
109; OUT VOID *Buffer // r8\r
110; );\r
111;------------------------------------------------------------------------------\r
d74e9326
MX
112global ASM_PFX(SevIoReadFifo16)\r
113ASM_PFX(SevIoReadFifo16):\r
b6d11d7c
LD
114 xchg rcx, rdx\r
115 xchg rdi, r8 ; rdi: buffer address; r8: save rdi\r
116\r
117 ; Check if we need to unroll String I/O\r
118 call ASM_PFX(SevNoRepIo)\r
119 test eax, eax\r
120 jnz @IoReadFifo16_NoRep\r
121\r
122 cld\r
123 rep insw\r
124 jmp @IoReadFifo16_Done\r
125\r
126@IoReadFifo16_NoRep:\r
127 jrcxz @IoReadFifo16_Done\r
128\r
129@IoReadFifo16_Loop:\r
130 in ax, dx\r
131 mov word [rdi], ax\r
132 add rdi, 2\r
133 loop @IoReadFifo16_Loop\r
134\r
135@IoReadFifo16_Done:\r
136 mov rdi, r8 ; restore rdi\r
137 ret\r
138\r
139;------------------------------------------------------------------------------\r
140; VOID\r
141; EFIAPI\r
d74e9326 142; SevIoReadFifo32 (\r
b6d11d7c
LD
143; IN UINTN Port, // rcx\r
144; IN UINTN Size, // rdx\r
145; OUT VOID *Buffer // r8\r
146; );\r
147;------------------------------------------------------------------------------\r
d74e9326
MX
148global ASM_PFX(SevIoReadFifo32)\r
149ASM_PFX(SevIoReadFifo32):\r
b6d11d7c
LD
150 xchg rcx, rdx\r
151 xchg rdi, r8 ; rdi: buffer address; r8: save rdi\r
152\r
153 ; Check if we need to unroll String I/O\r
154 call ASM_PFX(SevNoRepIo)\r
155 test eax, eax\r
156 jnz @IoReadFifo32_NoRep\r
157\r
158 cld\r
159 rep insd\r
160 jmp @IoReadFifo32_Done\r
161\r
162@IoReadFifo32_NoRep:\r
163 jrcxz @IoReadFifo32_Done\r
164\r
165@IoReadFifo32_Loop:\r
166 in eax, dx\r
167 mov dword [rdi], eax\r
168 add rdi, 4\r
169 loop @IoReadFifo32_Loop\r
170\r
171@IoReadFifo32_Done:\r
172 mov rdi, r8 ; restore rdi\r
173 ret\r
174\r
175;------------------------------------------------------------------------------\r
176; VOID\r
177; EFIAPI\r
178; IoWriteFifo8 (\r
179; IN UINTN Port, // rcx\r
180; IN UINTN Size, // rdx\r
181; IN VOID *Buffer // r8\r
182; );\r
183;------------------------------------------------------------------------------\r
d74e9326
MX
184global ASM_PFX(SevIoWriteFifo8)\r
185ASM_PFX(SevIoWriteFifo8):\r
b6d11d7c
LD
186 xchg rcx, rdx\r
187 xchg rsi, r8 ; rsi: buffer address; r8: save rsi\r
188\r
189 ; Check if we need to unroll String I/O\r
190 call ASM_PFX(SevNoRepIo)\r
191 test eax, eax\r
192 jnz @IoWriteFifo8_NoRep\r
193\r
194 cld\r
195 rep outsb\r
196 jmp @IoWriteFifo8_Done\r
197\r
198@IoWriteFifo8_NoRep:\r
199 jrcxz @IoWriteFifo8_Done\r
200\r
201@IoWriteFifo8_Loop:\r
98a4d04e 202 mov al, byte [rsi]\r
b6d11d7c
LD
203 out dx, al\r
204 inc rsi\r
205 loop @IoWriteFifo8_Loop\r
206\r
207@IoWriteFifo8_Done:\r
208 mov rsi, r8 ; restore rsi\r
209 ret\r
210\r
211;------------------------------------------------------------------------------\r
212; VOID\r
213; EFIAPI\r
d74e9326 214; SevIoWriteFifo16 (\r
b6d11d7c
LD
215; IN UINTN Port, // rcx\r
216; IN UINTN Size, // rdx\r
217; IN VOID *Buffer // r8\r
218; );\r
219;------------------------------------------------------------------------------\r
d74e9326
MX
220global ASM_PFX(SevIoWriteFifo16)\r
221ASM_PFX(SevIoWriteFifo16):\r
b6d11d7c
LD
222 xchg rcx, rdx\r
223 xchg rsi, r8 ; rsi: buffer address; r8: save rsi\r
224\r
225 ; Check if we need to unroll String I/O\r
226 call ASM_PFX(SevNoRepIo)\r
227 test eax, eax\r
228 jnz @IoWriteFifo16_NoRep\r
229\r
230 cld\r
231 rep outsw\r
232 jmp @IoWriteFifo16_Done\r
233\r
234@IoWriteFifo16_NoRep:\r
235 jrcxz @IoWriteFifo16_Done\r
236\r
237@IoWriteFifo16_Loop:\r
98a4d04e 238 mov ax, word [rsi]\r
b6d11d7c
LD
239 out dx, ax\r
240 add rsi, 2\r
241 loop @IoWriteFifo16_Loop\r
242\r
243@IoWriteFifo16_Done:\r
244 mov rsi, r8 ; restore rsi\r
245 ret\r
246\r
247;------------------------------------------------------------------------------\r
248; VOID\r
249; EFIAPI\r
d74e9326 250; SevIoWriteFifo32 (\r
b6d11d7c
LD
251; IN UINTN Port, // rcx\r
252; IN UINTN Size, // rdx\r
253; IN VOID *Buffer // r8\r
254; );\r
255;------------------------------------------------------------------------------\r
d74e9326
MX
256global ASM_PFX(SevIoWriteFifo32)\r
257ASM_PFX(SevIoWriteFifo32):\r
b6d11d7c
LD
258 xchg rcx, rdx\r
259 xchg rsi, r8 ; rsi: buffer address; r8: save rsi\r
260\r
261 ; Check if we need to unroll String I/O\r
262 call ASM_PFX(SevNoRepIo)\r
263 test eax, eax\r
264 jnz @IoWriteFifo32_NoRep\r
265\r
266 cld\r
267 rep outsd\r
268 jmp @IoWriteFifo32_Done\r
269\r
270@IoWriteFifo32_NoRep:\r
271 jrcxz @IoWriteFifo32_Done\r
272\r
273@IoWriteFifo32_Loop:\r
98a4d04e 274 mov eax, dword [rsi]\r
b6d11d7c
LD
275 out dx, eax\r
276 add rsi, 4\r
277 loop @IoWriteFifo32_Loop\r
278\r
279@IoWriteFifo32_Done:\r
280 mov rsi, r8 ; restore rsi\r
281 ret\r
282\r