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 ;------------------------------------------------------------------------------
13 ;------------------------------------------------------------------------------
14 ; Check whether we need to unroll the String I/O in SEV guest
16 ; Return // eax (1 - unroll, 0 - no unroll)
17 ;------------------------------------------------------------------------------
18 global ASM_PFX(SevNoRepIo)
21 ; CPUID clobbers ebx, ecx and edx
26 ; Check if we are runing under hypervisor
33 ; Check if we have Memory encryption CPUID leaf
39 ; Check for memory encryption feature:
40 ; CPUID Fn8000_001F[EAX] - Bit 1
47 ; Check if memory encryption is enabled
48 ; MSR_0xC0010131 - Bit 0 (SEV enabled)
49 ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)
53 ; Check for (SevEsEnabled == 0 && SevEnabled == 1)
67 ;------------------------------------------------------------------------------
71 ; IN UINTN Port, // rcx
72 ; IN UINTN Size, // rdx
73 ; OUT VOID *Buffer // r8
75 ;------------------------------------------------------------------------------
76 global ASM_PFX(IoReadFifo8)
79 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
81 ; Check if we need to unroll String I/O
82 call ASM_PFX(SevNoRepIo)
84 jnz @IoReadFifo8_NoRep
91 jrcxz @IoReadFifo8_Done
97 loop @IoReadFifo8_Loop
100 mov rdi, r8 ; restore rdi
103 ;------------------------------------------------------------------------------
107 ; IN UINTN Port, // rcx
108 ; IN UINTN Size, // rdx
109 ; OUT VOID *Buffer // r8
111 ;------------------------------------------------------------------------------
112 global ASM_PFX(IoReadFifo16)
113 ASM_PFX(IoReadFifo16):
115 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
117 ; Check if we need to unroll String I/O
118 call ASM_PFX(SevNoRepIo)
120 jnz @IoReadFifo16_NoRep
124 jmp @IoReadFifo16_Done
127 jrcxz @IoReadFifo16_Done
133 loop @IoReadFifo16_Loop
136 mov rdi, r8 ; restore rdi
139 ;------------------------------------------------------------------------------
143 ; IN UINTN Port, // rcx
144 ; IN UINTN Size, // rdx
145 ; OUT VOID *Buffer // r8
147 ;------------------------------------------------------------------------------
148 global ASM_PFX(IoReadFifo32)
149 ASM_PFX(IoReadFifo32):
151 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
153 ; Check if we need to unroll String I/O
154 call ASM_PFX(SevNoRepIo)
156 jnz @IoReadFifo32_NoRep
160 jmp @IoReadFifo32_Done
163 jrcxz @IoReadFifo32_Done
169 loop @IoReadFifo32_Loop
172 mov rdi, r8 ; restore rdi
175 ;------------------------------------------------------------------------------
179 ; IN UINTN Port, // rcx
180 ; IN UINTN Size, // rdx
181 ; IN VOID *Buffer // r8
183 ;------------------------------------------------------------------------------
184 global ASM_PFX(IoWriteFifo8)
185 ASM_PFX(IoWriteFifo8):
187 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
189 ; Check if we need to unroll String I/O
190 call ASM_PFX(SevNoRepIo)
192 jnz @IoWriteFifo8_NoRep
196 jmp @IoWriteFifo8_Done
199 jrcxz @IoWriteFifo8_Done
205 loop @IoWriteFifo8_Loop
208 mov rsi, r8 ; restore rsi
211 ;------------------------------------------------------------------------------
215 ; IN UINTN Port, // rcx
216 ; IN UINTN Size, // rdx
217 ; IN VOID *Buffer // r8
219 ;------------------------------------------------------------------------------
220 global ASM_PFX(IoWriteFifo16)
221 ASM_PFX(IoWriteFifo16):
223 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
225 ; Check if we need to unroll String I/O
226 call ASM_PFX(SevNoRepIo)
228 jnz @IoWriteFifo16_NoRep
232 jmp @IoWriteFifo16_Done
234 @IoWriteFifo16_NoRep:
235 jrcxz @IoWriteFifo16_Done
241 loop @IoWriteFifo16_Loop
244 mov rsi, r8 ; restore rsi
247 ;------------------------------------------------------------------------------
251 ; IN UINTN Port, // rcx
252 ; IN UINTN Size, // rdx
253 ; IN VOID *Buffer // r8
255 ;------------------------------------------------------------------------------
256 global ASM_PFX(IoWriteFifo32)
257 ASM_PFX(IoWriteFifo32):
259 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
261 ; Check if we need to unroll String I/O
262 call ASM_PFX(SevNoRepIo)
264 jnz @IoWriteFifo32_NoRep
268 jmp @IoWriteFifo32_Done
270 @IoWriteFifo32_NoRep:
271 jrcxz @IoWriteFifo32_Done
277 loop @IoWriteFifo32_Loop
280 mov rsi, r8 ; restore rsi