]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLib.c
... / ...
CommitLineData
1/** @file\r
2 Common I/O Library routines.\r
3\r
4 Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include "BaseIoLibIntrinsicInternal.h"\r
10#include "IoLibTdx.h"\r
11\r
12/**\r
13 Reads a 64-bit I/O port.\r
14\r
15 Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.\r
16 This function must guarantee that all I/O read and write operations are\r
17 serialized.\r
18\r
19 If 64-bit I/O port operations are not supported, then ASSERT().\r
20 If Port is not aligned on a 64-bit boundary, then ASSERT().\r
21\r
22 @param Port The I/O port to read.\r
23\r
24 @return The value read.\r
25\r
26**/\r
27UINT64\r
28EFIAPI\r
29IoRead64 (\r
30 IN UINTN Port\r
31 )\r
32{\r
33 ASSERT (FALSE);\r
34 return 0;\r
35}\r
36\r
37/**\r
38 Writes a 64-bit I/O port.\r
39\r
40 Writes the 64-bit I/O port specified by Port with the value specified by Value\r
41 and returns Value. This function must guarantee that all I/O read and write\r
42 operations are serialized.\r
43\r
44 If 64-bit I/O port operations are not supported, then ASSERT().\r
45 If Port is not aligned on a 64-bit boundary, then ASSERT().\r
46\r
47 @param Port The I/O port to write.\r
48 @param Value The value to write to the I/O port.\r
49\r
50 @return The value written the I/O port.\r
51\r
52**/\r
53UINT64\r
54EFIAPI\r
55IoWrite64 (\r
56 IN UINTN Port,\r
57 IN UINT64 Value\r
58 )\r
59{\r
60 ASSERT (FALSE);\r
61 return 0;\r
62}\r
63\r
64/**\r
65 Reads an 8-bit MMIO register.\r
66\r
67 Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
68 returned. This function must guarantee that all MMIO read and write\r
69 operations are serialized.\r
70\r
71 If 8-bit MMIO register operations are not supported, then ASSERT().\r
72\r
73 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
74\r
75 @param Address The MMIO register to read.\r
76\r
77 @return The value read.\r
78\r
79**/\r
80UINT8\r
81EFIAPI\r
82MmioRead8 (\r
83 IN UINTN Address\r
84 )\r
85{\r
86 UINT8 Value;\r
87 BOOLEAN Flag;\r
88\r
89 Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
90 if (Flag) {\r
91 MemoryFence ();\r
92\r
93 if (IsTdxGuest ()) {\r
94 Value = TdMmioRead8 (Address);\r
95 } else {\r
96 Value = *(volatile UINT8 *)Address;\r
97 }\r
98\r
99 MemoryFence ();\r
100 }\r
101\r
102 FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
103\r
104 return Value;\r
105}\r
106\r
107/**\r
108 Writes an 8-bit MMIO register.\r
109\r
110 Writes the 8-bit MMIO register specified by Address with the value specified\r
111 by Value and returns Value. This function must guarantee that all MMIO read\r
112 and write operations are serialized.\r
113\r
114 If 8-bit MMIO register operations are not supported, then ASSERT().\r
115\r
116 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
117\r
118 @param Address The MMIO register to write.\r
119 @param Value The value to write to the MMIO register.\r
120\r
121 @return Value.\r
122\r
123**/\r
124UINT8\r
125EFIAPI\r
126MmioWrite8 (\r
127 IN UINTN Address,\r
128 IN UINT8 Value\r
129 )\r
130{\r
131 BOOLEAN Flag;\r
132\r
133 Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
134 if (Flag) {\r
135 MemoryFence ();\r
136\r
137 if (IsTdxGuest ()) {\r
138 TdMmioWrite8 (Address, Value);\r
139 } else {\r
140 *(volatile UINT8 *)Address = Value;\r
141 }\r
142\r
143 MemoryFence ();\r
144 }\r
145\r
146 FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
147\r
148 return Value;\r
149}\r
150\r
151/**\r
152 Reads a 16-bit MMIO register.\r
153\r
154 Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
155 returned. This function must guarantee that all MMIO read and write\r
156 operations are serialized.\r
157\r
158 If 16-bit MMIO register operations are not supported, then ASSERT().\r
159 If Address is not aligned on a 16-bit boundary, then ASSERT().\r
160\r
161 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
162\r
163 @param Address The MMIO register to read.\r
164\r
165 @return The value read.\r
166\r
167**/\r
168UINT16\r
169EFIAPI\r
170MmioRead16 (\r
171 IN UINTN Address\r
172 )\r
173{\r
174 UINT16 Value;\r
175 BOOLEAN Flag;\r
176\r
177 ASSERT ((Address & 1) == 0);\r
178 Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
179 if (Flag) {\r
180 MemoryFence ();\r
181\r
182 if (IsTdxGuest ()) {\r
183 Value = TdMmioRead16 (Address);\r
184 } else {\r
185 Value = *(volatile UINT16 *)Address;\r
186 }\r
187\r
188 MemoryFence ();\r
189 }\r
190\r
191 FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
192\r
193 return Value;\r
194}\r
195\r
196/**\r
197 Writes a 16-bit MMIO register.\r
198\r
199 Writes the 16-bit MMIO register specified by Address with the value specified\r
200 by Value and returns Value. This function must guarantee that all MMIO read\r
201 and write operations are serialized.\r
202\r
203 If 16-bit MMIO register operations are not supported, then ASSERT().\r
204 If Address is not aligned on a 16-bit boundary, then ASSERT().\r
205\r
206 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
207\r
208 @param Address The MMIO register to write.\r
209 @param Value The value to write to the MMIO register.\r
210\r
211 @return Value.\r
212\r
213**/\r
214UINT16\r
215EFIAPI\r
216MmioWrite16 (\r
217 IN UINTN Address,\r
218 IN UINT16 Value\r
219 )\r
220{\r
221 BOOLEAN Flag;\r
222\r
223 ASSERT ((Address & 1) == 0);\r
224\r
225 Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
226 if (Flag) {\r
227 MemoryFence ();\r
228\r
229 if (IsTdxGuest ()) {\r
230 TdMmioWrite16 (Address, Value);\r
231 } else {\r
232 *(volatile UINT16 *)Address = Value;\r
233 }\r
234\r
235 MemoryFence ();\r
236 }\r
237\r
238 FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
239\r
240 return Value;\r
241}\r
242\r
243/**\r
244 Reads a 32-bit MMIO register.\r
245\r
246 Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
247 returned. This function must guarantee that all MMIO read and write\r
248 operations are serialized.\r
249\r
250 If 32-bit MMIO register operations are not supported, then ASSERT().\r
251 If Address is not aligned on a 32-bit boundary, then ASSERT().\r
252\r
253 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
254\r
255 @param Address The MMIO register to read.\r
256\r
257 @return The value read.\r
258\r
259**/\r
260UINT32\r
261EFIAPI\r
262MmioRead32 (\r
263 IN UINTN Address\r
264 )\r
265{\r
266 UINT32 Value;\r
267 BOOLEAN Flag;\r
268\r
269 ASSERT ((Address & 3) == 0);\r
270\r
271 Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
272 if (Flag) {\r
273 MemoryFence ();\r
274\r
275 if (IsTdxGuest ()) {\r
276 Value = TdMmioRead32 (Address);\r
277 } else {\r
278 Value = *(volatile UINT32 *)Address;\r
279 }\r
280\r
281 MemoryFence ();\r
282 }\r
283\r
284 FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
285\r
286 return Value;\r
287}\r
288\r
289/**\r
290 Writes a 32-bit MMIO register.\r
291\r
292 Writes the 32-bit MMIO register specified by Address with the value specified\r
293 by Value and returns Value. This function must guarantee that all MMIO read\r
294 and write operations are serialized.\r
295\r
296 If 32-bit MMIO register operations are not supported, then ASSERT().\r
297 If Address is not aligned on a 32-bit boundary, then ASSERT().\r
298\r
299 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
300\r
301 @param Address The MMIO register to write.\r
302 @param Value The value to write to the MMIO register.\r
303\r
304 @return Value.\r
305\r
306**/\r
307UINT32\r
308EFIAPI\r
309MmioWrite32 (\r
310 IN UINTN Address,\r
311 IN UINT32 Value\r
312 )\r
313{\r
314 BOOLEAN Flag;\r
315\r
316 ASSERT ((Address & 3) == 0);\r
317\r
318 Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
319 if (Flag) {\r
320 MemoryFence ();\r
321\r
322 if (IsTdxGuest ()) {\r
323 TdMmioWrite32 (Address, Value);\r
324 } else {\r
325 *(volatile UINT32 *)Address = Value;\r
326 }\r
327\r
328 MemoryFence ();\r
329 }\r
330\r
331 FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
332\r
333 return Value;\r
334}\r
335\r
336/**\r
337 Reads a 64-bit MMIO register.\r
338\r
339 Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
340 returned. This function must guarantee that all MMIO read and write\r
341 operations are serialized.\r
342\r
343 If 64-bit MMIO register operations are not supported, then ASSERT().\r
344 If Address is not aligned on a 64-bit boundary, then ASSERT().\r
345\r
346 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
347\r
348 @param Address The MMIO register to read.\r
349\r
350 @return The value read.\r
351\r
352**/\r
353UINT64\r
354EFIAPI\r
355MmioRead64 (\r
356 IN UINTN Address\r
357 )\r
358{\r
359 UINT64 Value;\r
360 BOOLEAN Flag;\r
361\r
362 ASSERT ((Address & 7) == 0);\r
363\r
364 Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
365 if (Flag) {\r
366 MemoryFence ();\r
367\r
368 if (IsTdxGuest ()) {\r
369 Value = TdMmioRead64 (Address);\r
370 } else {\r
371 Value = *(volatile UINT64 *)Address;\r
372 }\r
373\r
374 MemoryFence ();\r
375 }\r
376\r
377 FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
378\r
379 return Value;\r
380}\r
381\r
382/**\r
383 Writes a 64-bit MMIO register.\r
384\r
385 Writes the 64-bit MMIO register specified by Address with the value specified\r
386 by Value and returns Value. This function must guarantee that all MMIO read\r
387 and write operations are serialized.\r
388\r
389 If 64-bit MMIO register operations are not supported, then ASSERT().\r
390 If Address is not aligned on a 64-bit boundary, then ASSERT().\r
391\r
392 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
393\r
394 @param Address The MMIO register to write.\r
395 @param Value The value to write to the MMIO register.\r
396\r
397**/\r
398UINT64\r
399EFIAPI\r
400MmioWrite64 (\r
401 IN UINTN Address,\r
402 IN UINT64 Value\r
403 )\r
404{\r
405 BOOLEAN Flag;\r
406\r
407 ASSERT ((Address & 7) == 0);\r
408\r
409 Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
410 if (Flag) {\r
411 MemoryFence ();\r
412\r
413 if (IsTdxGuest ()) {\r
414 TdMmioWrite64 (Address, Value);\r
415 } else {\r
416 *(volatile UINT64 *)Address = Value;\r
417 }\r
418\r
419 MemoryFence ();\r
420 }\r
421\r
422 FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
423\r
424 return Value;\r
425}\r