1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4 ; Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
6 ; SPDX-License-Identifier: BSD-2-Clause-Patent
8 ;------------------------------------------------------------------------------
12 ;------------------------------------------------------------------------------
13 ; Check whether we need to unroll the String I/O under SEV guest
15 ; Return // eax (1 - unroll, 0 - no unroll)
16 ;------------------------------------------------------------------------------
17 global ASM_PFX(SevNoRepIo)
20 ; CPUID clobbers ebx, ecx and edx
25 ; Check if we are running under hypervisor
32 ; Check if we have Memory encryption CPUID leaf
38 ; Check for memory encryption feature:
39 ; CPUID Fn8000_001F[EAX] - Bit 1
46 ; Check if memory encryption is enabled
47 ; MSR_0xC0010131 - Bit 0 (SEV enabled)
48 ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)
52 ; Check for (SevEsEnabled == 0 && SevEnabled == 1)
66 ;------------------------------------------------------------------------------
74 ;------------------------------------------------------------------------------
75 global ASM_PFX(IoReadFifo8)
82 ; Check if we need to unroll String I/O
83 call ASM_PFX(SevNoRepIo)
85 jnz @IoReadFifo8_NoRep
92 jecxz @IoReadFifo8_Done
98 loop @IoReadFifo8_Loop
104 ;------------------------------------------------------------------------------
112 ;------------------------------------------------------------------------------
113 global ASM_PFX(IoReadFifo16)
114 ASM_PFX(IoReadFifo16):
120 ; Check if we need to unroll String I/O
121 call ASM_PFX(SevNoRepIo)
123 jnz @IoReadFifo16_NoRep
127 jmp @IoReadFifo16_Done
130 jecxz @IoReadFifo16_Done
136 loop @IoReadFifo16_Loop
142 ;------------------------------------------------------------------------------
150 ;------------------------------------------------------------------------------
151 global ASM_PFX(IoReadFifo32)
152 ASM_PFX(IoReadFifo32):
158 ; Check if we need to unroll String I/O
159 call ASM_PFX(SevNoRepIo)
161 jnz @IoReadFifo32_NoRep
165 jmp @IoReadFifo32_Done
168 jecxz @IoReadFifo32_Done
174 loop @IoReadFifo32_Loop
180 ;------------------------------------------------------------------------------
188 ;------------------------------------------------------------------------------
189 global ASM_PFX(IoWriteFifo8)
190 ASM_PFX(IoWriteFifo8):
196 ; Check if we need to unroll String I/O
197 call ASM_PFX(SevNoRepIo)
199 jnz @IoWriteFifo8_NoRep
203 jmp @IoWriteFifo8_Done
206 jecxz @IoWriteFifo8_Done
212 loop @IoWriteFifo8_Loop
218 ;------------------------------------------------------------------------------
226 ;------------------------------------------------------------------------------
227 global ASM_PFX(IoWriteFifo16)
228 ASM_PFX(IoWriteFifo16):
234 ; Check if we need to unroll String I/O
235 call ASM_PFX(SevNoRepIo)
237 jnz @IoWriteFifo16_NoRep
241 jmp @IoWriteFifo16_Done
243 @IoWriteFifo16_NoRep:
244 jecxz @IoWriteFifo16_Done
250 loop @IoWriteFifo16_Loop
256 ;------------------------------------------------------------------------------
264 ;------------------------------------------------------------------------------
265 global ASM_PFX(IoWriteFifo32)
266 ASM_PFX(IoWriteFifo32):
272 ; Check if we need to unroll String I/O
273 call ASM_PFX(SevNoRepIo)
275 jnz @IoWriteFifo32_NoRep
279 jmp @IoWriteFifo32_Done
281 @IoWriteFifo32_NoRep:
282 jecxz @IoWriteFifo32_Done
288 loop @IoWriteFifo32_Loop