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