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