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