1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4 ; Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
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.
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.
14 ;------------------------------------------------------------------------------
19 ;------------------------------------------------------------------------------
20 ; Check whether we need to unroll the String I/O in SEV guest
22 ; Return // eax (1 - unroll, 0 - no unroll)
23 ;------------------------------------------------------------------------------
24 global ASM_PFX(SevNoRepIo)
27 ; CPUID clobbers ebx, ecx and edx
32 ; Check if we are runing under hypervisor
39 ; Check if we have Memory encryption CPUID leaf
45 ; Check for memory encryption feature:
46 ; CPUID Fn8000_001F[EAX] - Bit 1
53 ; Check if memory encryption is enabled
54 ; MSR_0xC0010131 - Bit 0 (SEV enabled)
55 ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)
59 ; Check for (SevEsEnabled == 0 && SevEnabled == 1)
73 ;------------------------------------------------------------------------------
77 ; IN UINTN Port, // rcx
78 ; IN UINTN Size, // rdx
79 ; OUT VOID *Buffer // r8
81 ;------------------------------------------------------------------------------
82 global ASM_PFX(IoReadFifo8)
85 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
87 ; Check if we need to unroll String I/O
88 call ASM_PFX(SevNoRepIo)
90 jnz @IoReadFifo8_NoRep
97 jrcxz @IoReadFifo8_Done
103 loop @IoReadFifo8_Loop
106 mov rdi, r8 ; restore rdi
109 ;------------------------------------------------------------------------------
113 ; IN UINTN Port, // rcx
114 ; IN UINTN Size, // rdx
115 ; OUT VOID *Buffer // r8
117 ;------------------------------------------------------------------------------
118 global ASM_PFX(IoReadFifo16)
119 ASM_PFX(IoReadFifo16):
121 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
123 ; Check if we need to unroll String I/O
124 call ASM_PFX(SevNoRepIo)
126 jnz @IoReadFifo16_NoRep
130 jmp @IoReadFifo16_Done
133 jrcxz @IoReadFifo16_Done
139 loop @IoReadFifo16_Loop
142 mov rdi, r8 ; restore rdi
145 ;------------------------------------------------------------------------------
149 ; IN UINTN Port, // rcx
150 ; IN UINTN Size, // rdx
151 ; OUT VOID *Buffer // r8
153 ;------------------------------------------------------------------------------
154 global ASM_PFX(IoReadFifo32)
155 ASM_PFX(IoReadFifo32):
157 xchg rdi, r8 ; rdi: buffer address; r8: save rdi
159 ; Check if we need to unroll String I/O
160 call ASM_PFX(SevNoRepIo)
162 jnz @IoReadFifo32_NoRep
166 jmp @IoReadFifo32_Done
169 jrcxz @IoReadFifo32_Done
175 loop @IoReadFifo32_Loop
178 mov rdi, r8 ; restore rdi
181 ;------------------------------------------------------------------------------
185 ; IN UINTN Port, // rcx
186 ; IN UINTN Size, // rdx
187 ; IN VOID *Buffer // r8
189 ;------------------------------------------------------------------------------
190 global ASM_PFX(IoWriteFifo8)
191 ASM_PFX(IoWriteFifo8):
193 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
195 ; Check if we need to unroll String I/O
196 call ASM_PFX(SevNoRepIo)
198 jnz @IoWriteFifo8_NoRep
202 jmp @IoWriteFifo8_Done
205 jrcxz @IoWriteFifo8_Done
211 loop @IoWriteFifo8_Loop
214 mov rsi, r8 ; restore rsi
217 ;------------------------------------------------------------------------------
221 ; IN UINTN Port, // rcx
222 ; IN UINTN Size, // rdx
223 ; IN VOID *Buffer // r8
225 ;------------------------------------------------------------------------------
226 global ASM_PFX(IoWriteFifo16)
227 ASM_PFX(IoWriteFifo16):
229 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
231 ; Check if we need to unroll String I/O
232 call ASM_PFX(SevNoRepIo)
234 jnz @IoWriteFifo16_NoRep
238 jmp @IoWriteFifo16_Done
240 @IoWriteFifo16_NoRep:
241 jrcxz @IoWriteFifo16_Done
247 loop @IoWriteFifo16_Loop
250 mov rsi, r8 ; restore rsi
253 ;------------------------------------------------------------------------------
257 ; IN UINTN Port, // rcx
258 ; IN UINTN Size, // rdx
259 ; IN VOID *Buffer // r8
261 ;------------------------------------------------------------------------------
262 global ASM_PFX(IoWriteFifo32)
263 ASM_PFX(IoWriteFifo32):
265 xchg rsi, r8 ; rsi: buffer address; r8: save rsi
267 ; Check if we need to unroll String I/O
268 call ASM_PFX(SevNoRepIo)
270 jnz @IoWriteFifo32_NoRep
274 jmp @IoWriteFifo32_Done
276 @IoWriteFifo32_NoRep:
277 jrcxz @IoWriteFifo32_Done
283 loop @IoWriteFifo32_Loop
286 mov rsi, r8 ; restore rsi