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