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