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