]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/Library/BaseLib.h
Move #include <IndustryStandard/Pal.h> into IPF specific statement.
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
1 /** @file
2 Memory-only library functions with no library constructor/destructor
3
4 Copyright (c) 2006 - 2007, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 Module Name: BaseLib.h
14
15 **/
16
17 #ifndef __BASE_LIB__
18 #define __BASE_LIB__
19
20 //
21 // Definitions for architecture specific types
22 // These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER
23 //
24
25 //
26 // SPIN_LOCK
27 //
28 typedef volatile UINTN SPIN_LOCK;
29
30 #if defined (MDE_CPU_IA32)
31 //
32 // IA32 context buffer used by SetJump() and LongJump()
33 //
34 typedef struct {
35 UINT32 Ebx;
36 UINT32 Esi;
37 UINT32 Edi;
38 UINT32 Ebp;
39 UINT32 Esp;
40 UINT32 Eip;
41 } BASE_LIBRARY_JUMP_BUFFER;
42
43 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
44
45 #elif defined (MDE_CPU_IPF)
46 //
47 // IPF context buffer used by SetJump() and LongJump()
48 //
49 typedef struct {
50 UINT64 F2[2];
51 UINT64 F3[2];
52 UINT64 F4[2];
53 UINT64 F5[2];
54 UINT64 F16[2];
55 UINT64 F17[2];
56 UINT64 F18[2];
57 UINT64 F19[2];
58 UINT64 F20[2];
59 UINT64 F21[2];
60 UINT64 F22[2];
61 UINT64 F23[2];
62 UINT64 F24[2];
63 UINT64 F25[2];
64 UINT64 F26[2];
65 UINT64 F27[2];
66 UINT64 F28[2];
67 UINT64 F29[2];
68 UINT64 F30[2];
69 UINT64 F31[2];
70 UINT64 R4;
71 UINT64 R5;
72 UINT64 R6;
73 UINT64 R7;
74 UINT64 SP;
75 UINT64 BR0;
76 UINT64 BR1;
77 UINT64 BR2;
78 UINT64 BR3;
79 UINT64 BR4;
80 UINT64 BR5;
81 UINT64 InitialUNAT;
82 UINT64 AfterSpillUNAT;
83 UINT64 PFS;
84 UINT64 BSP;
85 UINT64 Predicates;
86 UINT64 LoopCount;
87 UINT64 FPSR;
88 } BASE_LIBRARY_JUMP_BUFFER;
89
90 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10
91
92 #elif defined (MDE_CPU_X64)
93 //
94 // X64 context buffer used by SetJump() and LongJump()
95 //
96 typedef struct {
97 UINT64 Rbx;
98 UINT64 Rsp;
99 UINT64 Rbp;
100 UINT64 Rdi;
101 UINT64 Rsi;
102 UINT64 R12;
103 UINT64 R13;
104 UINT64 R14;
105 UINT64 R15;
106 UINT64 Rip;
107 } BASE_LIBRARY_JUMP_BUFFER;
108
109 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
110
111 #elif defined (MDE_CPU_EBC)
112 //
113 // EBC context buffer used by SetJump() and LongJump()
114 //
115 typedef struct {
116 UINT64 R0;
117 UINT64 R1;
118 UINT64 R2;
119 UINT64 R3;
120 UINT64 IP;
121 } BASE_LIBRARY_JUMP_BUFFER;
122
123 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
124
125 #else
126 #error Unknown Processor Type
127 #endif
128
129 //
130 // String Services
131 //
132
133 /**
134 Copies one Null-terminated Unicode string to another Null-terminated Unicode
135 string and returns the new Unicode string.
136
137 This function copies the contents of the Unicode string Source to the Unicode
138 string Destination, and returns Destination. If Source and Destination
139 overlap, then the results are undefined.
140
141 If Destination is NULL, then ASSERT().
142 If Destination is not aligned on a 16-bit boundary, then ASSERT().
143 If Source is NULL, then ASSERT().
144 If Source is not aligned on a 16-bit boundary, then ASSERT().
145 If Source and Destination overlap, then ASSERT().
146 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
147 PcdMaximumUnicodeStringLength Unicode characters not including the
148 Null-terminator, then ASSERT().
149
150 @param Destination Pointer to a Null-terminated Unicode string.
151 @param Source Pointer to a Null-terminated Unicode string.
152
153 @return Destiantion
154
155 **/
156 CHAR16 *
157 EFIAPI
158 StrCpy (
159 OUT CHAR16 *Destination,
160 IN CONST CHAR16 *Source
161 );
162
163
164 /**
165 Copies one Null-terminated Unicode string with a maximum length to another
166 Null-terminated Unicode string with a maximum length and returns the new
167 Unicode string.
168
169 This function copies the contents of the Unicode string Source to the Unicode
170 string Destination, and returns Destination. At most, Length Unicode
171 characters are copied from Source to Destination. If Length is 0, then
172 Destination is returned unmodified. If Length is greater that the number of
173 Unicode characters in Source, then Destination is padded with Null Unicode
174 characters. If Source and Destination overlap, then the results are
175 undefined.
176
177 If Length > 0 and Destination is NULL, then ASSERT().
178 If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
179 If Length > 0 and Source is NULL, then ASSERT().
180 If Length > 0 and Source is not aligned on a 16-bit bounadry, then ASSERT().
181 If Source and Destination overlap, then ASSERT().
182 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
183 PcdMaximumUnicodeStringLength Unicode characters not including the
184 Null-terminator, then ASSERT().
185
186 @param Destination Pointer to a Null-terminated Unicode string.
187 @param Source Pointer to a Null-terminated Unicode string.
188 @param Length Maximum number of Unicode characters to copy.
189
190 @return Destination
191
192 **/
193 CHAR16 *
194 EFIAPI
195 StrnCpy (
196 OUT CHAR16 *Destination,
197 IN CONST CHAR16 *Source,
198 IN UINTN Length
199 );
200
201
202 /**
203 Returns the length of a Null-terminated Unicode string.
204
205 This function returns the number of Unicode characters in the Null-terminated
206 Unicode string specified by String.
207
208 If String is NULL, then ASSERT().
209 If String is not aligned on a 16-bit boundary, then ASSERT().
210 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
211 PcdMaximumUnicodeStringLength Unicode characters not including the
212 Null-terminator, then ASSERT().
213
214 @param String Pointer to a Null-terminated Unicode string.
215
216 @return The length of String.
217
218 **/
219 UINTN
220 EFIAPI
221 StrLen (
222 IN CONST CHAR16 *String
223 );
224
225
226 /**
227 Returns the size of a Null-terminated Unicode string in bytes, including the
228 Null terminator.
229
230 This function returns the size, in bytes, of the Null-terminated Unicode
231 string specified by String.
232
233 If String is NULL, then ASSERT().
234 If String is not aligned on a 16-bit boundary, then ASSERT().
235 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
236 PcdMaximumUnicodeStringLength Unicode characters not including the
237 Null-terminator, then ASSERT().
238
239 @param String Pointer to a Null-terminated Unicode string.
240
241 @return The size of String.
242
243 **/
244 UINTN
245 EFIAPI
246 StrSize (
247 IN CONST CHAR16 *String
248 );
249
250
251 /**
252 Compares two Null-terminated Unicode strings, and returns the difference
253 between the first mismatched Unicode characters.
254
255 This function compares the Null-terminated Unicode string FirstString to the
256 Null-terminated Unicode string SecondString. If FirstString is identical to
257 SecondString, then 0 is returned. Otherwise, the value returned is the first
258 mismatched Unicode character in SecondString subtracted from the first
259 mismatched Unicode character in FirstString.
260
261 If FirstString is NULL, then ASSERT().
262 If FirstString is not aligned on a 16-bit boundary, then ASSERT().
263 If SecondString is NULL, then ASSERT().
264 If SecondString is not aligned on a 16-bit boundary, then ASSERT().
265 If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
266 than PcdMaximumUnicodeStringLength Unicode characters not including the
267 Null-terminator, then ASSERT().
268 If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
269 than PcdMaximumUnicodeStringLength Unicode characters not including the
270 Null-terminator, then ASSERT().
271
272 @param FirstString Pointer to a Null-terminated Unicode string.
273 @param SecondString Pointer to a Null-terminated Unicode string.
274
275 @retval 0 FirstString is identical to SecondString.
276 @retval !=0 FirstString is not identical to SecondString.
277
278 **/
279 INTN
280 EFIAPI
281 StrCmp (
282 IN CONST CHAR16 *FirstString,
283 IN CONST CHAR16 *SecondString
284 );
285
286
287 /**
288 Compares two Null-terminated Unicode strings with maximum lengths, and
289 returns the difference between the first mismatched Unicode characters.
290
291 This function compares the Null-terminated Unicode string FirstString to the
292 Null-terminated Unicode string SecondString. At most, Length Unicode
293 characters will be compared. If Length is 0, then 0 is returned. If
294 FirstString is identical to SecondString, then 0 is returned. Otherwise, the
295 value returned is the first mismatched Unicode character in SecondString
296 subtracted from the first mismatched Unicode character in FirstString.
297
298 If Length > 0 and FirstString is NULL, then ASSERT().
299 If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().
300 If Length > 0 and SecondString is NULL, then ASSERT().
301 If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT().
302 If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
303 than PcdMaximumUnicodeStringLength Unicode characters not including the
304 Null-terminator, then ASSERT().
305 If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
306 than PcdMaximumUnicodeStringLength Unicode characters not including the
307 Null-terminator, then ASSERT().
308
309 @param FirstString Pointer to a Null-terminated Unicode string.
310 @param SecondString Pointer to a Null-terminated Unicode string.
311 @param Length Maximum number of Unicode characters to compare.
312
313 @retval 0 FirstString is identical to SecondString.
314 @retval !=0 FirstString is not identical to SecondString.
315
316 **/
317 INTN
318 EFIAPI
319 StrnCmp (
320 IN CONST CHAR16 *FirstString,
321 IN CONST CHAR16 *SecondString,
322 IN UINTN Length
323 );
324
325
326 /**
327 Concatenates one Null-terminated Unicode string to another Null-terminated
328 Unicode string, and returns the concatenated Unicode string.
329
330 This function concatenates two Null-terminated Unicode strings. The contents
331 of Null-terminated Unicode string Source are concatenated to the end of
332 Null-terminated Unicode string Destination. The Null-terminated concatenated
333 Unicode String is returned. If Source and Destination overlap, then the
334 results are undefined.
335
336 If Destination is NULL, then ASSERT().
337 If Destination is not aligned on a 16-bit bounadary, then ASSERT().
338 If Source is NULL, then ASSERT().
339 If Source is not aligned on a 16-bit bounadary, then ASSERT().
340 If Source and Destination overlap, then ASSERT().
341 If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
342 than PcdMaximumUnicodeStringLength Unicode characters not including the
343 Null-terminator, then ASSERT().
344 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
345 PcdMaximumUnicodeStringLength Unicode characters not including the
346 Null-terminator, then ASSERT().
347 If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
348 and Source results in a Unicode string with more than
349 PcdMaximumUnicodeStringLength Unicode characters not including the
350 Null-terminator, then ASSERT().
351
352 @param Destination Pointer to a Null-terminated Unicode string.
353 @param Source Pointer to a Null-terminated Unicode string.
354
355 @return Destination
356
357 **/
358 CHAR16 *
359 EFIAPI
360 StrCat (
361 IN OUT CHAR16 *Destination,
362 IN CONST CHAR16 *Source
363 );
364
365
366 /**
367 Concatenates one Null-terminated Unicode string with a maximum length to the
368 end of another Null-terminated Unicode string, and returns the concatenated
369 Unicode string.
370
371 This function concatenates two Null-terminated Unicode strings. The contents
372 of Null-terminated Unicode string Source are concatenated to the end of
373 Null-terminated Unicode string Destination, and Destination is returned. At
374 most, Length Unicode characters are concatenated from Source to the end of
375 Destination, and Destination is always Null-terminated. If Length is 0, then
376 Destination is returned unmodified. If Source and Destination overlap, then
377 the results are undefined.
378
379 If Destination is NULL, then ASSERT().
380 If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
381 If Length > 0 and Source is NULL, then ASSERT().
382 If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
383 If Source and Destination overlap, then ASSERT().
384 If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
385 than PcdMaximumUnicodeStringLength Unicode characters not including the
386 Null-terminator, then ASSERT().
387 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
388 PcdMaximumUnicodeStringLength Unicode characters not including the
389 Null-terminator, then ASSERT().
390 If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
391 and Source results in a Unicode string with more than
392 PcdMaximumUnicodeStringLength Unicode characters not including the
393 Null-terminator, then ASSERT().
394
395 @param Destination Pointer to a Null-terminated Unicode string.
396 @param Source Pointer to a Null-terminated Unicode string.
397 @param Length Maximum number of Unicode characters to concatenate from
398 Source.
399
400 @return Destination
401
402 **/
403 CHAR16 *
404 EFIAPI
405 StrnCat (
406 IN OUT CHAR16 *Destination,
407 IN CONST CHAR16 *Source,
408 IN UINTN Length
409 );
410
411 /**
412 Returns the first occurance of a Null-terminated Unicode sub-string
413 in a Null-terminated Unicode string.
414
415 This function scans the contents of the Null-terminated Unicode string
416 specified by String and returns the first occurrence of SearchString.
417 If SearchString is not found in String, then NULL is returned. If
418 the length of SearchString is zero, then String is
419 returned.
420
421 If String is NULL, then ASSERT().
422 If String is not aligned on a 16-bit boundary, then ASSERT().
423 If SearchString is NULL, then ASSERT().
424 If SearchString is not aligned on a 16-bit boundary, then ASSERT().
425
426 If PcdMaximumUnicodeStringLength is not zero, and SearchString
427 or String contains more than PcdMaximumUnicodeStringLength Unicode
428 characters not including the Null-terminator, then ASSERT().
429
430 @param String Pointer to a Null-terminated Unicode string.
431 @param SearchString Pointer to a Null-terminated Unicode string to search for.
432
433 @retval NULL If the SearchString does not appear in String.
434 @retval !NULL If there is a match.
435
436 **/
437 CHAR16 *
438 EFIAPI
439 StrStr (
440 IN CONST CHAR16 *String,
441 IN CONST CHAR16 *SearchString
442 );
443
444 /**
445 Convert a Null-terminated Unicode decimal string to a value of
446 type UINTN.
447
448 This function returns a value of type UINTN by interpreting the contents
449 of the Unicode string specified by String as a decimal number. The format
450 of the input Unicode string String is:
451
452 [spaces] [decimal digits].
453
454 The valid decimal digit character is in the range [0-9]. The
455 function will ignore the pad space, which includes spaces or
456 tab characters, before [decimal digits]. The running zero in the
457 beginning of [decimal digits] will be ignored. Then, the function
458 stops at the first character that is a not a valid decimal character
459 or a Null-terminator, whichever one comes first.
460
461 If String is NULL, then ASSERT().
462 If String is not aligned in a 16-bit boundary, then ASSERT().
463 If String has only pad spaces, then 0 is returned.
464 If String has no pad spaces or valid decimal digits,
465 then 0 is returned.
466 If the number represented by String overflows according
467 to the range defined by UINTN, then ASSERT().
468
469 If PcdMaximumUnicodeStringLength is not zero, and String contains
470 more than PcdMaximumUnicodeStringLength Unicode characters not including
471 the Null-terminator, then ASSERT().
472
473 @param String Pointer to a Null-terminated Unicode string.
474
475 @retval UINTN
476
477 **/
478 UINTN
479 EFIAPI
480 StrDecimalToUintn (
481 IN CONST CHAR16 *String
482 );
483
484 /**
485 Convert a Null-terminated Unicode decimal string to a value of
486 type UINT64.
487
488 This function returns a value of type UINT64 by interpreting the contents
489 of the Unicode string specified by String as a decimal number. The format
490 of the input Unicode string String is:
491
492 [spaces] [decimal digits].
493
494 The valid decimal digit character is in the range [0-9]. The
495 function will ignore the pad space, which includes spaces or
496 tab characters, before [decimal digits]. The running zero in the
497 beginning of [decimal digits] will be ignored. Then, the function
498 stops at the first character that is a not a valid decimal character
499 or a Null-terminator, whichever one comes first.
500
501 If String is NULL, then ASSERT().
502 If String is not aligned in a 16-bit boundary, then ASSERT().
503 If String has only pad spaces, then 0 is returned.
504 If String has no pad spaces or valid decimal digits,
505 then 0 is returned.
506 If the number represented by String overflows according
507 to the range defined by UINT64, then ASSERT().
508
509 If PcdMaximumUnicodeStringLength is not zero, and String contains
510 more than PcdMaximumUnicodeStringLength Unicode characters not including
511 the Null-terminator, then ASSERT().
512
513 @param String Pointer to a Null-terminated Unicode string.
514
515 @retval UINT64
516
517 **/
518 UINT64
519 EFIAPI
520 StrDecimalToUint64 (
521 IN CONST CHAR16 *String
522 );
523
524
525 /**
526 Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
527
528 This function returns a value of type UINTN by interpreting the contents
529 of the Unicode string specified by String as a hexadecimal number.
530 The format of the input Unicode string String is:
531
532 [spaces][zeros][x][hexadecimal digits].
533
534 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
535 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
536 If "x" appears in the input string, it must be prefixed with at least one 0.
537 The function will ignore the pad space, which includes spaces or tab characters,
538 before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
539 [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
540 first valid hexadecimal digit. Then, the function stops at the first character that is
541 a not a valid hexadecimal character or NULL, whichever one comes first.
542
543 If String is NULL, then ASSERT().
544 If String is not aligned in a 16-bit boundary, then ASSERT().
545 If String has only pad spaces, then zero is returned.
546 If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
547 then zero is returned.
548 If the number represented by String overflows according to the range defined by
549 UINTN, then ASSERT().
550
551 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
552 PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
553 then ASSERT().
554
555 @param String Pointer to a Null-terminated Unicode string.
556
557 @retval UINTN
558
559 **/
560 UINTN
561 EFIAPI
562 StrHexToUintn (
563 IN CONST CHAR16 *String
564 );
565
566
567 /**
568 Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
569
570 This function returns a value of type UINT64 by interpreting the contents
571 of the Unicode string specified by String as a hexadecimal number.
572 The format of the input Unicode string String is
573
574 [spaces][zeros][x][hexadecimal digits].
575
576 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
577 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
578 If "x" appears in the input string, it must be prefixed with at least one 0.
579 The function will ignore the pad space, which includes spaces or tab characters,
580 before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
581 [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
582 first valid hexadecimal digit. Then, the function stops at the first character that is
583 a not a valid hexadecimal character or NULL, whichever one comes first.
584
585 If String is NULL, then ASSERT().
586 If String is not aligned in a 16-bit boundary, then ASSERT().
587 If String has only pad spaces, then zero is returned.
588 If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
589 then zero is returned.
590 If the number represented by String overflows according to the range defined by
591 UINT64, then ASSERT().
592
593 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
594 PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
595 then ASSERT().
596
597 @param String Pointer to a Null-terminated Unicode string.
598
599 @retval UINT64
600
601 **/
602 UINT64
603 EFIAPI
604 StrHexToUint64 (
605 IN CONST CHAR16 *String
606 );
607
608
609 /**
610 Convert one Null-terminated Unicode string to a Null-terminated
611 ASCII string and returns the ASCII string.
612
613 This function converts the content of the Unicode string Source
614 to the ASCII string Destination by copying the lower 8 bits of
615 each Unicode character. It returns Destination.
616
617 If any Unicode characters in Source contain non-zero value in
618 the upper 8 bits, then ASSERT().
619
620 If Destination is NULL, then ASSERT().
621 If Source is NULL, then ASSERT().
622 If Source is not aligned on a 16-bit boundary, then ASSERT().
623 If Source and Destination overlap, then ASSERT().
624
625 If PcdMaximumUnicodeStringLength is not zero, and Source contains
626 more than PcdMaximumUnicodeStringLength Unicode characters not including
627 the Null-terminator, then ASSERT().
628
629 If PcdMaximumAsciiStringLength is not zero, and Source contains more
630 than PcdMaximumAsciiStringLength Unicode characters not including the
631 Null-terminator, then ASSERT().
632
633 @param Source Pointer to a Null-terminated Unicode string.
634 @param Destination Pointer to a Null-terminated ASCII string.
635
636 @reture Destination
637
638 **/
639 CHAR8 *
640 EFIAPI
641 UnicodeStrToAsciiStr (
642 IN CONST CHAR16 *Source,
643 OUT CHAR8 *Destination
644 );
645
646
647 /**
648 Copies one Null-terminated ASCII string to another Null-terminated ASCII
649 string and returns the new ASCII string.
650
651 This function copies the contents of the ASCII string Source to the ASCII
652 string Destination, and returns Destination. If Source and Destination
653 overlap, then the results are undefined.
654
655 If Destination is NULL, then ASSERT().
656 If Source is NULL, then ASSERT().
657 If Source and Destination overlap, then ASSERT().
658 If PcdMaximumAsciiStringLength is not zero and Source contains more than
659 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
660 then ASSERT().
661
662 @param Destination Pointer to a Null-terminated ASCII string.
663 @param Source Pointer to a Null-terminated ASCII string.
664
665 @return Destination
666
667 **/
668 CHAR8 *
669 EFIAPI
670 AsciiStrCpy (
671 OUT CHAR8 *Destination,
672 IN CONST CHAR8 *Source
673 );
674
675
676 /**
677 Copies one Null-terminated ASCII string with a maximum length to another
678 Null-terminated ASCII string with a maximum length and returns the new ASCII
679 string.
680
681 This function copies the contents of the ASCII string Source to the ASCII
682 string Destination, and returns Destination. At most, Length ASCII characters
683 are copied from Source to Destination. If Length is 0, then Destination is
684 returned unmodified. If Length is greater that the number of ASCII characters
685 in Source, then Destination is padded with Null ASCII characters. If Source
686 and Destination overlap, then the results are undefined.
687
688 If Destination is NULL, then ASSERT().
689 If Source is NULL, then ASSERT().
690 If Source and Destination overlap, then ASSERT().
691 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
692 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
693 then ASSERT().
694
695 @param Destination Pointer to a Null-terminated ASCII string.
696 @param Source Pointer to a Null-terminated ASCII string.
697 @param Length Maximum number of ASCII characters to copy.
698
699 @return Destination
700
701 **/
702 CHAR8 *
703 EFIAPI
704 AsciiStrnCpy (
705 OUT CHAR8 *Destination,
706 IN CONST CHAR8 *Source,
707 IN UINTN Length
708 );
709
710
711 /**
712 Returns the length of a Null-terminated ASCII string.
713
714 This function returns the number of ASCII characters in the Null-terminated
715 ASCII string specified by String.
716
717 If Length > 0 and Destination is NULL, then ASSERT().
718 If Length > 0 and Source is NULL, then ASSERT().
719 If PcdMaximumAsciiStringLength is not zero and String contains more than
720 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
721 then ASSERT().
722
723 @param String Pointer to a Null-terminated ASCII string.
724
725 @return The length of String.
726
727 **/
728 UINTN
729 EFIAPI
730 AsciiStrLen (
731 IN CONST CHAR8 *String
732 );
733
734
735 /**
736 Returns the size of a Null-terminated ASCII string in bytes, including the
737 Null terminator.
738
739 This function returns the size, in bytes, of the Null-terminated ASCII string
740 specified by String.
741
742 If String is NULL, then ASSERT().
743 If PcdMaximumAsciiStringLength is not zero and String contains more than
744 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
745 then ASSERT().
746
747 @param String Pointer to a Null-terminated ASCII string.
748
749 @return The size of String.
750
751 **/
752 UINTN
753 EFIAPI
754 AsciiStrSize (
755 IN CONST CHAR8 *String
756 );
757
758
759 /**
760 Compares two Null-terminated ASCII strings, and returns the difference
761 between the first mismatched ASCII characters.
762
763 This function compares the Null-terminated ASCII string FirstString to the
764 Null-terminated ASCII string SecondString. If FirstString is identical to
765 SecondString, then 0 is returned. Otherwise, the value returned is the first
766 mismatched ASCII character in SecondString subtracted from the first
767 mismatched ASCII character in FirstString.
768
769 If FirstString is NULL, then ASSERT().
770 If SecondString is NULL, then ASSERT().
771 If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
772 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
773 then ASSERT().
774 If PcdMaximumAsciiStringLength is not zero and SecondString contains more
775 than PcdMaximumAsciiStringLength ASCII characters not including the
776 Null-terminator, then ASSERT().
777
778 @param FirstString Pointer to a Null-terminated ASCII string.
779 @param SecondString Pointer to a Null-terminated ASCII string.
780
781 @retval 0 FirstString is identical to SecondString.
782 @retval !=0 FirstString is not identical to SecondString.
783
784 **/
785 INTN
786 EFIAPI
787 AsciiStrCmp (
788 IN CONST CHAR8 *FirstString,
789 IN CONST CHAR8 *SecondString
790 );
791
792
793 /**
794 Performs a case insensitive comparison of two Null-terminated ASCII strings,
795 and returns the difference between the first mismatched ASCII characters.
796
797 This function performs a case insensitive comparison of the Null-terminated
798 ASCII string FirstString to the Null-terminated ASCII string SecondString. If
799 FirstString is identical to SecondString, then 0 is returned. Otherwise, the
800 value returned is the first mismatched lower case ASCII character in
801 SecondString subtracted from the first mismatched lower case ASCII character
802 in FirstString.
803
804 If FirstString is NULL, then ASSERT().
805 If SecondString is NULL, then ASSERT().
806 If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
807 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
808 then ASSERT().
809 If PcdMaximumAsciiStringLength is not zero and SecondString contains more
810 than PcdMaximumAsciiStringLength ASCII characters not including the
811 Null-terminator, then ASSERT().
812
813 @param FirstString Pointer to a Null-terminated ASCII string.
814 @param SecondString Pointer to a Null-terminated ASCII string.
815
816 @retval 0 FirstString is identical to SecondString using case insensitive
817 comparisons.
818 @retval !=0 FirstString is not identical to SecondString using case
819 insensitive comparisons.
820
821 **/
822 INTN
823 EFIAPI
824 AsciiStriCmp (
825 IN CONST CHAR8 *FirstString,
826 IN CONST CHAR8 *SecondString
827 );
828
829
830 /**
831 Compares two Null-terminated ASCII strings with maximum lengths, and returns
832 the difference between the first mismatched ASCII characters.
833
834 This function compares the Null-terminated ASCII string FirstString to the
835 Null-terminated ASCII string SecondString. At most, Length ASCII characters
836 will be compared. If Length is 0, then 0 is returned. If FirstString is
837 identical to SecondString, then 0 is returned. Otherwise, the value returned
838 is the first mismatched ASCII character in SecondString subtracted from the
839 first mismatched ASCII character in FirstString.
840
841 If Length > 0 and FirstString is NULL, then ASSERT().
842 If Length > 0 and SecondString is NULL, then ASSERT().
843 If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
844 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
845 then ASSERT().
846 If PcdMaximumAsciiStringLength is not zero and SecondString contains more than
847 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
848 then ASSERT().
849
850 @param FirstString Pointer to a Null-terminated ASCII string.
851 @param SecondString Pointer to a Null-terminated ASCII string.
852
853 @retval 0 FirstString is identical to SecondString.
854 @retval !=0 FirstString is not identical to SecondString.
855
856 **/
857 INTN
858 EFIAPI
859 AsciiStrnCmp (
860 IN CONST CHAR8 *FirstString,
861 IN CONST CHAR8 *SecondString,
862 IN UINTN Length
863 );
864
865
866 /**
867 Concatenates one Null-terminated ASCII string to another Null-terminated
868 ASCII string, and returns the concatenated ASCII string.
869
870 This function concatenates two Null-terminated ASCII strings. The contents of
871 Null-terminated ASCII string Source are concatenated to the end of Null-
872 terminated ASCII string Destination. The Null-terminated concatenated ASCII
873 String is returned.
874
875 If Destination is NULL, then ASSERT().
876 If Source is NULL, then ASSERT().
877 If PcdMaximumAsciiStringLength is not zero and Destination contains more than
878 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
879 then ASSERT().
880 If PcdMaximumAsciiStringLength is not zero and Source contains more than
881 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
882 then ASSERT().
883 If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
884 Source results in a ASCII string with more than PcdMaximumAsciiStringLength
885 ASCII characters, then ASSERT().
886
887 @param Destination Pointer to a Null-terminated ASCII string.
888 @param Source Pointer to a Null-terminated ASCII string.
889
890 @return Destination
891
892 **/
893 CHAR8 *
894 EFIAPI
895 AsciiStrCat (
896 IN OUT CHAR8 *Destination,
897 IN CONST CHAR8 *Source
898 );
899
900
901 /**
902 Concatenates one Null-terminated ASCII string with a maximum length to the
903 end of another Null-terminated ASCII string, and returns the concatenated
904 ASCII string.
905
906 This function concatenates two Null-terminated ASCII strings. The contents
907 of Null-terminated ASCII string Source are concatenated to the end of Null-
908 terminated ASCII string Destination, and Destination is returned. At most,
909 Length ASCII characters are concatenated from Source to the end of
910 Destination, and Destination is always Null-terminated. If Length is 0, then
911 Destination is returned unmodified. If Source and Destination overlap, then
912 the results are undefined.
913
914 If Length > 0 and Destination is NULL, then ASSERT().
915 If Length > 0 and Source is NULL, then ASSERT().
916 If Source and Destination overlap, then ASSERT().
917 If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
918 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
919 then ASSERT().
920 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
921 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
922 then ASSERT().
923 If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
924 Source results in a ASCII string with more than PcdMaximumAsciiStringLength
925 ASCII characters not including the Null-terminator, then ASSERT().
926
927 @param Destination Pointer to a Null-terminated ASCII string.
928 @param Source Pointer to a Null-terminated ASCII string.
929 @param Length Maximum number of ASCII characters to concatenate from
930 Source.
931
932 @return Destination
933
934 **/
935 CHAR8 *
936 EFIAPI
937 AsciiStrnCat (
938 IN OUT CHAR8 *Destination,
939 IN CONST CHAR8 *Source,
940 IN UINTN Length
941 );
942
943
944 /**
945 Returns the first occurance of a Null-terminated ASCII sub-string
946 in a Null-terminated ASCII string.
947
948 This function scans the contents of the ASCII string specified by String
949 and returns the first occurrence of SearchString. If SearchString is not
950 found in String, then NULL is returned. If the length of SearchString is zero,
951 then String is returned.
952
953 If String is NULL, then ASSERT().
954 If SearchString is NULL, then ASSERT().
955
956 If PcdMaximumAsciiStringLength is not zero, and SearchString or
957 String contains more than PcdMaximumAsciiStringLength Unicode characters
958 not including the Null-terminator, then ASSERT().
959
960 @param String Pointer to a Null-terminated ASCII string.
961 @param SearchString Pointer to a Null-terminated ASCII string to search for.
962
963 @retval NULL If the SearchString does not appear in String.
964 @retval !NULL If there is a match.
965
966 **/
967 CHAR8 *
968 EFIAPI
969 AsciiStrStr (
970 IN CONST CHAR8 *String,
971 IN CONST CHAR8 *SearchString
972 );
973
974
975 /**
976 Convert a Null-terminated ASCII decimal string to a value of type
977 UINTN.
978
979 This function returns a value of type UINTN by interpreting the contents
980 of the ASCII string String as a decimal number. The format of the input
981 ASCII string String is:
982
983 [spaces] [decimal digits].
984
985 The valid decimal digit character is in the range [0-9]. The function will
986 ignore the pad space, which includes spaces or tab characters, before the digits.
987 The running zero in the beginning of [decimal digits] will be ignored. Then, the
988 function stops at the first character that is a not a valid decimal character or
989 Null-terminator, whichever on comes first.
990
991 If String has only pad spaces, then 0 is returned.
992 If String has no pad spaces or valid decimal digits, then 0 is returned.
993 If the number represented by String overflows according to the range defined by
994 UINTN, then ASSERT().
995 If String is NULL, then ASSERT().
996 If PcdMaximumAsciiStringLength is not zero, and String contains more than
997 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
998 then ASSERT().
999
1000 @param String Pointer to a Null-terminated ASCII string.
1001
1002 @retval UINTN
1003
1004 **/
1005 UINTN
1006 EFIAPI
1007 AsciiStrDecimalToUintn (
1008 IN CONST CHAR8 *String
1009 );
1010
1011
1012 /**
1013 Convert a Null-terminated ASCII decimal string to a value of type
1014 UINT64.
1015
1016 This function returns a value of type UINT64 by interpreting the contents
1017 of the ASCII string String as a decimal number. The format of the input
1018 ASCII string String is:
1019
1020 [spaces] [decimal digits].
1021
1022 The valid decimal digit character is in the range [0-9]. The function will
1023 ignore the pad space, which includes spaces or tab characters, before the digits.
1024 The running zero in the beginning of [decimal digits] will be ignored. Then, the
1025 function stops at the first character that is a not a valid decimal character or
1026 Null-terminator, whichever on comes first.
1027
1028 If String has only pad spaces, then 0 is returned.
1029 If String has no pad spaces or valid decimal digits, then 0 is returned.
1030 If the number represented by String overflows according to the range defined by
1031 UINT64, then ASSERT().
1032 If String is NULL, then ASSERT().
1033 If PcdMaximumAsciiStringLength is not zero, and String contains more than
1034 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1035 then ASSERT().
1036
1037 @param String Pointer to a Null-terminated ASCII string.
1038
1039 @retval UINT64
1040
1041 **/
1042 UINT64
1043 EFIAPI
1044 AsciiStrDecimalToUint64 (
1045 IN CONST CHAR8 *String
1046 );
1047
1048
1049 /**
1050 Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
1051
1052 This function returns a value of type UINTN by interpreting the contents of
1053 the ASCII string String as a hexadecimal number. The format of the input ASCII
1054 string String is:
1055
1056 [spaces][zeros][x][hexadecimal digits].
1057
1058 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1059 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
1060 appears in the input string, it must be prefixed with at least one 0. The function
1061 will ignore the pad space, which includes spaces or tab characters, before [zeros],
1062 [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
1063 will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
1064 digit. Then, the function stops at the first character that is a not a valid
1065 hexadecimal character or Null-terminator, whichever on comes first.
1066
1067 If String has only pad spaces, then 0 is returned.
1068 If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
1069 0 is returned.
1070
1071 If the number represented by String overflows according to the range defined by UINTN,
1072 then ASSERT().
1073 If String is NULL, then ASSERT().
1074 If PcdMaximumAsciiStringLength is not zero,
1075 and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
1076 the Null-terminator, then ASSERT().
1077
1078 @param String Pointer to a Null-terminated ASCII string.
1079
1080 @retval UINTN
1081
1082 **/
1083 UINTN
1084 EFIAPI
1085 AsciiStrHexToUintn (
1086 IN CONST CHAR8 *String
1087 );
1088
1089
1090 /**
1091 Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
1092
1093 This function returns a value of type UINT64 by interpreting the contents of
1094 the ASCII string String as a hexadecimal number. The format of the input ASCII
1095 string String is:
1096
1097 [spaces][zeros][x][hexadecimal digits].
1098
1099 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1100 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
1101 appears in the input string, it must be prefixed with at least one 0. The function
1102 will ignore the pad space, which includes spaces or tab characters, before [zeros],
1103 [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
1104 will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
1105 digit. Then, the function stops at the first character that is a not a valid
1106 hexadecimal character or Null-terminator, whichever on comes first.
1107
1108 If String has only pad spaces, then 0 is returned.
1109 If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
1110 0 is returned.
1111
1112 If the number represented by String overflows according to the range defined by UINT64,
1113 then ASSERT().
1114 If String is NULL, then ASSERT().
1115 If PcdMaximumAsciiStringLength is not zero,
1116 and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
1117 the Null-terminator, then ASSERT().
1118
1119 @param String Pointer to a Null-terminated ASCII string.
1120
1121 @retval UINT64
1122
1123 **/
1124 UINT64
1125 EFIAPI
1126 AsciiStrHexToUint64 (
1127 IN CONST CHAR8 *String
1128 );
1129
1130
1131 /**
1132 Convert one Null-terminated ASCII string to a Null-terminated
1133 Unicode string and returns the Unicode string.
1134
1135 This function converts the contents of the ASCII string Source to the Unicode
1136 string Destination, and returns Destination. The function terminates the
1137 Unicode string Destination by appending a Null-terminator character at the end.
1138 The caller is responsible to make sure Destination points to a buffer with size
1139 equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
1140
1141 If Destination is NULL, then ASSERT().
1142 If Destination is not aligned on a 16-bit boundary, then ASSERT().
1143 If Source is NULL, then ASSERT().
1144 If Source and Destination overlap, then ASSERT().
1145 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
1146 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1147 then ASSERT().
1148 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1149 PcdMaximumUnicodeStringLength ASCII characters not including the
1150 Null-terminator, then ASSERT().
1151
1152 @param Source Pointer to a Null-terminated ASCII string.
1153 @param Destination Pointer to a Null-terminated Unicode string.
1154
1155 @reture Destination
1156
1157 **/
1158 CHAR16 *
1159 EFIAPI
1160 AsciiStrToUnicodeStr (
1161 IN CONST CHAR8 *Source,
1162 OUT CHAR16 *Destination
1163 );
1164
1165
1166 /**
1167 Converts an 8-bit value to an 8-bit BCD value.
1168
1169 Converts the 8-bit value specified by Value to BCD. The BCD value is
1170 returned.
1171
1172 If Value >= 100, then ASSERT().
1173
1174 @param Value The 8-bit value to convert to BCD. Range 0..99.
1175
1176 @return The BCD value
1177
1178 **/
1179 UINT8
1180 EFIAPI
1181 DecimalToBcd8 (
1182 IN UINT8 Value
1183 );
1184
1185
1186 /**
1187 Converts an 8-bit BCD value to an 8-bit value.
1188
1189 Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
1190 value is returned.
1191
1192 If Value >= 0xA0, then ASSERT().
1193 If (Value & 0x0F) >= 0x0A, then ASSERT().
1194
1195 @param Value The 8-bit BCD value to convert to an 8-bit value.
1196
1197 @return The 8-bit value is returned.
1198
1199 **/
1200 UINT8
1201 EFIAPI
1202 BcdToDecimal8 (
1203 IN UINT8 Value
1204 );
1205
1206
1207 //
1208 // Linked List Functions and Macros
1209 //
1210
1211 /**
1212 Initializes the head node of a doubly linked list that is declared as a
1213 global variable in a module.
1214
1215 Initializes the forward and backward links of a new linked list. After
1216 initializing a linked list with this macro, the other linked list functions
1217 may be used to add and remove nodes from the linked list. This macro results
1218 in smaller executables by initializing the linked list in the data section,
1219 instead if calling the InitializeListHead() function to perform the
1220 equivalent operation.
1221
1222 @param ListHead The head note of a list to initiailize.
1223
1224 **/
1225 #define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&ListHead, &ListHead}
1226
1227
1228 /**
1229 Initializes the head node of a doubly linked list, and returns the pointer to
1230 the head node of the doubly linked list.
1231
1232 Initializes the forward and backward links of a new linked list. After
1233 initializing a linked list with this function, the other linked list
1234 functions may be used to add and remove nodes from the linked list. It is up
1235 to the caller of this function to allocate the memory for ListHead.
1236
1237 If ListHead is NULL, then ASSERT().
1238
1239 @param ListHead A pointer to the head node of a new doubly linked list.
1240
1241 @return ListHead
1242
1243 **/
1244 LIST_ENTRY *
1245 EFIAPI
1246 InitializeListHead (
1247 IN LIST_ENTRY *ListHead
1248 );
1249
1250
1251 /**
1252 Adds a node to the beginning of a doubly linked list, and returns the pointer
1253 to the head node of the doubly linked list.
1254
1255 Adds the node Entry at the beginning of the doubly linked list denoted by
1256 ListHead, and returns ListHead.
1257
1258 If ListHead is NULL, then ASSERT().
1259 If Entry is NULL, then ASSERT().
1260 If ListHead was not initialized with InitializeListHead(), then ASSERT().
1261 If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
1262 of nodes in ListHead, including the ListHead node, is greater than or
1263 equal to PcdMaximumLinkedListLength, then ASSERT().
1264
1265 @param ListHead A pointer to the head node of a doubly linked list.
1266 @param Entry A pointer to a node that is to be inserted at the beginning
1267 of a doubly linked list.
1268
1269 @return ListHead
1270
1271 **/
1272 LIST_ENTRY *
1273 EFIAPI
1274 InsertHeadList (
1275 IN LIST_ENTRY *ListHead,
1276 IN LIST_ENTRY *Entry
1277 );
1278
1279
1280 /**
1281 Adds a node to the end of a doubly linked list, and returns the pointer to
1282 the head node of the doubly linked list.
1283
1284 Adds the node Entry to the end of the doubly linked list denoted by ListHead,
1285 and returns ListHead.
1286
1287 If ListHead is NULL, then ASSERT().
1288 If Entry is NULL, then ASSERT().
1289 If ListHead was not initialized with InitializeListHead(), then ASSERT().
1290 If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
1291 of nodes in ListHead, including the ListHead node, is greater than or
1292 equal to PcdMaximumLinkedListLength, then ASSERT().
1293
1294 @param ListHead A pointer to the head node of a doubly linked list.
1295 @param Entry A pointer to a node that is to be added at the end of the
1296 doubly linked list.
1297
1298 @return ListHead
1299
1300 **/
1301 LIST_ENTRY *
1302 EFIAPI
1303 InsertTailList (
1304 IN LIST_ENTRY *ListHead,
1305 IN LIST_ENTRY *Entry
1306 );
1307
1308
1309 /**
1310 Retrieves the first node of a doubly linked list.
1311
1312 Returns the first node of a doubly linked list. List must have been
1313 initialized with InitializeListHead(). If List is empty, then NULL is
1314 returned.
1315
1316 If List is NULL, then ASSERT().
1317 If List was not initialized with InitializeListHead(), then ASSERT().
1318 If PcdMaximumLinkedListLenth is not zero, and the number of nodes
1319 in List, including the List node, is greater than or equal to
1320 PcdMaximumLinkedListLength, then ASSERT().
1321
1322 @param List A pointer to the head node of a doubly linked list.
1323
1324 @return The first node of a doubly linked list.
1325 @retval NULL The list is empty.
1326
1327 **/
1328 LIST_ENTRY *
1329 EFIAPI
1330 GetFirstNode (
1331 IN CONST LIST_ENTRY *List
1332 );
1333
1334
1335 /**
1336 Retrieves the next node of a doubly linked list.
1337
1338 Returns the node of a doubly linked list that follows Node. List must have
1339 been initialized with InitializeListHead(). If List is empty, then List is
1340 returned.
1341
1342 If List is NULL, then ASSERT().
1343 If Node is NULL, then ASSERT().
1344 If List was not initialized with InitializeListHead(), then ASSERT().
1345 If PcdMaximumLinkedListLenth is not zero, and List contains more than
1346 PcdMaximumLinkedListLenth nodes, then ASSERT().
1347 If Node is not a node in List, then ASSERT().
1348
1349 @param List A pointer to the head node of a doubly linked list.
1350 @param Node A pointer to a node in the doubly linked list.
1351
1352 @return Pointer to the next node if one exists. Otherwise a null value which
1353 is actually List is returned.
1354
1355 **/
1356 LIST_ENTRY *
1357 EFIAPI
1358 GetNextNode (
1359 IN CONST LIST_ENTRY *List,
1360 IN CONST LIST_ENTRY *Node
1361 );
1362
1363
1364 /**
1365 Checks to see if a doubly linked list is empty or not.
1366
1367 Checks to see if the doubly linked list is empty. If the linked list contains
1368 zero nodes, this function returns TRUE. Otherwise, it returns FALSE.
1369
1370 If ListHead is NULL, then ASSERT().
1371 If ListHead was not initialized with InitializeListHead(), then ASSERT().
1372 If PcdMaximumLinkedListLenth is not zero, and the number of nodes
1373 in List, including the List node, is greater than or equal to
1374 PcdMaximumLinkedListLength, then ASSERT().
1375
1376 @param ListHead A pointer to the head node of a doubly linked list.
1377
1378 @retval TRUE The linked list is empty.
1379 @retval FALSE The linked list is not empty.
1380
1381 **/
1382 BOOLEAN
1383 EFIAPI
1384 IsListEmpty (
1385 IN CONST LIST_ENTRY *ListHead
1386 );
1387
1388
1389 /**
1390 Determines if a node in a doubly linked list is null.
1391
1392 Returns FALSE if Node is one of the nodes in the doubly linked list specified
1393 by List. Otherwise, TRUE is returned. List must have been initialized with
1394 InitializeListHead().
1395
1396 If List is NULL, then ASSERT().
1397 If Node is NULL, then ASSERT().
1398 If List was not initialized with InitializeListHead(), then ASSERT().
1399 If PcdMaximumLinkedListLenth is not zero, and the number of nodes
1400 in List, including the List node, is greater than or equal to
1401 PcdMaximumLinkedListLength, then ASSERT().
1402 If Node is not a node in List and Node is not equal to List, then ASSERT().
1403
1404 @param List A pointer to the head node of a doubly linked list.
1405 @param Node A pointer to a node in the doubly linked list.
1406
1407 @retval TRUE Node is one of the nodes in the doubly linked list.
1408 @retval FALSE Node is not one of the nodes in the doubly linked list.
1409
1410 **/
1411 BOOLEAN
1412 EFIAPI
1413 IsNull (
1414 IN CONST LIST_ENTRY *List,
1415 IN CONST LIST_ENTRY *Node
1416 );
1417
1418
1419 /**
1420 Determines if a node the last node in a doubly linked list.
1421
1422 Returns TRUE if Node is the last node in the doubly linked list specified by
1423 List. Otherwise, FALSE is returned. List must have been initialized with
1424 InitializeListHead().
1425
1426 If List is NULL, then ASSERT().
1427 If Node is NULL, then ASSERT().
1428 If List was not initialized with InitializeListHead(), then ASSERT().
1429 If PcdMaximumLinkedListLenth is not zero, and the number of nodes
1430 in List, including the List node, is greater than or equal to
1431 PcdMaximumLinkedListLength, then ASSERT().
1432 If Node is not a node in List, then ASSERT().
1433
1434 @param List A pointer to the head node of a doubly linked list.
1435 @param Node A pointer to a node in the doubly linked list.
1436
1437 @retval TRUE Node is the last node in the linked list.
1438 @retval FALSE Node is not the last node in the linked list.
1439
1440 **/
1441 BOOLEAN
1442 EFIAPI
1443 IsNodeAtEnd (
1444 IN CONST LIST_ENTRY *List,
1445 IN CONST LIST_ENTRY *Node
1446 );
1447
1448
1449 /**
1450 Swaps the location of two nodes in a doubly linked list, and returns the
1451 first node after the swap.
1452
1453 If FirstEntry is identical to SecondEntry, then SecondEntry is returned.
1454 Otherwise, the location of the FirstEntry node is swapped with the location
1455 of the SecondEntry node in a doubly linked list. SecondEntry must be in the
1456 same double linked list as FirstEntry and that double linked list must have
1457 been initialized with InitializeListHead(). SecondEntry is returned after the
1458 nodes are swapped.
1459
1460 If FirstEntry is NULL, then ASSERT().
1461 If SecondEntry is NULL, then ASSERT().
1462 If SecondEntry and FirstEntry are not in the same linked list, then ASSERT().
1463 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
1464 linked list containing the FirstEntry and SecondEntry nodes, including
1465 the FirstEntry and SecondEntry nodes, is greater than or equal to
1466 PcdMaximumLinkedListLength, then ASSERT().
1467
1468 @param FirstEntry A pointer to a node in a linked list.
1469 @param SecondEntry A pointer to another node in the same linked list.
1470
1471 **/
1472 LIST_ENTRY *
1473 EFIAPI
1474 SwapListEntries (
1475 IN LIST_ENTRY *FirstEntry,
1476 IN LIST_ENTRY *SecondEntry
1477 );
1478
1479
1480 /**
1481 Removes a node from a doubly linked list, and returns the node that follows
1482 the removed node.
1483
1484 Removes the node Entry from a doubly linked list. It is up to the caller of
1485 this function to release the memory used by this node if that is required. On
1486 exit, the node following Entry in the doubly linked list is returned. If
1487 Entry is the only node in the linked list, then the head node of the linked
1488 list is returned.
1489
1490 If Entry is NULL, then ASSERT().
1491 If Entry is the head node of an empty list, then ASSERT().
1492 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
1493 linked list containing Entry, including the Entry node, is greater than
1494 or equal to PcdMaximumLinkedListLength, then ASSERT().
1495
1496 @param Entry A pointer to a node in a linked list
1497
1498 @return Entry
1499
1500 **/
1501 LIST_ENTRY *
1502 EFIAPI
1503 RemoveEntryList (
1504 IN CONST LIST_ENTRY *Entry
1505 );
1506
1507 //
1508 // Math Services
1509 //
1510
1511 /**
1512 Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled
1513 with zeros. The shifted value is returned.
1514
1515 This function shifts the 64-bit value Operand to the left by Count bits. The
1516 low Count bits are set to zero. The shifted value is returned.
1517
1518 If Count is greater than 63, then ASSERT().
1519
1520 @param Operand The 64-bit operand to shift left.
1521 @param Count The number of bits to shift left.
1522
1523 @return Operand << Count
1524
1525 **/
1526 UINT64
1527 EFIAPI
1528 LShiftU64 (
1529 IN UINT64 Operand,
1530 IN UINTN Count
1531 );
1532
1533
1534 /**
1535 Shifts a 64-bit integer right between 0 and 63 bits. This high bits are
1536 filled with zeros. The shifted value is returned.
1537
1538 This function shifts the 64-bit value Operand to the right by Count bits. The
1539 high Count bits are set to zero. The shifted value is returned.
1540
1541 If Count is greater than 63, then ASSERT().
1542
1543 @param Operand The 64-bit operand to shift right.
1544 @param Count The number of bits to shift right.
1545
1546 @return Operand >> Count
1547
1548 **/
1549 UINT64
1550 EFIAPI
1551 RShiftU64 (
1552 IN UINT64 Operand,
1553 IN UINTN Count
1554 );
1555
1556
1557 /**
1558 Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled
1559 with original integer's bit 63. The shifted value is returned.
1560
1561 This function shifts the 64-bit value Operand to the right by Count bits. The
1562 high Count bits are set to bit 63 of Operand. The shifted value is returned.
1563
1564 If Count is greater than 63, then ASSERT().
1565
1566 @param Operand The 64-bit operand to shift right.
1567 @param Count The number of bits to shift right.
1568
1569 @return Operand >> Count
1570
1571 **/
1572 UINT64
1573 EFIAPI
1574 ARShiftU64 (
1575 IN UINT64 Operand,
1576 IN UINTN Count
1577 );
1578
1579
1580 /**
1581 Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits
1582 with the high bits that were rotated.
1583
1584 This function rotates the 32-bit value Operand to the left by Count bits. The
1585 low Count bits are fill with the high Count bits of Operand. The rotated
1586 value is returned.
1587
1588 If Count is greater than 31, then ASSERT().
1589
1590 @param Operand The 32-bit operand to rotate left.
1591 @param Count The number of bits to rotate left.
1592
1593 @return Operand <<< Count
1594
1595 **/
1596 UINT32
1597 EFIAPI
1598 LRotU32 (
1599 IN UINT32 Operand,
1600 IN UINTN Count
1601 );
1602
1603
1604 /**
1605 Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits
1606 with the low bits that were rotated.
1607
1608 This function rotates the 32-bit value Operand to the right by Count bits.
1609 The high Count bits are fill with the low Count bits of Operand. The rotated
1610 value is returned.
1611
1612 If Count is greater than 31, then ASSERT().
1613
1614 @param Operand The 32-bit operand to rotate right.
1615 @param Count The number of bits to rotate right.
1616
1617 @return Operand >>> Count
1618
1619 **/
1620 UINT32
1621 EFIAPI
1622 RRotU32 (
1623 IN UINT32 Operand,
1624 IN UINTN Count
1625 );
1626
1627
1628 /**
1629 Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits
1630 with the high bits that were rotated.
1631
1632 This function rotates the 64-bit value Operand to the left by Count bits. The
1633 low Count bits are fill with the high Count bits of Operand. The rotated
1634 value is returned.
1635
1636 If Count is greater than 63, then ASSERT().
1637
1638 @param Operand The 64-bit operand to rotate left.
1639 @param Count The number of bits to rotate left.
1640
1641 @return Operand <<< Count
1642
1643 **/
1644 UINT64
1645 EFIAPI
1646 LRotU64 (
1647 IN UINT64 Operand,
1648 IN UINTN Count
1649 );
1650
1651
1652 /**
1653 Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits
1654 with the high low bits that were rotated.
1655
1656 This function rotates the 64-bit value Operand to the right by Count bits.
1657 The high Count bits are fill with the low Count bits of Operand. The rotated
1658 value is returned.
1659
1660 If Count is greater than 63, then ASSERT().
1661
1662 @param Operand The 64-bit operand to rotate right.
1663 @param Count The number of bits to rotate right.
1664
1665 @return Operand >>> Count
1666
1667 **/
1668 UINT64
1669 EFIAPI
1670 RRotU64 (
1671 IN UINT64 Operand,
1672 IN UINTN Count
1673 );
1674
1675
1676 /**
1677 Returns the bit position of the lowest bit set in a 32-bit value.
1678
1679 This function computes the bit position of the lowest bit set in the 32-bit
1680 value specified by Operand. If Operand is zero, then -1 is returned.
1681 Otherwise, a value between 0 and 31 is returned.
1682
1683 @param Operand The 32-bit operand to evaluate.
1684
1685 @return Position of the lowest bit set in Operand if found.
1686 @retval -1 Operand is zero.
1687
1688 **/
1689 INTN
1690 EFIAPI
1691 LowBitSet32 (
1692 IN UINT32 Operand
1693 );
1694
1695
1696 /**
1697 Returns the bit position of the lowest bit set in a 64-bit value.
1698
1699 This function computes the bit position of the lowest bit set in the 64-bit
1700 value specified by Operand. If Operand is zero, then -1 is returned.
1701 Otherwise, a value between 0 and 63 is returned.
1702
1703 @param Operand The 64-bit operand to evaluate.
1704
1705 @return Position of the lowest bit set in Operand if found.
1706 @retval -1 Operand is zero.
1707
1708 **/
1709 INTN
1710 EFIAPI
1711 LowBitSet64 (
1712 IN UINT64 Operand
1713 );
1714
1715
1716 /**
1717 Returns the bit position of the highest bit set in a 32-bit value. Equivalent
1718 to log2(x).
1719
1720 This function computes the bit position of the highest bit set in the 32-bit
1721 value specified by Operand. If Operand is zero, then -1 is returned.
1722 Otherwise, a value between 0 and 31 is returned.
1723
1724 @param Operand The 32-bit operand to evaluate.
1725
1726 @return Position of the highest bit set in Operand if found.
1727 @retval -1 Operand is zero.
1728
1729 **/
1730 INTN
1731 EFIAPI
1732 HighBitSet32 (
1733 IN UINT32 Operand
1734 );
1735
1736
1737 /**
1738 Returns the bit position of the highest bit set in a 64-bit value. Equivalent
1739 to log2(x).
1740
1741 This function computes the bit position of the highest bit set in the 64-bit
1742 value specified by Operand. If Operand is zero, then -1 is returned.
1743 Otherwise, a value between 0 and 63 is returned.
1744
1745 @param Operand The 64-bit operand to evaluate.
1746
1747 @return Position of the highest bit set in Operand if found.
1748 @retval -1 Operand is zero.
1749
1750 **/
1751 INTN
1752 EFIAPI
1753 HighBitSet64 (
1754 IN UINT64 Operand
1755 );
1756
1757
1758 /**
1759 Returns the value of the highest bit set in a 32-bit value. Equivalent to
1760 1 << HighBitSet32(x).
1761
1762 This function computes the value of the highest bit set in the 32-bit value
1763 specified by Operand. If Operand is zero, then zero is returned.
1764
1765 @param Operand The 32-bit operand to evaluate.
1766
1767 @return 1 << HighBitSet32(Operand)
1768 @retval 0 Operand is zero.
1769
1770 **/
1771 UINT32
1772 EFIAPI
1773 GetPowerOfTwo32 (
1774 IN UINT32 Operand
1775 );
1776
1777
1778 /**
1779 Returns the value of the highest bit set in a 64-bit value. Equivalent to
1780 1 << HighBitSet64(x).
1781
1782 This function computes the value of the highest bit set in the 64-bit value
1783 specified by Operand. If Operand is zero, then zero is returned.
1784
1785 @param Operand The 64-bit operand to evaluate.
1786
1787 @return 1 << HighBitSet64(Operand)
1788 @retval 0 Operand is zero.
1789
1790 **/
1791 UINT64
1792 EFIAPI
1793 GetPowerOfTwo64 (
1794 IN UINT64 Operand
1795 );
1796
1797
1798 /**
1799 Switches the endianess of a 16-bit integer.
1800
1801 This function swaps the bytes in a 16-bit unsigned value to switch the value
1802 from little endian to big endian or vice versa. The byte swapped value is
1803 returned.
1804
1805 @param Operand A 16-bit unsigned value.
1806
1807 @return The byte swaped Operand.
1808
1809 **/
1810 UINT16
1811 EFIAPI
1812 SwapBytes16 (
1813 IN UINT16 Value
1814 );
1815
1816
1817 /**
1818 Switches the endianess of a 32-bit integer.
1819
1820 This function swaps the bytes in a 32-bit unsigned value to switch the value
1821 from little endian to big endian or vice versa. The byte swapped value is
1822 returned.
1823
1824 @param Operand A 32-bit unsigned value.
1825
1826 @return The byte swaped Operand.
1827
1828 **/
1829 UINT32
1830 EFIAPI
1831 SwapBytes32 (
1832 IN UINT32 Value
1833 );
1834
1835
1836 /**
1837 Switches the endianess of a 64-bit integer.
1838
1839 This function swaps the bytes in a 64-bit unsigned value to switch the value
1840 from little endian to big endian or vice versa. The byte swapped value is
1841 returned.
1842
1843 @param Operand A 64-bit unsigned value.
1844
1845 @return The byte swaped Operand.
1846
1847 **/
1848 UINT64
1849 EFIAPI
1850 SwapBytes64 (
1851 IN UINT64 Value
1852 );
1853
1854
1855 /**
1856 Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and
1857 generates a 64-bit unsigned result.
1858
1859 This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
1860 unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
1861 bit unsigned result is returned.
1862
1863 If the result overflows, then ASSERT().
1864
1865 @param Multiplicand A 64-bit unsigned value.
1866 @param Multiplier A 32-bit unsigned value.
1867
1868 @return Multiplicand * Multiplier
1869
1870 **/
1871 UINT64
1872 EFIAPI
1873 MultU64x32 (
1874 IN UINT64 Multiplicand,
1875 IN UINT32 Multiplier
1876 );
1877
1878
1879 /**
1880 Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and
1881 generates a 64-bit unsigned result.
1882
1883 This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
1884 unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
1885 bit unsigned result is returned.
1886
1887 If the result overflows, then ASSERT().
1888
1889 @param Multiplicand A 64-bit unsigned value.
1890 @param Multiplier A 64-bit unsigned value.
1891
1892 @return Multiplicand * Multiplier
1893
1894 **/
1895 UINT64
1896 EFIAPI
1897 MultU64x64 (
1898 IN UINT64 Multiplicand,
1899 IN UINT64 Multiplier
1900 );
1901
1902
1903 /**
1904 Multiples a 64-bit signed integer by a 64-bit signed integer and generates a
1905 64-bit signed result.
1906
1907 This function multiples the 64-bit signed value Multiplicand by the 64-bit
1908 signed value Multiplier and generates a 64-bit signed result. This 64-bit
1909 signed result is returned.
1910
1911 If the result overflows, then ASSERT().
1912
1913 @param Multiplicand A 64-bit signed value.
1914 @param Multiplier A 64-bit signed value.
1915
1916 @return Multiplicand * Multiplier
1917
1918 **/
1919 INT64
1920 EFIAPI
1921 MultS64x64 (
1922 IN INT64 Multiplicand,
1923 IN INT64 Multiplier
1924 );
1925
1926
1927 /**
1928 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
1929 a 64-bit unsigned result.
1930
1931 This function divides the 64-bit unsigned value Dividend by the 32-bit
1932 unsigned value Divisor and generates a 64-bit unsigned quotient. This
1933 function returns the 64-bit unsigned quotient.
1934
1935 If Divisor is 0, then ASSERT().
1936
1937 @param Dividend A 64-bit unsigned value.
1938 @param Divisor A 32-bit unsigned value.
1939
1940 @return Dividend / Divisor
1941
1942 **/
1943 UINT64
1944 EFIAPI
1945 DivU64x32 (
1946 IN UINT64 Dividend,
1947 IN UINT32 Divisor
1948 );
1949
1950
1951 /**
1952 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
1953 a 32-bit unsigned remainder.
1954
1955 This function divides the 64-bit unsigned value Dividend by the 32-bit
1956 unsigned value Divisor and generates a 32-bit remainder. This function
1957 returns the 32-bit unsigned remainder.
1958
1959 If Divisor is 0, then ASSERT().
1960
1961 @param Dividend A 64-bit unsigned value.
1962 @param Divisor A 32-bit unsigned value.
1963
1964 @return Dividend % Divisor
1965
1966 **/
1967 UINT32
1968 EFIAPI
1969 ModU64x32 (
1970 IN UINT64 Dividend,
1971 IN UINT32 Divisor
1972 );
1973
1974
1975 /**
1976 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
1977 a 64-bit unsigned result and an optional 32-bit unsigned remainder.
1978
1979 This function divides the 64-bit unsigned value Dividend by the 32-bit
1980 unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
1981 is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
1982 This function returns the 64-bit unsigned quotient.
1983
1984 If Divisor is 0, then ASSERT().
1985
1986 @param Dividend A 64-bit unsigned value.
1987 @param Divisor A 32-bit unsigned value.
1988 @param Remainder A pointer to a 32-bit unsigned value. This parameter is
1989 optional and may be NULL.
1990
1991 @return Dividend / Divisor
1992
1993 **/
1994 UINT64
1995 EFIAPI
1996 DivU64x32Remainder (
1997 IN UINT64 Dividend,
1998 IN UINT32 Divisor,
1999 OUT UINT32 *Remainder OPTIONAL
2000 );
2001
2002
2003 /**
2004 Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates
2005 a 64-bit unsigned result and an optional 64-bit unsigned remainder.
2006
2007 This function divides the 64-bit unsigned value Dividend by the 64-bit
2008 unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
2009 is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
2010 This function returns the 64-bit unsigned quotient.
2011
2012 If Divisor is 0, then ASSERT().
2013
2014 @param Dividend A 64-bit unsigned value.
2015 @param Divisor A 64-bit unsigned value.
2016 @param Remainder A pointer to a 64-bit unsigned value. This parameter is
2017 optional and may be NULL.
2018
2019 @return Dividend / Divisor
2020
2021 **/
2022 UINT64
2023 EFIAPI
2024 DivU64x64Remainder (
2025 IN UINT64 Dividend,
2026 IN UINT64 Divisor,
2027 OUT UINT64 *Remainder OPTIONAL
2028 );
2029
2030
2031 /**
2032 Divides a 64-bit signed integer by a 64-bit signed integer and generates a
2033 64-bit signed result and a optional 64-bit signed remainder.
2034
2035 This function divides the 64-bit signed value Dividend by the 64-bit signed
2036 value Divisor and generates a 64-bit signed quotient. If Remainder is not
2037 NULL, then the 64-bit signed remainder is returned in Remainder. This
2038 function returns the 64-bit signed quotient.
2039
2040 If Divisor is 0, then ASSERT().
2041
2042 @param Dividend A 64-bit signed value.
2043 @param Divisor A 64-bit signed value.
2044 @param Remainder A pointer to a 64-bit signed value. This parameter is
2045 optional and may be NULL.
2046
2047 @return Dividend / Divisor
2048
2049 **/
2050 INT64
2051 EFIAPI
2052 DivS64x64Remainder (
2053 IN INT64 Dividend,
2054 IN INT64 Divisor,
2055 OUT INT64 *Remainder OPTIONAL
2056 );
2057
2058
2059 /**
2060 Reads a 16-bit value from memory that may be unaligned.
2061
2062 This function returns the 16-bit value pointed to by Buffer. The function
2063 guarantees that the read operation does not produce an alignment fault.
2064
2065 If the Buffer is NULL, then ASSERT().
2066
2067 @param Buffer Pointer to a 16-bit value that may be unaligned.
2068
2069 @return *Uint16
2070
2071 **/
2072 UINT16
2073 EFIAPI
2074 ReadUnaligned16 (
2075 IN CONST UINT16 *Uint16
2076 );
2077
2078
2079 /**
2080 Writes a 16-bit value to memory that may be unaligned.
2081
2082 This function writes the 16-bit value specified by Value to Buffer. Value is
2083 returned. The function guarantees that the write operation does not produce
2084 an alignment fault.
2085
2086 If the Buffer is NULL, then ASSERT().
2087
2088 @param Buffer Pointer to a 16-bit value that may be unaligned.
2089 @param Value 16-bit value to write to Buffer.
2090
2091 @return Value
2092
2093 **/
2094 UINT16
2095 EFIAPI
2096 WriteUnaligned16 (
2097 OUT UINT16 *Uint16,
2098 IN UINT16 Value
2099 );
2100
2101
2102 /**
2103 Reads a 24-bit value from memory that may be unaligned.
2104
2105 This function returns the 24-bit value pointed to by Buffer. The function
2106 guarantees that the read operation does not produce an alignment fault.
2107
2108 If the Buffer is NULL, then ASSERT().
2109
2110 @param Buffer Pointer to a 24-bit value that may be unaligned.
2111
2112 @return The value read.
2113
2114 **/
2115 UINT32
2116 EFIAPI
2117 ReadUnaligned24 (
2118 IN CONST UINT32 *Buffer
2119 );
2120
2121
2122 /**
2123 Writes a 24-bit value to memory that may be unaligned.
2124
2125 This function writes the 24-bit value specified by Value to Buffer. Value is
2126 returned. The function guarantees that the write operation does not produce
2127 an alignment fault.
2128
2129 If the Buffer is NULL, then ASSERT().
2130
2131 @param Buffer Pointer to a 24-bit value that may be unaligned.
2132 @param Value 24-bit value to write to Buffer.
2133
2134 @return The value written.
2135
2136 **/
2137 UINT32
2138 EFIAPI
2139 WriteUnaligned24 (
2140 OUT UINT32 *Buffer,
2141 IN UINT32 Value
2142 );
2143
2144
2145 /**
2146 Reads a 32-bit value from memory that may be unaligned.
2147
2148 This function returns the 32-bit value pointed to by Buffer. The function
2149 guarantees that the read operation does not produce an alignment fault.
2150
2151 If the Buffer is NULL, then ASSERT().
2152
2153 @param Buffer Pointer to a 32-bit value that may be unaligned.
2154
2155 @return *Uint32
2156
2157 **/
2158 UINT32
2159 EFIAPI
2160 ReadUnaligned32 (
2161 IN CONST UINT32 *Uint32
2162 );
2163
2164
2165 /**
2166 Writes a 32-bit value to memory that may be unaligned.
2167
2168 This function writes the 32-bit value specified by Value to Buffer. Value is
2169 returned. The function guarantees that the write operation does not produce
2170 an alignment fault.
2171
2172 If the Buffer is NULL, then ASSERT().
2173
2174 @param Buffer Pointer to a 32-bit value that may be unaligned.
2175 @param Value 32-bit value to write to Buffer.
2176
2177 @return Value
2178
2179 **/
2180 UINT32
2181 EFIAPI
2182 WriteUnaligned32 (
2183 OUT UINT32 *Uint32,
2184 IN UINT32 Value
2185 );
2186
2187
2188 /**
2189 Reads a 64-bit value from memory that may be unaligned.
2190
2191 This function returns the 64-bit value pointed to by Buffer. The function
2192 guarantees that the read operation does not produce an alignment fault.
2193
2194 If the Buffer is NULL, then ASSERT().
2195
2196 @param Buffer Pointer to a 64-bit value that may be unaligned.
2197
2198 @return *Uint64
2199
2200 **/
2201 UINT64
2202 EFIAPI
2203 ReadUnaligned64 (
2204 IN CONST UINT64 *Uint64
2205 );
2206
2207
2208 /**
2209 Writes a 64-bit value to memory that may be unaligned.
2210
2211 This function writes the 64-bit value specified by Value to Buffer. Value is
2212 returned. The function guarantees that the write operation does not produce
2213 an alignment fault.
2214
2215 If the Buffer is NULL, then ASSERT().
2216
2217 @param Buffer Pointer to a 64-bit value that may be unaligned.
2218 @param Value 64-bit value to write to Buffer.
2219
2220 @return Value
2221
2222 **/
2223 UINT64
2224 EFIAPI
2225 WriteUnaligned64 (
2226 OUT UINT64 *Uint64,
2227 IN UINT64 Value
2228 );
2229
2230
2231 //
2232 // Bit Field Functions
2233 //
2234
2235 /**
2236 Returns a bit field from an 8-bit value.
2237
2238 Returns the bitfield specified by the StartBit and the EndBit from Operand.
2239
2240 If 8-bit operations are not supported, then ASSERT().
2241 If StartBit is greater than 7, then ASSERT().
2242 If EndBit is greater than 7, then ASSERT().
2243 If EndBit is less than StartBit, then ASSERT().
2244
2245 @param Operand Operand on which to perform the bitfield operation.
2246 @param StartBit The ordinal of the least significant bit in the bit field.
2247 Range 0..7.
2248 @param EndBit The ordinal of the most significant bit in the bit field.
2249 Range 0..7.
2250
2251 @return The bit field read.
2252
2253 **/
2254 UINT8
2255 EFIAPI
2256 BitFieldRead8 (
2257 IN UINT8 Operand,
2258 IN UINTN StartBit,
2259 IN UINTN EndBit
2260 );
2261
2262
2263 /**
2264 Writes a bit field to an 8-bit value, and returns the result.
2265
2266 Writes Value to the bit field specified by the StartBit and the EndBit in
2267 Operand. All other bits in Operand are preserved. The new 8-bit value is
2268 returned.
2269
2270 If 8-bit operations are not supported, then ASSERT().
2271 If StartBit is greater than 7, then ASSERT().
2272 If EndBit is greater than 7, then ASSERT().
2273 If EndBit is less than StartBit, then ASSERT().
2274
2275 @param Operand Operand on which to perform the bitfield operation.
2276 @param StartBit The ordinal of the least significant bit in the bit field.
2277 Range 0..7.
2278 @param EndBit The ordinal of the most significant bit in the bit field.
2279 Range 0..7.
2280 @param Value New value of the bit field.
2281
2282 @return The new 8-bit value.
2283
2284 **/
2285 UINT8
2286 EFIAPI
2287 BitFieldWrite8 (
2288 IN UINT8 Operand,
2289 IN UINTN StartBit,
2290 IN UINTN EndBit,
2291 IN UINT8 Value
2292 );
2293
2294
2295 /**
2296 Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the
2297 result.
2298
2299 Performs a bitwise inclusive OR between the bit field specified by StartBit
2300 and EndBit in Operand and the value specified by OrData. All other bits in
2301 Operand are preserved. The new 8-bit value is returned.
2302
2303 If 8-bit operations are not supported, then ASSERT().
2304 If StartBit is greater than 7, then ASSERT().
2305 If EndBit is greater than 7, then ASSERT().
2306 If EndBit is less than StartBit, then ASSERT().
2307
2308 @param Operand Operand on which to perform the bitfield operation.
2309 @param StartBit The ordinal of the least significant bit in the bit field.
2310 Range 0..7.
2311 @param EndBit The ordinal of the most significant bit in the bit field.
2312 Range 0..7.
2313 @param OrData The value to OR with the read value from the value
2314
2315 @return The new 8-bit value.
2316
2317 **/
2318 UINT8
2319 EFIAPI
2320 BitFieldOr8 (
2321 IN UINT8 Operand,
2322 IN UINTN StartBit,
2323 IN UINTN EndBit,
2324 IN UINT8 OrData
2325 );
2326
2327
2328 /**
2329 Reads a bit field from an 8-bit value, performs a bitwise AND, and returns
2330 the result.
2331
2332 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2333 in Operand and the value specified by AndData. All other bits in Operand are
2334 preserved. The new 8-bit value is returned.
2335
2336 If 8-bit operations are not supported, then ASSERT().
2337 If StartBit is greater than 7, then ASSERT().
2338 If EndBit is greater than 7, then ASSERT().
2339 If EndBit is less than StartBit, then ASSERT().
2340
2341 @param Operand Operand on which to perform the bitfield operation.
2342 @param StartBit The ordinal of the least significant bit in the bit field.
2343 Range 0..7.
2344 @param EndBit The ordinal of the most significant bit in the bit field.
2345 Range 0..7.
2346 @param AndData The value to AND with the read value from the value.
2347
2348 @return The new 8-bit value.
2349
2350 **/
2351 UINT8
2352 EFIAPI
2353 BitFieldAnd8 (
2354 IN UINT8 Operand,
2355 IN UINTN StartBit,
2356 IN UINTN EndBit,
2357 IN UINT8 AndData
2358 );
2359
2360
2361 /**
2362 Reads a bit field from an 8-bit value, performs a bitwise AND followed by a
2363 bitwise OR, and returns the result.
2364
2365 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2366 in Operand and the value specified by AndData, followed by a bitwise
2367 inclusive OR with value specified by OrData. All other bits in Operand are
2368 preserved. The new 8-bit value is returned.
2369
2370 If 8-bit operations are not supported, then ASSERT().
2371 If StartBit is greater than 7, then ASSERT().
2372 If EndBit is greater than 7, then ASSERT().
2373 If EndBit is less than StartBit, then ASSERT().
2374
2375 @param Operand Operand on which to perform the bitfield operation.
2376 @param StartBit The ordinal of the least significant bit in the bit field.
2377 Range 0..7.
2378 @param EndBit The ordinal of the most significant bit in the bit field.
2379 Range 0..7.
2380 @param AndData The value to AND with the read value from the value.
2381 @param OrData The value to OR with the result of the AND operation.
2382
2383 @return The new 8-bit value.
2384
2385 **/
2386 UINT8
2387 EFIAPI
2388 BitFieldAndThenOr8 (
2389 IN UINT8 Operand,
2390 IN UINTN StartBit,
2391 IN UINTN EndBit,
2392 IN UINT8 AndData,
2393 IN UINT8 OrData
2394 );
2395
2396
2397 /**
2398 Returns a bit field from a 16-bit value.
2399
2400 Returns the bitfield specified by the StartBit and the EndBit from Operand.
2401
2402 If 16-bit operations are not supported, then ASSERT().
2403 If StartBit is greater than 15, then ASSERT().
2404 If EndBit is greater than 15, then ASSERT().
2405 If EndBit is less than StartBit, then ASSERT().
2406
2407 @param Operand Operand on which to perform the bitfield operation.
2408 @param StartBit The ordinal of the least significant bit in the bit field.
2409 Range 0..15.
2410 @param EndBit The ordinal of the most significant bit in the bit field.
2411 Range 0..15.
2412
2413 @return The bit field read.
2414
2415 **/
2416 UINT16
2417 EFIAPI
2418 BitFieldRead16 (
2419 IN UINT16 Operand,
2420 IN UINTN StartBit,
2421 IN UINTN EndBit
2422 );
2423
2424
2425 /**
2426 Writes a bit field to a 16-bit value, and returns the result.
2427
2428 Writes Value to the bit field specified by the StartBit and the EndBit in
2429 Operand. All other bits in Operand are preserved. The new 16-bit value is
2430 returned.
2431
2432 If 16-bit operations are not supported, then ASSERT().
2433 If StartBit is greater than 15, then ASSERT().
2434 If EndBit is greater than 15, then ASSERT().
2435 If EndBit is less than StartBit, then ASSERT().
2436
2437 @param Operand Operand on which to perform the bitfield operation.
2438 @param StartBit The ordinal of the least significant bit in the bit field.
2439 Range 0..15.
2440 @param EndBit The ordinal of the most significant bit in the bit field.
2441 Range 0..15.
2442 @param Value New value of the bit field.
2443
2444 @return The new 16-bit value.
2445
2446 **/
2447 UINT16
2448 EFIAPI
2449 BitFieldWrite16 (
2450 IN UINT16 Operand,
2451 IN UINTN StartBit,
2452 IN UINTN EndBit,
2453 IN UINT16 Value
2454 );
2455
2456
2457 /**
2458 Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the
2459 result.
2460
2461 Performs a bitwise inclusive OR between the bit field specified by StartBit
2462 and EndBit in Operand and the value specified by OrData. All other bits in
2463 Operand are preserved. The new 16-bit value is returned.
2464
2465 If 16-bit operations are not supported, then ASSERT().
2466 If StartBit is greater than 15, then ASSERT().
2467 If EndBit is greater than 15, then ASSERT().
2468 If EndBit is less than StartBit, then ASSERT().
2469
2470 @param Operand Operand on which to perform the bitfield operation.
2471 @param StartBit The ordinal of the least significant bit in the bit field.
2472 Range 0..15.
2473 @param EndBit The ordinal of the most significant bit in the bit field.
2474 Range 0..15.
2475 @param OrData The value to OR with the read value from the value
2476
2477 @return The new 16-bit value.
2478
2479 **/
2480 UINT16
2481 EFIAPI
2482 BitFieldOr16 (
2483 IN UINT16 Operand,
2484 IN UINTN StartBit,
2485 IN UINTN EndBit,
2486 IN UINT16 OrData
2487 );
2488
2489
2490 /**
2491 Reads a bit field from a 16-bit value, performs a bitwise AND, and returns
2492 the result.
2493
2494 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2495 in Operand and the value specified by AndData. All other bits in Operand are
2496 preserved. The new 16-bit value is returned.
2497
2498 If 16-bit operations are not supported, then ASSERT().
2499 If StartBit is greater than 15, then ASSERT().
2500 If EndBit is greater than 15, then ASSERT().
2501 If EndBit is less than StartBit, then ASSERT().
2502
2503 @param Operand Operand on which to perform the bitfield operation.
2504 @param StartBit The ordinal of the least significant bit in the bit field.
2505 Range 0..15.
2506 @param EndBit The ordinal of the most significant bit in the bit field.
2507 Range 0..15.
2508 @param AndData The value to AND with the read value from the value
2509
2510 @return The new 16-bit value.
2511
2512 **/
2513 UINT16
2514 EFIAPI
2515 BitFieldAnd16 (
2516 IN UINT16 Operand,
2517 IN UINTN StartBit,
2518 IN UINTN EndBit,
2519 IN UINT16 AndData
2520 );
2521
2522
2523 /**
2524 Reads a bit field from a 16-bit value, performs a bitwise AND followed by a
2525 bitwise OR, and returns the result.
2526
2527 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2528 in Operand and the value specified by AndData, followed by a bitwise
2529 inclusive OR with value specified by OrData. All other bits in Operand are
2530 preserved. The new 16-bit value is returned.
2531
2532 If 16-bit operations are not supported, then ASSERT().
2533 If StartBit is greater than 15, then ASSERT().
2534 If EndBit is greater than 15, then ASSERT().
2535 If EndBit is less than StartBit, then ASSERT().
2536
2537 @param Operand Operand on which to perform the bitfield operation.
2538 @param StartBit The ordinal of the least significant bit in the bit field.
2539 Range 0..15.
2540 @param EndBit The ordinal of the most significant bit in the bit field.
2541 Range 0..15.
2542 @param AndData The value to AND with the read value from the value.
2543 @param OrData The value to OR with the result of the AND operation.
2544
2545 @return The new 16-bit value.
2546
2547 **/
2548 UINT16
2549 EFIAPI
2550 BitFieldAndThenOr16 (
2551 IN UINT16 Operand,
2552 IN UINTN StartBit,
2553 IN UINTN EndBit,
2554 IN UINT16 AndData,
2555 IN UINT16 OrData
2556 );
2557
2558
2559 /**
2560 Returns a bit field from a 32-bit value.
2561
2562 Returns the bitfield specified by the StartBit and the EndBit from Operand.
2563
2564 If 32-bit operations are not supported, then ASSERT().
2565 If StartBit is greater than 31, then ASSERT().
2566 If EndBit is greater than 31, then ASSERT().
2567 If EndBit is less than StartBit, then ASSERT().
2568
2569 @param Operand Operand on which to perform the bitfield operation.
2570 @param StartBit The ordinal of the least significant bit in the bit field.
2571 Range 0..31.
2572 @param EndBit The ordinal of the most significant bit in the bit field.
2573 Range 0..31.
2574
2575 @return The bit field read.
2576
2577 **/
2578 UINT32
2579 EFIAPI
2580 BitFieldRead32 (
2581 IN UINT32 Operand,
2582 IN UINTN StartBit,
2583 IN UINTN EndBit
2584 );
2585
2586
2587 /**
2588 Writes a bit field to a 32-bit value, and returns the result.
2589
2590 Writes Value to the bit field specified by the StartBit and the EndBit in
2591 Operand. All other bits in Operand are preserved. The new 32-bit value is
2592 returned.
2593
2594 If 32-bit operations are not supported, then ASSERT().
2595 If StartBit is greater than 31, then ASSERT().
2596 If EndBit is greater than 31, then ASSERT().
2597 If EndBit is less than StartBit, then ASSERT().
2598
2599 @param Operand Operand on which to perform the bitfield operation.
2600 @param StartBit The ordinal of the least significant bit in the bit field.
2601 Range 0..31.
2602 @param EndBit The ordinal of the most significant bit in the bit field.
2603 Range 0..31.
2604 @param Value New value of the bit field.
2605
2606 @return The new 32-bit value.
2607
2608 **/
2609 UINT32
2610 EFIAPI
2611 BitFieldWrite32 (
2612 IN UINT32 Operand,
2613 IN UINTN StartBit,
2614 IN UINTN EndBit,
2615 IN UINT32 Value
2616 );
2617
2618
2619 /**
2620 Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the
2621 result.
2622
2623 Performs a bitwise inclusive OR between the bit field specified by StartBit
2624 and EndBit in Operand and the value specified by OrData. All other bits in
2625 Operand are preserved. The new 32-bit value is returned.
2626
2627 If 32-bit operations are not supported, then ASSERT().
2628 If StartBit is greater than 31, then ASSERT().
2629 If EndBit is greater than 31, then ASSERT().
2630 If EndBit is less than StartBit, then ASSERT().
2631
2632 @param Operand Operand on which to perform the bitfield operation.
2633 @param StartBit The ordinal of the least significant bit in the bit field.
2634 Range 0..31.
2635 @param EndBit The ordinal of the most significant bit in the bit field.
2636 Range 0..31.
2637 @param OrData The value to OR with the read value from the value
2638
2639 @return The new 32-bit value.
2640
2641 **/
2642 UINT32
2643 EFIAPI
2644 BitFieldOr32 (
2645 IN UINT32 Operand,
2646 IN UINTN StartBit,
2647 IN UINTN EndBit,
2648 IN UINT32 OrData
2649 );
2650
2651
2652 /**
2653 Reads a bit field from a 32-bit value, performs a bitwise AND, and returns
2654 the result.
2655
2656 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2657 in Operand and the value specified by AndData. All other bits in Operand are
2658 preserved. The new 32-bit value is returned.
2659
2660 If 32-bit operations are not supported, then ASSERT().
2661 If StartBit is greater than 31, then ASSERT().
2662 If EndBit is greater than 31, then ASSERT().
2663 If EndBit is less than StartBit, then ASSERT().
2664
2665 @param Operand Operand on which to perform the bitfield operation.
2666 @param StartBit The ordinal of the least significant bit in the bit field.
2667 Range 0..31.
2668 @param EndBit The ordinal of the most significant bit in the bit field.
2669 Range 0..31.
2670 @param AndData The value to AND with the read value from the value
2671
2672 @return The new 32-bit value.
2673
2674 **/
2675 UINT32
2676 EFIAPI
2677 BitFieldAnd32 (
2678 IN UINT32 Operand,
2679 IN UINTN StartBit,
2680 IN UINTN EndBit,
2681 IN UINT32 AndData
2682 );
2683
2684
2685 /**
2686 Reads a bit field from a 32-bit value, performs a bitwise AND followed by a
2687 bitwise OR, and returns the result.
2688
2689 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2690 in Operand and the value specified by AndData, followed by a bitwise
2691 inclusive OR with value specified by OrData. All other bits in Operand are
2692 preserved. The new 32-bit value is returned.
2693
2694 If 32-bit operations are not supported, then ASSERT().
2695 If StartBit is greater than 31, then ASSERT().
2696 If EndBit is greater than 31, then ASSERT().
2697 If EndBit is less than StartBit, then ASSERT().
2698
2699 @param Operand Operand on which to perform the bitfield operation.
2700 @param StartBit The ordinal of the least significant bit in the bit field.
2701 Range 0..31.
2702 @param EndBit The ordinal of the most significant bit in the bit field.
2703 Range 0..31.
2704 @param AndData The value to AND with the read value from the value.
2705 @param OrData The value to OR with the result of the AND operation.
2706
2707 @return The new 32-bit value.
2708
2709 **/
2710 UINT32
2711 EFIAPI
2712 BitFieldAndThenOr32 (
2713 IN UINT32 Operand,
2714 IN UINTN StartBit,
2715 IN UINTN EndBit,
2716 IN UINT32 AndData,
2717 IN UINT32 OrData
2718 );
2719
2720
2721 /**
2722 Returns a bit field from a 64-bit value.
2723
2724 Returns the bitfield specified by the StartBit and the EndBit from Operand.
2725
2726 If 64-bit operations are not supported, then ASSERT().
2727 If StartBit is greater than 63, then ASSERT().
2728 If EndBit is greater than 63, then ASSERT().
2729 If EndBit is less than StartBit, then ASSERT().
2730
2731 @param Operand Operand on which to perform the bitfield operation.
2732 @param StartBit The ordinal of the least significant bit in the bit field.
2733 Range 0..63.
2734 @param EndBit The ordinal of the most significant bit in the bit field.
2735 Range 0..63.
2736
2737 @return The bit field read.
2738
2739 **/
2740 UINT64
2741 EFIAPI
2742 BitFieldRead64 (
2743 IN UINT64 Operand,
2744 IN UINTN StartBit,
2745 IN UINTN EndBit
2746 );
2747
2748
2749 /**
2750 Writes a bit field to a 64-bit value, and returns the result.
2751
2752 Writes Value to the bit field specified by the StartBit and the EndBit in
2753 Operand. All other bits in Operand are preserved. The new 64-bit value is
2754 returned.
2755
2756 If 64-bit operations are not supported, then ASSERT().
2757 If StartBit is greater than 63, then ASSERT().
2758 If EndBit is greater than 63, then ASSERT().
2759 If EndBit is less than StartBit, then ASSERT().
2760
2761 @param Operand Operand on which to perform the bitfield operation.
2762 @param StartBit The ordinal of the least significant bit in the bit field.
2763 Range 0..63.
2764 @param EndBit The ordinal of the most significant bit in the bit field.
2765 Range 0..63.
2766 @param Value New value of the bit field.
2767
2768 @return The new 64-bit value.
2769
2770 **/
2771 UINT64
2772 EFIAPI
2773 BitFieldWrite64 (
2774 IN UINT64 Operand,
2775 IN UINTN StartBit,
2776 IN UINTN EndBit,
2777 IN UINT64 Value
2778 );
2779
2780
2781 /**
2782 Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the
2783 result.
2784
2785 Performs a bitwise inclusive OR between the bit field specified by StartBit
2786 and EndBit in Operand and the value specified by OrData. All other bits in
2787 Operand are preserved. The new 64-bit value is returned.
2788
2789 If 64-bit operations are not supported, then ASSERT().
2790 If StartBit is greater than 63, then ASSERT().
2791 If EndBit is greater than 63, then ASSERT().
2792 If EndBit is less than StartBit, then ASSERT().
2793
2794 @param Operand Operand on which to perform the bitfield operation.
2795 @param StartBit The ordinal of the least significant bit in the bit field.
2796 Range 0..63.
2797 @param EndBit The ordinal of the most significant bit in the bit field.
2798 Range 0..63.
2799 @param OrData The value to OR with the read value from the value
2800
2801 @return The new 64-bit value.
2802
2803 **/
2804 UINT64
2805 EFIAPI
2806 BitFieldOr64 (
2807 IN UINT64 Operand,
2808 IN UINTN StartBit,
2809 IN UINTN EndBit,
2810 IN UINT64 OrData
2811 );
2812
2813
2814 /**
2815 Reads a bit field from a 64-bit value, performs a bitwise AND, and returns
2816 the result.
2817
2818 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2819 in Operand and the value specified by AndData. All other bits in Operand are
2820 preserved. The new 64-bit value is returned.
2821
2822 If 64-bit operations are not supported, then ASSERT().
2823 If StartBit is greater than 63, then ASSERT().
2824 If EndBit is greater than 63, then ASSERT().
2825 If EndBit is less than StartBit, then ASSERT().
2826
2827 @param Operand Operand on which to perform the bitfield operation.
2828 @param StartBit The ordinal of the least significant bit in the bit field.
2829 Range 0..63.
2830 @param EndBit The ordinal of the most significant bit in the bit field.
2831 Range 0..63.
2832 @param AndData The value to AND with the read value from the value
2833
2834 @return The new 64-bit value.
2835
2836 **/
2837 UINT64
2838 EFIAPI
2839 BitFieldAnd64 (
2840 IN UINT64 Operand,
2841 IN UINTN StartBit,
2842 IN UINTN EndBit,
2843 IN UINT64 AndData
2844 );
2845
2846
2847 /**
2848 Reads a bit field from a 64-bit value, performs a bitwise AND followed by a
2849 bitwise OR, and returns the result.
2850
2851 Performs a bitwise AND between the bit field specified by StartBit and EndBit
2852 in Operand and the value specified by AndData, followed by a bitwise
2853 inclusive OR with value specified by OrData. All other bits in Operand are
2854 preserved. The new 64-bit value is returned.
2855
2856 If 64-bit operations are not supported, then ASSERT().
2857 If StartBit is greater than 63, then ASSERT().
2858 If EndBit is greater than 63, then ASSERT().
2859 If EndBit is less than StartBit, then ASSERT().
2860
2861 @param Operand Operand on which to perform the bitfield operation.
2862 @param StartBit The ordinal of the least significant bit in the bit field.
2863 Range 0..63.
2864 @param EndBit The ordinal of the most significant bit in the bit field.
2865 Range 0..63.
2866 @param AndData The value to AND with the read value from the value.
2867 @param OrData The value to OR with the result of the AND operation.
2868
2869 @return The new 64-bit value.
2870
2871 **/
2872 UINT64
2873 EFIAPI
2874 BitFieldAndThenOr64 (
2875 IN UINT64 Operand,
2876 IN UINTN StartBit,
2877 IN UINTN EndBit,
2878 IN UINT64 AndData,
2879 IN UINT64 OrData
2880 );
2881
2882
2883 //
2884 // Base Library Synchronization Functions
2885 //
2886
2887 /**
2888 Retrieves the architecture specific spin lock alignment requirements for
2889 optimal spin lock performance.
2890
2891 This function retrieves the spin lock alignment requirements for optimal
2892 performance on a given CPU architecture. The spin lock alignment must be a
2893 power of two and is returned by this function. If there are no alignment
2894 requirements, then 1 must be returned. The spin lock synchronization
2895 functions must function correctly if the spin lock size and alignment values
2896 returned by this function are not used at all. These values are hints to the
2897 consumers of the spin lock synchronization functions to obtain optimal spin
2898 lock performance.
2899
2900 @return The architecture specific spin lock alignment.
2901
2902 **/
2903 UINTN
2904 EFIAPI
2905 GetSpinLockProperties (
2906 VOID
2907 );
2908
2909
2910 /**
2911 Initializes a spin lock to the released state and returns the spin lock.
2912
2913 This function initializes the spin lock specified by SpinLock to the released
2914 state, and returns SpinLock. Optimal performance can be achieved by calling
2915 GetSpinLockProperties() to determine the size and alignment requirements for
2916 SpinLock.
2917
2918 If SpinLock is NULL, then ASSERT().
2919
2920 @param SpinLock A pointer to the spin lock to initialize to the released
2921 state.
2922
2923 @return SpinLock
2924
2925 **/
2926 SPIN_LOCK *
2927 EFIAPI
2928 InitializeSpinLock (
2929 IN SPIN_LOCK *SpinLock
2930 );
2931
2932
2933 /**
2934 Waits until a spin lock can be placed in the acquired state.
2935
2936 This function checks the state of the spin lock specified by SpinLock. If
2937 SpinLock is in the released state, then this function places SpinLock in the
2938 acquired state and returns SpinLock. Otherwise, this function waits
2939 indefinitely for the spin lock to be released, and then places it in the
2940 acquired state and returns SpinLock. All state transitions of SpinLock must
2941 be performed using MP safe mechanisms.
2942
2943 If SpinLock is NULL, then ASSERT().
2944 If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
2945 If PcdSpinLockTimeout is not zero, and SpinLock is can not be acquired in
2946 PcdSpinLockTimeout microseconds, then ASSERT().
2947
2948 @param SpinLock A pointer to the spin lock to place in the acquired state.
2949
2950 @return SpinLock
2951
2952 **/
2953 SPIN_LOCK *
2954 EFIAPI
2955 AcquireSpinLock (
2956 IN SPIN_LOCK *SpinLock
2957 );
2958
2959
2960 /**
2961 Attempts to place a spin lock in the acquired state.
2962
2963 This function checks the state of the spin lock specified by SpinLock. If
2964 SpinLock is in the released state, then this function places SpinLock in the
2965 acquired state and returns TRUE. Otherwise, FALSE is returned. All state
2966 transitions of SpinLock must be performed using MP safe mechanisms.
2967
2968 If SpinLock is NULL, then ASSERT().
2969 If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
2970
2971 @param SpinLock A pointer to the spin lock to place in the acquired state.
2972
2973 @retval TRUE SpinLock was placed in the acquired state.
2974 @retval FALSE SpinLock could not be acquired.
2975
2976 **/
2977 BOOLEAN
2978 EFIAPI
2979 AcquireSpinLockOrFail (
2980 IN SPIN_LOCK *SpinLock
2981 );
2982
2983
2984 /**
2985 Releases a spin lock.
2986
2987 This function places the spin lock specified by SpinLock in the release state
2988 and returns SpinLock.
2989
2990 If SpinLock is NULL, then ASSERT().
2991 If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
2992
2993 @param SpinLock A pointer to the spin lock to release.
2994
2995 @return SpinLock
2996
2997 **/
2998 SPIN_LOCK *
2999 EFIAPI
3000 ReleaseSpinLock (
3001 IN SPIN_LOCK *SpinLock
3002 );
3003
3004
3005 /**
3006 Performs an atomic increment of an 32-bit unsigned integer.
3007
3008 Performs an atomic increment of the 32-bit unsigned integer specified by
3009 Value and returns the incremented value. The increment operation must be
3010 performed using MP safe mechanisms. The state of the return value is not
3011 guaranteed to be MP safe.
3012
3013 If Value is NULL, then ASSERT().
3014
3015 @param Value A pointer to the 32-bit value to increment.
3016
3017 @return The incremented value.
3018
3019 **/
3020 UINT32
3021 EFIAPI
3022 InterlockedIncrement (
3023 IN UINT32 *Value
3024 );
3025
3026
3027 /**
3028 Performs an atomic decrement of an 32-bit unsigned integer.
3029
3030 Performs an atomic decrement of the 32-bit unsigned integer specified by
3031 Value and returns the decremented value. The decrement operation must be
3032 performed using MP safe mechanisms. The state of the return value is not
3033 guaranteed to be MP safe.
3034
3035 If Value is NULL, then ASSERT().
3036
3037 @param Value A pointer to the 32-bit value to decrement.
3038
3039 @return The decremented value.
3040
3041 **/
3042 UINT32
3043 EFIAPI
3044 InterlockedDecrement (
3045 IN UINT32 *Value
3046 );
3047
3048
3049 /**
3050 Performs an atomic compare exchange operation on a 32-bit unsigned integer.
3051
3052 Performs an atomic compare exchange operation on the 32-bit unsigned integer
3053 specified by Value. If Value is equal to CompareValue, then Value is set to
3054 ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue,
3055 then Value is returned. The compare exchange operation must be performed using
3056 MP safe mechanisms.
3057
3058 If Value is NULL, then ASSERT().
3059
3060 @param Value A pointer to the 32-bit value for the compare exchange
3061 operation.
3062 @param CompareValue 32-bit value used in compare operation.
3063 @param ExchangeValue 32-bit value used in exchange operation.
3064
3065 @return The original *Value before exchange.
3066
3067 **/
3068 UINT32
3069 EFIAPI
3070 InterlockedCompareExchange32 (
3071 IN OUT UINT32 *Value,
3072 IN UINT32 CompareValue,
3073 IN UINT32 ExchangeValue
3074 );
3075
3076
3077 /**
3078 Performs an atomic compare exchange operation on a 64-bit unsigned integer.
3079
3080 Performs an atomic compare exchange operation on the 64-bit unsigned integer specified
3081 by Value. If Value is equal to CompareValue, then Value is set to ExchangeValue and
3082 CompareValue is returned. If Value is not equal to CompareValue, then Value is returned.
3083 The compare exchange operation must be performed using MP safe mechanisms.
3084
3085 If Value is NULL, then ASSERT().
3086
3087 @param Value A pointer to the 64-bit value for the compare exchange
3088 operation.
3089 @param CompareValue 64-bit value used in compare operation.
3090 @param ExchangeValue 64-bit value used in exchange operation.
3091
3092 @return The original *Value before exchange.
3093
3094 **/
3095 UINT64
3096 EFIAPI
3097 InterlockedCompareExchange64 (
3098 IN OUT UINT64 *Value,
3099 IN UINT64 CompareValue,
3100 IN UINT64 ExchangeValue
3101 );
3102
3103
3104 /**
3105 Performs an atomic compare exchange operation on a pointer value.
3106
3107 Performs an atomic compare exchange operation on the pointer value specified
3108 by Value. If Value is equal to CompareValue, then Value is set to
3109 ExchangeValue and CompareValue is returned. If Value is not equal to
3110 CompareValue, then Value is returned. The compare exchange operation must be
3111 performed using MP safe mechanisms.
3112
3113 If Value is NULL, then ASSERT().
3114
3115 @param Value A pointer to the pointer value for the compare exchange
3116 operation.
3117 @param CompareValue Pointer value used in compare operation.
3118 @param ExchangeValue Pointer value used in exchange operation.
3119
3120 **/
3121 VOID *
3122 EFIAPI
3123 InterlockedCompareExchangePointer (
3124 IN OUT VOID **Value,
3125 IN VOID *CompareValue,
3126 IN VOID *ExchangeValue
3127 );
3128
3129
3130 //
3131 // Base Library Checksum Functions
3132 //
3133
3134 /**
3135 Calculate the sum of all elements in a buffer in unit of UINT8.
3136 During calculation, the carry bits are dropped.
3137
3138 This function calculates the sum of all elements in a buffer
3139 in unit of UINT8. The carry bits in result of addition are dropped.
3140 The result is returned as UINT8. If Length is Zero, then Zero is
3141 returned.
3142
3143 If Buffer is NULL, then ASSERT().
3144 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3145
3146 @param Buffer Pointer to the buffer to carry out the sum operation.
3147 @param Length The size, in bytes, of Buffer .
3148
3149 @return Sum The sum of Buffer with carry bits dropped during additions.
3150
3151 **/
3152 UINT8
3153 EFIAPI
3154 CalculateSum8 (
3155 IN CONST UINT8 *Buffer,
3156 IN UINTN Length
3157 );
3158
3159
3160 /**
3161 Returns the two's complement checksum of all elements in a buffer
3162 of 8-bit values.
3163
3164 This function first calculates the sum of the 8-bit values in the
3165 buffer specified by Buffer and Length. The carry bits in the result
3166 of addition are dropped. Then, the two's complement of the sum is
3167 returned. If Length is 0, then 0 is returned.
3168
3169 If Buffer is NULL, then ASSERT().
3170 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3171
3172
3173 @param Buffer Pointer to the buffer to carry out the checksum operation.
3174 @param Length The size, in bytes, of Buffer.
3175
3176 @return Checksum The 2's complement checksum of Buffer.
3177
3178 **/
3179 UINT8
3180 EFIAPI
3181 CalculateCheckSum8 (
3182 IN CONST UINT8 *Buffer,
3183 IN UINTN Length
3184 );
3185
3186
3187 /**
3188 Returns the sum of all elements in a buffer of 16-bit values. During
3189 calculation, the carry bits are dropped.
3190
3191 This function calculates the sum of the 16-bit values in the buffer
3192 specified by Buffer and Length. The carry bits in result of addition are dropped.
3193 The 16-bit result is returned. If Length is 0, then 0 is returned.
3194
3195 If Buffer is NULL, then ASSERT().
3196 If Buffer is not aligned on a 16-bit boundary, then ASSERT().
3197 If Length is not aligned on a 16-bit boundary, then ASSERT().
3198 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3199
3200 @param Buffer Pointer to the buffer to carry out the sum operation.
3201 @param Length The size, in bytes, of Buffer.
3202
3203 @return Sum The sum of Buffer with carry bits dropped during additions.
3204
3205 **/
3206 UINT16
3207 EFIAPI
3208 CalculateSum16 (
3209 IN CONST UINT16 *Buffer,
3210 IN UINTN Length
3211 );
3212
3213
3214 /**
3215 Returns the two's complement checksum of all elements in a buffer of
3216 16-bit values.
3217
3218 This function first calculates the sum of the 16-bit values in the buffer
3219 specified by Buffer and Length. The carry bits in the result of addition
3220 are dropped. Then, the two's complement of the sum is returned. If Length
3221 is 0, then 0 is returned.
3222
3223 If Buffer is NULL, then ASSERT().
3224 If Buffer is not aligned on a 16-bit boundary, then ASSERT().
3225 If Length is not aligned on a 16-bit boundary, then ASSERT().
3226 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3227
3228 @param Buffer Pointer to the buffer to carry out the checksum operation.
3229 @param Length The size, in bytes, of Buffer.
3230
3231 @return Checksum The 2's complement checksum of Buffer.
3232
3233 **/
3234 UINT16
3235 EFIAPI
3236 CalculateCheckSum16 (
3237 IN CONST UINT16 *Buffer,
3238 IN UINTN Length
3239 );
3240
3241
3242 /**
3243 Returns the sum of all elements in a buffer of 32-bit values. During
3244 calculation, the carry bits are dropped.
3245
3246 This function calculates the sum of the 32-bit values in the buffer
3247 specified by Buffer and Length. The carry bits in result of addition are dropped.
3248 The 32-bit result is returned. If Length is 0, then 0 is returned.
3249
3250 If Buffer is NULL, then ASSERT().
3251 If Buffer is not aligned on a 32-bit boundary, then ASSERT().
3252 If Length is not aligned on a 32-bit boundary, then ASSERT().
3253 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3254
3255 @param Buffer Pointer to the buffer to carry out the sum operation.
3256 @param Length The size, in bytes, of Buffer.
3257
3258 @return Sum The sum of Buffer with carry bits dropped during additions.
3259
3260 **/
3261 UINT32
3262 EFIAPI
3263 CalculateSum32 (
3264 IN CONST UINT32 *Buffer,
3265 IN UINTN Length
3266 );
3267
3268
3269 /**
3270 Returns the two's complement checksum of all elements in a buffer of
3271 32-bit values.
3272
3273 This function first calculates the sum of the 32-bit values in the buffer
3274 specified by Buffer and Length. The carry bits in the result of addition
3275 are dropped. Then, the two's complement of the sum is returned. If Length
3276 is 0, then 0 is returned.
3277
3278 If Buffer is NULL, then ASSERT().
3279 If Buffer is not aligned on a 32-bit boundary, then ASSERT().
3280 If Length is not aligned on a 32-bit boundary, then ASSERT().
3281 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3282
3283 @param Buffer Pointer to the buffer to carry out the checksum operation.
3284 @param Length The size, in bytes, of Buffer.
3285
3286 @return Checksum The 2's complement checksum of Buffer.
3287
3288 **/
3289 UINT32
3290 EFIAPI
3291 CalculateCheckSum32 (
3292 IN CONST UINT32 *Buffer,
3293 IN UINTN Length
3294 );
3295
3296
3297 /**
3298 Returns the sum of all elements in a buffer of 64-bit values. During
3299 calculation, the carry bits are dropped.
3300
3301 This function calculates the sum of the 64-bit values in the buffer
3302 specified by Buffer and Length. The carry bits in result of addition are dropped.
3303 The 64-bit result is returned. If Length is 0, then 0 is returned.
3304
3305 If Buffer is NULL, then ASSERT().
3306 If Buffer is not aligned on a 64-bit boundary, then ASSERT().
3307 If Length is not aligned on a 64-bit boundary, then ASSERT().
3308 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3309
3310 @param Buffer Pointer to the buffer to carry out the sum operation.
3311 @param Length The size, in bytes, of Buffer.
3312
3313 @return Sum The sum of Buffer with carry bits dropped during additions.
3314
3315 **/
3316 UINT64
3317 EFIAPI
3318 CalculateSum64 (
3319 IN CONST UINT64 *Buffer,
3320 IN UINTN Length
3321 );
3322
3323
3324 /**
3325 Returns the two's complement checksum of all elements in a buffer of
3326 64-bit values.
3327
3328 This function first calculates the sum of the 64-bit values in the buffer
3329 specified by Buffer and Length. The carry bits in the result of addition
3330 are dropped. Then, the two's complement of the sum is returned. If Length
3331 is 0, then 0 is returned.
3332
3333 If Buffer is NULL, then ASSERT().
3334 If Buffer is not aligned on a 64-bit boundary, then ASSERT().
3335 If Length is not aligned on a 64-bit boundary, then ASSERT().
3336 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
3337
3338 @param Buffer Pointer to the buffer to carry out the checksum operation.
3339 @param Length The size, in bytes, of Buffer.
3340
3341 @return Checksum The 2's complement checksum of Buffer.
3342
3343 **/
3344 UINT64
3345 EFIAPI
3346 CalculateCheckSum64 (
3347 IN CONST UINT64 *Buffer,
3348 IN UINTN Length
3349 );
3350
3351
3352 //
3353 // Base Library CPU Functions
3354 //
3355 typedef
3356 VOID
3357 (EFIAPI *SWITCH_STACK_ENTRY_POINT) (
3358 IN VOID *Context1, OPTIONAL
3359 IN VOID *Context2 OPTIONAL
3360 );
3361
3362
3363 /**
3364 Used to serialize load and store operations.
3365
3366 All loads and stores that proceed calls to this function are guaranteed to be
3367 globally visible when this function returns.
3368
3369 **/
3370 VOID
3371 EFIAPI
3372 MemoryFence (
3373 VOID
3374 );
3375
3376
3377 /**
3378 Saves the current CPU context that can be restored with a call to LongJump()
3379 and returns 0.
3380
3381 Saves the current CPU context in the buffer specified by JumpBuffer and
3382 returns 0. The initial call to SetJump() must always return 0. Subsequent
3383 calls to LongJump() cause a non-zero value to be returned by SetJump().
3384
3385 If JumpBuffer is NULL, then ASSERT().
3386 For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
3387
3388 @param JumpBuffer A pointer to CPU context buffer.
3389
3390 @retval 0 Indicates a return from SetJump().
3391
3392 **/
3393 UINTN
3394 EFIAPI
3395 SetJump (
3396 OUT BASE_LIBRARY_JUMP_BUFFER *JumpBuffer
3397 );
3398
3399
3400 /**
3401 Restores the CPU context that was saved with SetJump().
3402
3403 Restores the CPU context from the buffer specified by JumpBuffer. This
3404 function never returns to the caller. Instead is resumes execution based on
3405 the state of JumpBuffer.
3406
3407 If JumpBuffer is NULL, then ASSERT().
3408 For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
3409 If Value is 0, then ASSERT().
3410
3411 @param JumpBuffer A pointer to CPU context buffer.
3412 @param Value The value to return when the SetJump() context is
3413 restored and must be non-zero.
3414
3415 **/
3416 VOID
3417 EFIAPI
3418 LongJump (
3419 IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
3420 IN UINTN Value
3421 );
3422
3423
3424 /**
3425 Enables CPU interrupts.
3426
3427 Enables CPU interrupts.
3428
3429 **/
3430 VOID
3431 EFIAPI
3432 EnableInterrupts (
3433 VOID
3434 );
3435
3436
3437 /**
3438 Disables CPU interrupts.
3439
3440 Disables CPU interrupts.
3441
3442 **/
3443 VOID
3444 EFIAPI
3445 DisableInterrupts (
3446 VOID
3447 );
3448
3449
3450 /**
3451 Disables CPU interrupts and returns the interrupt state prior to the disable
3452 operation.
3453
3454 Disables CPU interrupts and returns the interrupt state prior to the disable
3455 operation.
3456
3457 @retval TRUE CPU interrupts were enabled on entry to this call.
3458 @retval FALSE CPU interrupts were disabled on entry to this call.
3459
3460 **/
3461 BOOLEAN
3462 EFIAPI
3463 SaveAndDisableInterrupts (
3464 VOID
3465 );
3466
3467
3468 /**
3469 Enables CPU interrupts for the smallest window required to capture any
3470 pending interrupts.
3471
3472 Enables CPU interrupts for the smallest window required to capture any
3473 pending interrupts.
3474
3475 **/
3476 VOID
3477 EFIAPI
3478 EnableDisableInterrupts (
3479 VOID
3480 );
3481
3482
3483 /**
3484 Retrieves the current CPU interrupt state.
3485
3486 Retrieves the current CPU interrupt state. Returns TRUE is interrupts are
3487 currently enabled. Otherwise returns FALSE.
3488
3489 @retval TRUE CPU interrupts are enabled.
3490 @retval FALSE CPU interrupts are disabled.
3491
3492 **/
3493 BOOLEAN
3494 EFIAPI
3495 GetInterruptState (
3496 VOID
3497 );
3498
3499
3500 /**
3501 Set the current CPU interrupt state.
3502
3503 Sets the current CPU interrupt state to the state specified by
3504 InterruptState. If InterruptState is TRUE, then interrupts are enabled. If
3505 InterruptState is FALSE, then interrupts are disabled. InterruptState is
3506 returned.
3507
3508 @param InterruptState TRUE if interrupts should enabled. FALSE if
3509 interrupts should be disabled.
3510
3511 @return InterruptState
3512
3513 **/
3514 BOOLEAN
3515 EFIAPI
3516 SetInterruptState (
3517 IN BOOLEAN InterruptState
3518 );
3519
3520
3521 /**
3522 Places the CPU in a sleep state until an interrupt is received.
3523
3524 Places the CPU in a sleep state until an interrupt is received. If interrupts
3525 are disabled prior to calling this function, then the CPU will be placed in a
3526 sleep state indefinitely.
3527
3528 **/
3529 VOID
3530 EFIAPI
3531 CpuSleep (
3532 VOID
3533 );
3534
3535
3536 /**
3537 Requests CPU to pause for a short period of time.
3538
3539 Requests CPU to pause for a short period of time. Typically used in MP
3540 systems to prevent memory starvation while waiting for a spin lock.
3541
3542 **/
3543 VOID
3544 EFIAPI
3545 CpuPause (
3546 VOID
3547 );
3548
3549
3550 /**
3551 Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
3552
3553 Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
3554
3555 **/
3556 VOID
3557 EFIAPI
3558 CpuFlushTlb (
3559 VOID
3560 );
3561
3562
3563 /**
3564 Transfers control to a function starting with a new stack.
3565
3566 Transfers control to the function specified by EntryPoint using the
3567 new stack specified by NewStack and passing in the parameters specified
3568 by Context1 and Context2. Context1 and Context2 are optional and may
3569 be NULL. The function EntryPoint must never return. This function
3570 supports a variable number of arguments following the NewStack parameter.
3571 These additional arguments are ignored on IA-32, x64, and EBC.
3572 IPF CPUs expect one additional parameter of type VOID * that specifies
3573 the new backing store pointer.
3574
3575 If EntryPoint is NULL, then ASSERT().
3576 If NewStack is NULL, then ASSERT().
3577
3578 @param EntryPoint A pointer to function to call with the new stack.
3579 @param Context1 A pointer to the context to pass into the EntryPoint
3580 function.
3581 @param Context2 A pointer to the context to pass into the EntryPoint
3582 function.
3583 @param NewStack A pointer to the new stack to use for the EntryPoint
3584 function.
3585
3586 **/
3587 VOID
3588 EFIAPI
3589 SwitchStack (
3590 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
3591 IN VOID *Context1, OPTIONAL
3592 IN VOID *Context2, OPTIONAL
3593 IN VOID *NewStack,
3594 ...
3595 );
3596
3597
3598 /**
3599 Generates a breakpoint on the CPU.
3600
3601 Generates a breakpoint on the CPU. The breakpoint must be implemented such
3602 that code can resume normal execution after the breakpoint.
3603
3604 **/
3605 VOID
3606 EFIAPI
3607 CpuBreakpoint (
3608 VOID
3609 );
3610
3611
3612 /**
3613 Executes an infinite loop.
3614
3615 Forces the CPU to execute an infinite loop. A debugger may be used to skip
3616 past the loop and the code that follows the loop must execute properly. This
3617 implies that the infinite loop must not cause the code that follow it to be
3618 optimized away.
3619
3620 **/
3621 VOID
3622 EFIAPI
3623 CpuDeadLoop (
3624 VOID
3625 );
3626
3627
3628 #if defined (MDE_CPU_IPF)
3629
3630 #include <IndustryStandard/Pal.h>
3631
3632 /**
3633 Flush a range of cache lines in the cache coherency domain of the calling
3634 CPU.
3635
3636 Invalidates the cache lines specified by Address and Length. If Address is
3637 not aligned on a cache line boundary, then entire cache line containing
3638 Address is invalidated. If Address + Length is not aligned on a cache line
3639 boundary, then the entire instruction cache line containing Address + Length
3640 -1 is invalidated. This function may choose to invalidate the entire
3641 instruction cache if that is more efficient than invalidating the specified
3642 range. If Length is 0, the no instruction cache lines are invalidated.
3643 Address is returned.
3644
3645 If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().
3646
3647 @param Address The base address of the instruction lines to invalidate. If
3648 the CPU is in a physical addressing mode, then Address is a
3649 physical address. If the CPU is in a virtual addressing mode,
3650 then Address is a virtual address.
3651
3652 @param Length The number of bytes to invalidate from the instruction cache.
3653
3654 @return Address
3655
3656 **/
3657 VOID *
3658 EFIAPI
3659 IpfFlushCacheRange (
3660 IN VOID *Address,
3661 IN UINTN Length
3662 );
3663
3664
3665 /**
3666 Executes a FC instruction
3667 Executes a FC instruction on the cache line specified by Address.
3668 The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
3669 An implementation may flush a larger region. This function is only available on IPF.
3670
3671 @param Address The Address of cache line to be flushed.
3672
3673 @return The address of FC instruction executed.
3674
3675 **/
3676 UINT64
3677 EFIAPI
3678 AsmFc (
3679 IN UINT64 Address
3680 );
3681
3682
3683 /**
3684 Executes a FC.I instruction.
3685 Executes a FC.I instruction on the cache line specified by Address.
3686 The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
3687 An implementation may flush a larger region. This function is only available on IPF.
3688
3689 @param Address The Address of cache line to be flushed.
3690
3691 @return The address of FC.I instruction executed.
3692
3693 **/
3694 UINT64
3695 EFIAPI
3696 AsmFci (
3697 IN UINT64 Address
3698 );
3699
3700
3701 /**
3702 Reads the current value of a Processor Identifier Register (CPUID).
3703 The Index of largest implemented CPUID (One less than the number of implemented CPUID
3704 registers) is determined by CPUID [3] bits {7:0}.
3705 No parameter checking is performed on Index. If the Index value is beyond the
3706 implemented CPUID register range, a Reserved Register/Field fault may occur. The caller
3707 must either guarantee that Index is valid, or the caller must set up fault handlers to
3708 catch the faults. This function is only available on IPF.
3709
3710 @param Index The 8-bit Processor Identifier Register index to read.
3711
3712 @return The current value of Processor Identifier Register specified by Index.
3713
3714 **/
3715 UINT64
3716 EFIAPI
3717 AsmReadCpuid (
3718 IN UINT8 Index
3719 );
3720
3721
3722 /**
3723 Reads the current value of 64-bit Processor Status Register (PSR).
3724 This function is only available on IPF.
3725
3726 @return The current value of PSR.
3727
3728 **/
3729 UINT64
3730 EFIAPI
3731 AsmReadPsr (
3732 VOID
3733 );
3734
3735
3736 /**
3737 Writes the current value of 64-bit Processor Status Register (PSR).
3738 No parameter checking is performed on Value. All bits of Value corresponding to
3739 reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur. The caller must either guarantee that Value is valid, or the caller must set up fault handlers to catch the faults.
3740 This function is only available on IPF.
3741
3742 @param Value The 64-bit value to write to PSR.
3743
3744 @return The 64-bit value written to the PSR.
3745
3746 **/
3747 UINT64
3748 EFIAPI
3749 AsmWritePsr (
3750 IN UINT64 Value
3751 );
3752
3753
3754 /**
3755 Reads the current value of 64-bit Kernel Register #0 (KR0).
3756 This function is only available on IPF.
3757
3758 @return The current value of KR0.
3759
3760 **/
3761 UINT64
3762 EFIAPI
3763 AsmReadKr0 (
3764 VOID
3765 );
3766
3767
3768 /**
3769 Reads the current value of 64-bit Kernel Register #1 (KR1).
3770 This function is only available on IPF.
3771
3772 @return The current value of KR1.
3773
3774 **/
3775 UINT64
3776 EFIAPI
3777 AsmReadKr1 (
3778 VOID
3779 );
3780
3781
3782 /**
3783 Reads the current value of 64-bit Kernel Register #2 (KR2).
3784 This function is only available on IPF.
3785
3786 @return The current value of KR2.
3787
3788 **/
3789 UINT64
3790 EFIAPI
3791 AsmReadKr2 (
3792 VOID
3793 );
3794
3795
3796 /**
3797 Reads the current value of 64-bit Kernel Register #3 (KR3).
3798 This function is only available on IPF.
3799
3800 @return The current value of KR3.
3801
3802 **/
3803 UINT64
3804 EFIAPI
3805 AsmReadKr3 (
3806 VOID
3807 );
3808
3809
3810 /**
3811 Reads the current value of 64-bit Kernel Register #4 (KR4).
3812 This function is only available on IPF.
3813
3814 @return The current value of KR4.
3815
3816 **/
3817 UINT64
3818 EFIAPI
3819 AsmReadKr4 (
3820 VOID
3821 );
3822
3823
3824 /**
3825 Reads the current value of 64-bit Kernel Register #5 (KR5).
3826 This function is only available on IPF.
3827
3828 @return The current value of KR5.
3829
3830 **/
3831 UINT64
3832 EFIAPI
3833 AsmReadKr5 (
3834 VOID
3835 );
3836
3837
3838 /**
3839 Reads the current value of 64-bit Kernel Register #6 (KR6).
3840 This function is only available on IPF.
3841
3842 @return The current value of KR6.
3843
3844 **/
3845 UINT64
3846 EFIAPI
3847 AsmReadKr6 (
3848 VOID
3849 );
3850
3851
3852 /**
3853 Reads the current value of 64-bit Kernel Register #7 (KR7).
3854 This function is only available on IPF.
3855
3856 @return The current value of KR7.
3857
3858 **/
3859 UINT64
3860 EFIAPI
3861 AsmReadKr7 (
3862 VOID
3863 );
3864
3865
3866 /**
3867 Write the current value of 64-bit Kernel Register #0 (KR0).
3868 This function is only available on IPF.
3869
3870 @param Value The 64-bit value to write to KR0.
3871
3872 @return The 64-bit value written to the KR0.
3873
3874 **/
3875 UINT64
3876 EFIAPI
3877 AsmWriteKr0 (
3878 IN UINT64 Value
3879 );
3880
3881
3882 /**
3883 Write the current value of 64-bit Kernel Register #1 (KR1).
3884 This function is only available on IPF.
3885
3886 @param Value The 64-bit value to write to KR1.
3887
3888 @return The 64-bit value written to the KR1.
3889
3890 **/
3891 UINT64
3892 EFIAPI
3893 AsmWriteKr1 (
3894 IN UINT64 Value
3895 );
3896
3897
3898 /**
3899 Write the current value of 64-bit Kernel Register #2 (KR2).
3900 This function is only available on IPF.
3901
3902 @param Value The 64-bit value to write to KR2.
3903
3904 @return The 64-bit value written to the KR2.
3905
3906 **/
3907 UINT64
3908 EFIAPI
3909 AsmWriteKr2 (
3910 IN UINT64 Value
3911 );
3912
3913
3914 /**
3915 Write the current value of 64-bit Kernel Register #3 (KR3).
3916 This function is only available on IPF.
3917
3918 @param Value The 64-bit value to write to KR3.
3919
3920 @return The 64-bit value written to the KR3.
3921
3922 **/
3923 UINT64
3924 EFIAPI
3925 AsmWriteKr3 (
3926 IN UINT64 Value
3927 );
3928
3929
3930 /**
3931 Write the current value of 64-bit Kernel Register #4 (KR4).
3932 This function is only available on IPF.
3933
3934 @param Value The 64-bit value to write to KR4.
3935
3936 @return The 64-bit value written to the KR4.
3937
3938 **/
3939 UINT64
3940 EFIAPI
3941 AsmWriteKr4 (
3942 IN UINT64 Value
3943 );
3944
3945
3946 /**
3947 Write the current value of 64-bit Kernel Register #5 (KR5).
3948 This function is only available on IPF.
3949
3950 @param Value The 64-bit value to write to KR5.
3951
3952 @return The 64-bit value written to the KR5.
3953
3954 **/
3955 UINT64
3956 EFIAPI
3957 AsmWriteKr5 (
3958 IN UINT64 Value
3959 );
3960
3961
3962 /**
3963 Write the current value of 64-bit Kernel Register #6 (KR6).
3964 This function is only available on IPF.
3965
3966 @param Value The 64-bit value to write to KR6.
3967
3968 @return The 64-bit value written to the KR6.
3969
3970 **/
3971 UINT64
3972 EFIAPI
3973 AsmWriteKr6 (
3974 IN UINT64 Value
3975 );
3976
3977
3978 /**
3979 Write the current value of 64-bit Kernel Register #7 (KR7).
3980 This function is only available on IPF.
3981
3982 @param Value The 64-bit value to write to KR7.
3983
3984 @return The 64-bit value written to the KR7.
3985
3986 **/
3987 UINT64
3988 EFIAPI
3989 AsmWriteKr7 (
3990 IN UINT64 Value
3991 );
3992
3993
3994 /**
3995 Reads the current value of Interval Timer Counter Register (ITC).
3996 This function is only available on IPF.
3997
3998 @return The current value of ITC.
3999
4000 **/
4001 UINT64
4002 EFIAPI
4003 AsmReadItc (
4004 VOID
4005 );
4006
4007
4008 /**
4009 Reads the current value of Interval Timer Vector Register (ITV).
4010 This function is only available on IPF.
4011
4012 @return The current value of ITV.
4013
4014 **/
4015 UINT64
4016 EFIAPI
4017 AsmReadItv (
4018 VOID
4019 );
4020
4021
4022 /**
4023 Reads the current value of Interval Timer Match Register (ITM).
4024 This function is only available on IPF.
4025
4026 @return The current value of ITM.
4027 **/
4028 UINT64
4029 EFIAPI
4030 AsmReadItm (
4031 VOID
4032 );
4033
4034
4035 /**
4036 Writes the current value of 64-bit Interval Timer Counter Register (ITC).
4037 This function is only available on IPF.
4038
4039 @param Value The 64-bit value to write to ITC.
4040
4041 @return The 64-bit value written to the ITC.
4042
4043 **/
4044 UINT64
4045 EFIAPI
4046 AsmWriteItc (
4047 IN UINT64 Value
4048 );
4049
4050
4051 /**
4052 Writes the current value of 64-bit Interval Timer Match Register (ITM).
4053 This function is only available on IPF.
4054
4055 @param Value The 64-bit value to write to ITM.
4056
4057 @return The 64-bit value written to the ITM.
4058
4059 **/
4060 UINT64
4061 EFIAPI
4062 AsmWriteItm (
4063 IN UINT64 Value
4064 );
4065
4066
4067 /**
4068 Writes the current value of 64-bit Interval Timer Vector Register (ITV).
4069 No parameter checking is performed on Value. All bits of Value corresponding to
4070 reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.
4071 The caller must either guarantee that Value is valid, or the caller must set up
4072 fault handlers to catch the faults.
4073 This function is only available on IPF.
4074
4075 @param Value The 64-bit value to write to ITV.
4076
4077 @return The 64-bit value written to the ITV.
4078
4079 **/
4080 UINT64
4081 EFIAPI
4082 AsmWriteItv (
4083 IN UINT64 Value
4084 );
4085
4086
4087 /**
4088 Reads the current value of Default Control Register (DCR).
4089 This function is only available on IPF.
4090
4091 @return The current value of DCR.
4092
4093 **/
4094 UINT64
4095 EFIAPI
4096 AsmReadDcr (
4097 VOID
4098 );
4099
4100
4101 /**
4102 Reads the current value of Interruption Vector Address Register (IVA).
4103 This function is only available on IPF.
4104
4105 @return The current value of IVA.
4106 **/
4107 UINT64
4108 EFIAPI
4109 AsmReadIva (
4110 VOID
4111 );
4112
4113
4114 /**
4115 Reads the current value of Page Table Address Register (PTA).
4116 This function is only available on IPF.
4117
4118 @return The current value of PTA.
4119
4120 **/
4121 UINT64
4122 EFIAPI
4123 AsmReadPta (
4124 VOID
4125 );
4126
4127
4128 /**
4129 Writes the current value of 64-bit Default Control Register (DCR).
4130 No parameter checking is performed on Value. All bits of Value corresponding to
4131 reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
4132 The caller must either guarantee that Value is valid, or the caller must set up
4133 fault handlers to catch the faults.
4134 This function is only available on IPF.
4135
4136 @param Value The 64-bit value to write to DCR.
4137
4138 @return The 64-bit value written to the DCR.
4139
4140 **/
4141 UINT64
4142 EFIAPI
4143 AsmWriteDcr (
4144 IN UINT64 Value
4145 );
4146
4147
4148 /**
4149 Writes the current value of 64-bit Interruption Vector Address Register (IVA).
4150 The size of vector table is 32 K bytes and is 32 K bytes aligned
4151 the low 15 bits of Value is ignored when written.
4152 This function is only available on IPF.
4153
4154 @param Value The 64-bit value to write to IVA.
4155
4156 @return The 64-bit value written to the IVA.
4157
4158 **/
4159 UINT64
4160 EFIAPI
4161 AsmWriteIva (
4162 IN UINT64 Value
4163 );
4164
4165
4166 /**
4167 Writes the current value of 64-bit Page Table Address Register (PTA).
4168 No parameter checking is performed on Value. All bits of Value corresponding to
4169 reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
4170 The caller must either guarantee that Value is valid, or the caller must set up
4171 fault handlers to catch the faults.
4172 This function is only available on IPF.
4173
4174 @param Value The 64-bit value to write to PTA.
4175
4176 @return The 64-bit value written to the PTA.
4177 **/
4178 UINT64
4179 EFIAPI
4180 AsmWritePta (
4181 IN UINT64 Value
4182 );
4183
4184
4185 /**
4186 Reads the current value of Local Interrupt ID Register (LID).
4187 This function is only available on IPF.
4188
4189 @return The current value of LID.
4190
4191 **/
4192 UINT64
4193 EFIAPI
4194 AsmReadLid (
4195 VOID
4196 );
4197
4198
4199 /**
4200 Reads the current value of External Interrupt Vector Register (IVR).
4201 This function is only available on IPF.
4202
4203 @return The current value of IVR.
4204
4205 **/
4206 UINT64
4207 EFIAPI
4208 AsmReadIvr (
4209 VOID
4210 );
4211
4212
4213 /**
4214 Reads the current value of Task Priority Register (TPR).
4215 This function is only available on IPF.
4216
4217 @return The current value of TPR.
4218
4219 **/
4220 UINT64
4221 EFIAPI
4222 AsmReadTpr (
4223 VOID
4224 );
4225
4226
4227 /**
4228 Reads the current value of External Interrupt Request Register #0 (IRR0).
4229 This function is only available on IPF.
4230
4231 @return The current value of IRR0.
4232
4233 **/
4234 UINT64
4235 EFIAPI
4236 AsmReadIrr0 (
4237 VOID
4238 );
4239
4240
4241 /**
4242 Reads the current value of External Interrupt Request Register #1 (IRR1).
4243 This function is only available on IPF.
4244
4245 @return The current value of IRR1.
4246
4247 **/
4248 UINT64
4249 EFIAPI
4250 AsmReadIrr1 (
4251 VOID
4252 );
4253
4254
4255 /**
4256 Reads the current value of External Interrupt Request Register #2 (IRR2).
4257 This function is only available on IPF.
4258
4259 @return The current value of IRR2.
4260
4261 **/
4262 UINT64
4263 EFIAPI
4264 AsmReadIrr2 (
4265 VOID
4266 );
4267
4268
4269 /**
4270 Reads the current value of External Interrupt Request Register #3 (IRR3).
4271 This function is only available on IPF.
4272
4273 @return The current value of IRR3.
4274
4275 **/
4276 UINT64
4277 EFIAPI
4278 AsmReadIrr3 (
4279 VOID
4280 );
4281
4282
4283 /**
4284 Reads the current value of Performance Monitor Vector Register (PMV).
4285 This function is only available on IPF.
4286
4287 @return The current value of PMV.
4288
4289 **/
4290 UINT64
4291 EFIAPI
4292 AsmReadPmv (
4293 VOID
4294 );
4295
4296
4297 /**
4298 Reads the current value of Corrected Machine Check Vector Register (CMCV).
4299 This function is only available on IPF.
4300
4301 @return The current value of CMCV.
4302
4303 **/
4304 UINT64
4305 EFIAPI
4306 AsmReadCmcv (
4307 VOID
4308 );
4309
4310
4311 /**
4312 Reads the current value of Local Redirection Register #0 (LRR0).
4313 This function is only available on IPF.
4314
4315 @return The current value of LRR0.
4316
4317 **/
4318 UINT64
4319 EFIAPI
4320 AsmReadLrr0 (
4321 VOID
4322 );
4323
4324
4325 /**
4326 Reads the current value of Local Redirection Register #1 (LRR1).
4327 This function is only available on IPF.
4328
4329 @return The current value of LRR1.
4330
4331 **/
4332 UINT64
4333 EFIAPI
4334 AsmReadLrr1 (
4335 VOID
4336 );
4337
4338
4339 /**
4340 Writes the current value of 64-bit Page Local Interrupt ID Register (LID).
4341 No parameter checking is performed on Value. All bits of Value corresponding to
4342 reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.
4343 The caller must either guarantee that Value is valid, or the caller must set up
4344 fault handlers to catch the faults.
4345 This function is only available on IPF.
4346
4347 @param Value The 64-bit value to write to LID.
4348
4349 @return The 64-bit value written to the LID.
4350
4351 **/
4352 UINT64
4353 EFIAPI
4354 AsmWriteLid (
4355 IN UINT64 Value
4356 );
4357
4358
4359 /**
4360 Writes the current value of 64-bit Task Priority Register (TPR).
4361 No parameter checking is performed on Value. All bits of Value corresponding to
4362 reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.
4363 The caller must either guarantee that Value is valid, or the caller must set up
4364 fault handlers to catch the faults.
4365 This function is only available on IPF.
4366
4367 @param Value The 64-bit value to write to TPR.
4368
4369 @return The 64-bit value written to the TPR.
4370
4371 **/
4372 UINT64
4373 EFIAPI
4374 AsmWriteTpr (
4375 IN UINT64 Value
4376 );
4377
4378
4379 /**
4380 Performs a write operation on End OF External Interrupt Register (EOI).
4381 Writes a value of 0 to the EOI Register. This function is only available on IPF.
4382
4383 **/
4384 VOID
4385 EFIAPI
4386 AsmWriteEoi (
4387 VOID
4388 );
4389
4390
4391 /**
4392 Writes the current value of 64-bit Performance Monitor Vector Register (PMV).
4393 No parameter checking is performed on Value. All bits of Value corresponding
4394 to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.
4395 The caller must either guarantee that Value is valid, or the caller must set up
4396 fault handlers to catch the faults.
4397 This function is only available on IPF.
4398
4399 @param Value The 64-bit value to write to PMV.
4400
4401 @return The 64-bit value written to the PMV.
4402
4403 **/
4404 UINT64
4405 EFIAPI
4406 AsmWritePmv (
4407 IN UINT64 Value
4408 );
4409
4410
4411 /**
4412 Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).
4413 No parameter checking is performed on Value. All bits of Value corresponding
4414 to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.
4415 The caller must either guarantee that Value is valid, or the caller must set up
4416 fault handlers to catch the faults.
4417 This function is only available on IPF.
4418
4419 @param Value The 64-bit value to write to CMCV.
4420
4421 @return The 64-bit value written to the CMCV.
4422
4423 **/
4424 UINT64
4425 EFIAPI
4426 AsmWriteCmcv (
4427 IN UINT64 Value
4428 );
4429
4430
4431 /**
4432 Writes the current value of 64-bit Local Redirection Register #0 (LRR0).
4433 No parameter checking is performed on Value. All bits of Value corresponding
4434 to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.
4435 The caller must either guarantee that Value is valid, or the caller must set up
4436 fault handlers to catch the faults.
4437 This function is only available on IPF.
4438
4439 @param Value The 64-bit value to write to LRR0.
4440
4441 @return The 64-bit value written to the LRR0.
4442
4443 **/
4444 UINT64
4445 EFIAPI
4446 AsmWriteLrr0 (
4447 IN UINT64 Value
4448 );
4449
4450
4451 /**
4452 Writes the current value of 64-bit Local Redirection Register #1 (LRR1).
4453 No parameter checking is performed on Value. All bits of Value corresponding
4454 to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.
4455 The caller must either guarantee that Value is valid, or the caller must
4456 set up fault handlers to catch the faults.
4457 This function is only available on IPF.
4458
4459 @param Value The 64-bit value to write to LRR1.
4460
4461 @return The 64-bit value written to the LRR1.
4462
4463 **/
4464 UINT64
4465 EFIAPI
4466 AsmWriteLrr1 (
4467 IN UINT64 Value
4468 );
4469
4470
4471 /**
4472 Reads the current value of Instruction Breakpoint Register (IBR).
4473
4474 The Instruction Breakpoint Registers are used in pairs. The even numbered
4475 registers contain breakpoint addresses, and the odd numbered registers contain
4476 breakpoint mask conditions. At least 4 instruction registers pairs are implemented
4477 on all processor models. Implemented registers are contiguous starting with
4478 register 0. No parameter checking is performed on Index, and if the Index value
4479 is beyond the implemented IBR register range, a Reserved Register/Field fault may
4480 occur. The caller must either guarantee that Index is valid, or the caller must
4481 set up fault handlers to catch the faults.
4482 This function is only available on IPF.
4483
4484 @param Index The 8-bit Instruction Breakpoint Register index to read.
4485
4486 @return The current value of Instruction Breakpoint Register specified by Index.
4487
4488 **/
4489 UINT64
4490 EFIAPI
4491 AsmReadIbr (
4492 IN UINT8 Index
4493 );
4494
4495
4496 /**
4497 Reads the current value of Data Breakpoint Register (DBR).
4498
4499 The Data Breakpoint Registers are used in pairs. The even numbered registers
4500 contain breakpoint addresses, and odd numbered registers contain breakpoint
4501 mask conditions. At least 4 data registers pairs are implemented on all processor
4502 models. Implemented registers are contiguous starting with register 0.
4503 No parameter checking is performed on Index. If the Index value is beyond
4504 the implemented DBR register range, a Reserved Register/Field fault may occur.
4505 The caller must either guarantee that Index is valid, or the caller must set up
4506 fault handlers to catch the faults.
4507 This function is only available on IPF.
4508
4509 @param Index The 8-bit Data Breakpoint Register index to read.
4510
4511 @return The current value of Data Breakpoint Register specified by Index.
4512
4513 **/
4514 UINT64
4515 EFIAPI
4516 AsmReadDbr (
4517 IN UINT8 Index
4518 );
4519
4520
4521 /**
4522 Reads the current value of Performance Monitor Configuration Register (PMC).
4523
4524 All processor implementations provide at least 4 performance counters
4525 (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
4526 status registers (PMC [0]¡­ PMC [3]). Processor implementations may provide
4527 additional implementation-dependent PMC and PMD to increase the number of
4528 ¡®generic¡¯ performance counters (PMC/PMD pairs). The remainder of PMC and PMD
4529 register set is implementation dependent. No parameter checking is performed
4530 on Index. If the Index value is beyond the implemented PMC register range,
4531 zero value will be returned.
4532 This function is only available on IPF.
4533
4534 @param Index The 8-bit Performance Monitor Configuration Register index to read.
4535
4536 @return The current value of Performance Monitor Configuration Register
4537 specified by Index.
4538
4539 **/
4540 UINT64
4541 EFIAPI
4542 AsmReadPmc (
4543 IN UINT8 Index
4544 );
4545
4546
4547 /**
4548 Reads the current value of Performance Monitor Data Register (PMD).
4549
4550 All processor implementations provide at least 4 performance counters
4551 (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter
4552 overflow status registers (PMC [0]¡­ PMC [3]). Processor implementations may
4553 provide additional implementation-dependent PMC and PMD to increase the number
4554 of ¡®generic¡¯ performance counters (PMC/PMD pairs). The remainder of PMC and PMD
4555 register set is implementation dependent. No parameter checking is performed
4556 on Index. If the Index value is beyond the implemented PMD register range,
4557 zero value will be returned.
4558 This function is only available on IPF.
4559
4560 @param Index The 8-bit Performance Monitor Data Register index to read.
4561
4562 @return The current value of Performance Monitor Data Register specified by Index.
4563
4564 **/
4565 UINT64
4566 EFIAPI
4567 AsmReadPmd (
4568 IN UINT8 Index
4569 );
4570
4571
4572 /**
4573 Writes the current value of 64-bit Instruction Breakpoint Register (IBR).
4574
4575 Writes current value of Instruction Breakpoint Register specified by Index.
4576 The Instruction Breakpoint Registers are used in pairs. The even numbered
4577 registers contain breakpoint addresses, and odd numbered registers contain
4578 breakpoint mask conditions. At least 4 instruction registers pairs are implemented
4579 on all processor models. Implemented registers are contiguous starting with
4580 register 0. No parameter checking is performed on Index. If the Index value
4581 is beyond the implemented IBR register range, a Reserved Register/Field fault may
4582 occur. The caller must either guarantee that Index is valid, or the caller must
4583 set up fault handlers to catch the faults.
4584 This function is only available on IPF.
4585
4586 @param Index The 8-bit Instruction Breakpoint Register index to write.
4587 @param Value The 64-bit value to write to IBR.
4588
4589 @return The 64-bit value written to the IBR.
4590
4591 **/
4592 UINT64
4593 EFIAPI
4594 AsmWriteIbr (
4595 IN UINT8 Index,
4596 IN UINT64 Value
4597 );
4598
4599
4600 /**
4601 Writes the current value of 64-bit Data Breakpoint Register (DBR).
4602
4603 Writes current value of Data Breakpoint Register specified by Index.
4604 The Data Breakpoint Registers are used in pairs. The even numbered registers
4605 contain breakpoint addresses, and odd numbered registers contain breakpoint
4606 mask conditions. At least 4 data registers pairs are implemented on all processor
4607 models. Implemented registers are contiguous starting with register 0. No parameter
4608 checking is performed on Index. If the Index value is beyond the implemented
4609 DBR register range, a Reserved Register/Field fault may occur. The caller must
4610 either guarantee that Index is valid, or the caller must set up fault handlers to
4611 catch the faults.
4612 This function is only available on IPF.
4613
4614 @param Index The 8-bit Data Breakpoint Register index to write.
4615 @param Value The 64-bit value to write to DBR.
4616
4617 @return The 64-bit value written to the DBR.
4618
4619 **/
4620 UINT64
4621 EFIAPI
4622 AsmWriteDbr (
4623 IN UINT8 Index,
4624 IN UINT64 Value
4625 );
4626
4627
4628 /**
4629 Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).
4630
4631 Writes current value of Performance Monitor Configuration Register specified by Index.
4632 All processor implementations provide at least 4 performance counters
4633 (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow status
4634 registers (PMC [0]¡­ PMC [3]). Processor implementations may provide additional
4635 implementation-dependent PMC and PMD to increase the number of ¡®generic¡¯ performance
4636 counters (PMC/PMD pairs). The remainder of PMC and PMD register set is implementation
4637 dependent. No parameter checking is performed on Index. If the Index value is
4638 beyond the implemented PMC register range, the write is ignored.
4639 This function is only available on IPF.
4640
4641 @param Index The 8-bit Performance Monitor Configuration Register index to write.
4642 @param Value The 64-bit value to write to PMC.
4643
4644 @return The 64-bit value written to the PMC.
4645
4646 **/
4647 UINT64
4648 EFIAPI
4649 AsmWritePmc (
4650 IN UINT8 Index,
4651 IN UINT64 Value
4652 );
4653
4654
4655 /**
4656 Writes the current value of 64-bit Performance Monitor Data Register (PMD).
4657
4658 Writes current value of Performance Monitor Data Register specified by Index.
4659 All processor implementations provide at least 4 performance counters
4660 (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
4661 status registers (PMC [0]¡­ PMC [3]). Processor implementations may provide
4662 additional implementation-dependent PMC and PMD to increase the number of ¡®generic¡¯
4663 performance counters (PMC/PMD pairs). The remainder of PMC and PMD register set
4664 is implementation dependent. No parameter checking is performed on Index. If the
4665 Index value is beyond the implemented PMD register range, the write is ignored.
4666 This function is only available on IPF.
4667
4668 @param Index The 8-bit Performance Monitor Data Register index to write.
4669 @param Value The 64-bit value to write to PMD.
4670
4671 @return The 64-bit value written to the PMD.
4672
4673 **/
4674 UINT64
4675 EFIAPI
4676 AsmWritePmd (
4677 IN UINT8 Index,
4678 IN UINT64 Value
4679 );
4680
4681
4682 /**
4683 Reads the current value of 64-bit Global Pointer (GP).
4684
4685 Reads and returns the current value of GP.
4686 This function is only available on IPF.
4687
4688 @return The current value of GP.
4689
4690 **/
4691 UINT64
4692 EFIAPI
4693 AsmReadGp (
4694 VOID
4695 );
4696
4697
4698 /**
4699 Write the current value of 64-bit Global Pointer (GP).
4700
4701 Writes the current value of GP. The 64-bit value written to the GP is returned.
4702 No parameter checking is performed on Value.
4703 This function is only available on IPF.
4704
4705 @param Value The 64-bit value to write to GP.
4706
4707 @return The 64-bit value written to the GP.
4708
4709 **/
4710 UINT64
4711 EFIAPI
4712 AsmWriteGp (
4713 IN UINT64 Value
4714 );
4715
4716
4717 /**
4718 Reads the current value of 64-bit Stack Pointer (SP).
4719
4720 Reads and returns the current value of SP.
4721 This function is only available on IPF.
4722
4723 @return The current value of SP.
4724
4725 **/
4726 UINT64
4727 EFIAPI
4728 AsmReadSp (
4729 VOID
4730 );
4731
4732
4733 /**
4734 Determines if the CPU is currently executing in virtual, physical, or mixed mode.
4735
4736 Determines the current execution mode of the CPU.
4737 If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
4738 If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
4739 If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
4740 and -1 is returned.
4741 This function is only available on IPF.
4742
4743 @return 1 The CPU is in virtual mode.
4744 @return 0 The CPU is in physical mode.
4745 @return -1 The CPU is in mixed mode.
4746
4747 **/
4748 INT64
4749 EFIAPI
4750 AsmCpuVirtual (
4751 VOID
4752 );
4753
4754
4755 /**
4756 Makes a PAL procedure call.
4757
4758 This is a wrapper function to make a PAL procedure call. Based on the Index
4759 value this API will make static or stacked PAL call. The following table
4760 describes the usage of PAL Procedure Index Assignment. Architected procedures
4761 may be designated as required or optional. If a PAL procedure is specified
4762 as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
4763 Status field of the PAL_CALL_RETURN structure.
4764 This indicates that the procedure is not present in this PAL implementation.
4765 It is the caller¡¯s responsibility to check for this return code after calling
4766 any optional PAL procedure.
4767 No parameter checking is performed on the 5 input parameters, but there are
4768 some common rules that the caller should follow when making a PAL call. Any
4769 address passed to PAL as buffers for return parameters must be 8-byte aligned.
4770 Unaligned addresses may cause undefined results. For those parameters defined
4771 as reserved or some fields defined as reserved must be zero filled or the invalid
4772 argument return value may be returned or undefined result may occur during the
4773 execution of the procedure. If the PalEntryPoint does not point to a valid
4774 PAL entry point then the system behavior is undefined. This function is only
4775 available on IPF.
4776
4777 @param PalEntryPoint The PAL procedure calls entry point.
4778 @param Index The PAL procedure Index number.
4779 @param Arg2 The 2nd parameter for PAL procedure calls.
4780 @param Arg3 The 3rd parameter for PAL procedure calls.
4781 @param Arg4 The 4th parameter for PAL procedure calls.
4782
4783 @return structure returned from the PAL Call procedure, including the status and return value.
4784
4785 **/
4786 PAL_CALL_RETURN
4787 EFIAPI
4788 AsmPalCall (
4789 IN UINT64 PalEntryPoint,
4790 IN UINT64 Index,
4791 IN UINT64 Arg2,
4792 IN UINT64 Arg3,
4793 IN UINT64 Arg4
4794 );
4795
4796
4797 /**
4798 Transfers control to a function starting with a new stack.
4799
4800 Transfers control to the function specified by EntryPoint using the new stack
4801 specified by NewStack and passing in the parameters specified by Context1 and
4802 Context2. Context1 and Context2 are optional and may be NULL. The function
4803 EntryPoint must never return.
4804
4805 If EntryPoint is NULL, then ASSERT().
4806 If NewStack is NULL, then ASSERT().
4807
4808 @param EntryPoint A pointer to function to call with the new stack.
4809 @param Context1 A pointer to the context to pass into the EntryPoint
4810 function.
4811 @param Context2 A pointer to the context to pass into the EntryPoint
4812 function.
4813 @param NewStack A pointer to the new stack to use for the EntryPoint
4814 function.
4815 @param NewBsp A pointer to the new memory location for RSE backing
4816 store.
4817
4818 **/
4819 VOID
4820 EFIAPI
4821 AsmSwitchStackAndBackingStore (
4822 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
4823 IN VOID *Context1, OPTIONAL
4824 IN VOID *Context2, OPTIONAL
4825 IN VOID *NewStack,
4826 IN VOID *NewBsp
4827 );
4828
4829
4830 //
4831 // Bugbug: This call should be removed after
4832 // the PalCall Instance issue has been fixed.
4833 //
4834 /**
4835 Performs a PAL call using static calling convention.
4836
4837 An internal function to perform a PAL call using static calling convention.
4838
4839 @param PalEntryPoint The entry point address of PAL. The address in ar.kr5
4840 would be used if this parameter were NULL on input.
4841 @param Arg1 The first argument of a PAL call.
4842 @param Arg1 The second argument of a PAL call.
4843 @param Arg1 The third argument of a PAL call.
4844 @param Arg1 The fourth argument of a PAL call.
4845
4846 @return The values returned in r8, r9, r10 and r11.
4847
4848 **/
4849 PAL_CALL_RETURN
4850 PalCallStatic (
4851 IN CONST VOID *PalEntryPoint,
4852 IN UINT64 Arg1,
4853 IN UINT64 Arg2,
4854 IN UINT64 Arg3,
4855 IN UINT64 Arg4
4856 );
4857
4858
4859 #elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
4860 //
4861 // IA32 and X64 Specific Functions
4862 //
4863 //
4864 // Byte packed structure for 16-bit Real Mode EFLAGS
4865 //
4866 typedef union {
4867 struct {
4868 UINT32 CF:1; // Carry Flag
4869 UINT32 Reserved_0:1; // Reserved
4870 UINT32 PF:1; // Parity Flag
4871 UINT32 Reserved_1:1; // Reserved
4872 UINT32 AF:1; // Auxiliary Carry Flag
4873 UINT32 Reserved_2:1; // Reserved
4874 UINT32 ZF:1; // Zero Flag
4875 UINT32 SF:1; // Sign Flag
4876 UINT32 TF:1; // Trap Flag
4877 UINT32 IF:1; // Interrupt Enable Flag
4878 UINT32 DF:1; // Direction Flag
4879 UINT32 OF:1; // Overflow Flag
4880 UINT32 IOPL:2; // I/O Privilege Level
4881 UINT32 NT:1; // Nested Task
4882 UINT32 Reserved_3:1; // Reserved
4883 } Bits;
4884 UINT16 Uint16;
4885 } IA32_FLAGS16;
4886
4887 //
4888 // Byte packed structure for EFLAGS/RFLAGS
4889 // 32-bits on IA-32
4890 // 64-bits on X64. The upper 32-bits on X64 are reserved
4891 //
4892 typedef union {
4893 struct {
4894 UINT32 CF:1; // Carry Flag
4895 UINT32 Reserved_0:1; // Reserved
4896 UINT32 PF:1; // Parity Flag
4897 UINT32 Reserved_1:1; // Reserved
4898 UINT32 AF:1; // Auxiliary Carry Flag
4899 UINT32 Reserved_2:1; // Reserved
4900 UINT32 ZF:1; // Zero Flag
4901 UINT32 SF:1; // Sign Flag
4902 UINT32 TF:1; // Trap Flag
4903 UINT32 IF:1; // Interrupt Enable Flag
4904 UINT32 DF:1; // Direction Flag
4905 UINT32 OF:1; // Overflow Flag
4906 UINT32 IOPL:2; // I/O Privilege Level
4907 UINT32 NT:1; // Nested Task
4908 UINT32 Reserved_3:1; // Reserved
4909 UINT32 RF:1; // Resume Flag
4910 UINT32 VM:1; // Virtual 8086 Mode
4911 UINT32 AC:1; // Alignment Check
4912 UINT32 VIF:1; // Virtual Interrupt Flag
4913 UINT32 VIP:1; // Virtual Interrupt Pending
4914 UINT32 ID:1; // ID Flag
4915 UINT32 Reserved_4:10; // Reserved
4916 } Bits;
4917 UINTN UintN;
4918 } IA32_EFLAGS32;
4919
4920 //
4921 // Byte packed structure for Control Register 0 (CR0)
4922 // 32-bits on IA-32
4923 // 64-bits on X64. The upper 32-bits on X64 are reserved
4924 //
4925 typedef union {
4926 struct {
4927 UINT32 PE:1; // Protection Enable
4928 UINT32 MP:1; // Monitor Coprocessor
4929 UINT32 EM:1; // Emulation
4930 UINT32 TS:1; // Task Switched
4931 UINT32 ET:1; // Extension Type
4932 UINT32 NE:1; // Numeric Error
4933 UINT32 Reserved_0:10; // Reserved
4934 UINT32 WP:1; // Write Protect
4935 UINT32 Reserved_1:1; // Reserved
4936 UINT32 AM:1; // Alignment Mask
4937 UINT32 Reserved_2:10; // Reserved
4938 UINT32 NW:1; // Mot Write-through
4939 UINT32 CD:1; // Cache Disable
4940 UINT32 PG:1; // Paging
4941 } Bits;
4942 UINTN UintN;
4943 } IA32_CR0;
4944
4945 //
4946 // Byte packed structure for Control Register 4 (CR4)
4947 // 32-bits on IA-32
4948 // 64-bits on X64. The upper 32-bits on X64 are reserved
4949 //
4950 typedef union {
4951 struct {
4952 UINT32 VME:1; // Virtual-8086 Mode Extensions
4953 UINT32 PVI:1; // Protected-Mode Virtual Interrupts
4954 UINT32 TSD:1; // Time Stamp Disable
4955 UINT32 DE:1; // Debugging Extensions
4956 UINT32 PSE:1; // Page Size Extensions
4957 UINT32 PAE:1; // Physical Address Extension
4958 UINT32 MCE:1; // Machine Check Enable
4959 UINT32 PGE:1; // Page Global Enable
4960 UINT32 PCE:1; // Performance Monitoring Counter
4961 // Enable
4962 UINT32 OSFXSR:1; // Operating System Support for
4963 // FXSAVE and FXRSTOR instructions
4964 UINT32 OSXMMEXCPT:1; // Operating System Support for
4965 // Unmasked SIMD Floating Point
4966 // Exceptions
4967 UINT32 Reserved_0:2; // Reserved
4968 UINT32 VMXE:1; // VMX Enable
4969 UINT32 Reserved_1:18; // Reseved
4970 } Bits;
4971 UINTN UintN;
4972 } IA32_CR4;
4973
4974 //
4975 // Byte packed structure for an IDTR, GDTR, LDTR descriptor
4976 /// @bug How to make this structure byte-packed in a compiler independent way?
4977 //
4978 #pragma pack (1)
4979 typedef struct {
4980 UINT16 Limit;
4981 UINTN Base;
4982 } IA32_DESCRIPTOR;
4983 #pragma pack ()
4984
4985 #define IA32_IDT_GATE_TYPE_TASK 0x85
4986 #define IA32_IDT_GATE_TYPE_INTERRUPT_16 0x86
4987 #define IA32_IDT_GATE_TYPE_TRAP_16 0x87
4988 #define IA32_IDT_GATE_TYPE_INTERRUPT_32 0x8E
4989 #define IA32_IDT_GATE_TYPE_TRAP_32 0x8F
4990
4991 //
4992 // Byte packed structure for an Interrupt Gate Descriptor
4993 //
4994 typedef union {
4995 struct {
4996 UINT32 OffsetLow:16; // Offset bits 15..0
4997 UINT32 Selector:16; // Selector
4998 UINT32 Reserved_0:8; // Reserved
4999 UINT32 GateType:8; // Gate Type. See #defines above
5000 UINT32 OffsetHigh:16; // Offset bits 31..16
5001 } Bits;
5002 UINT64 Uint64;
5003 } IA32_IDT_GATE_DESCRIPTOR;
5004
5005 //
5006 // Byte packed structure for an FP/SSE/SSE2 context
5007 //
5008 typedef struct {
5009 UINT8 Buffer[512];
5010 } IA32_FX_BUFFER;
5011
5012 //
5013 // Structures for the 16-bit real mode thunks
5014 //
5015 typedef struct {
5016 UINT32 Reserved1;
5017 UINT32 Reserved2;
5018 UINT32 Reserved3;
5019 UINT32 Reserved4;
5020 UINT8 BL;
5021 UINT8 BH;
5022 UINT16 Reserved5;
5023 UINT8 DL;
5024 UINT8 DH;
5025 UINT16 Reserved6;
5026 UINT8 CL;
5027 UINT8 CH;
5028 UINT16 Reserved7;
5029 UINT8 AL;
5030 UINT8 AH;
5031 UINT16 Reserved8;
5032 } IA32_BYTE_REGS;
5033
5034 typedef struct {
5035 UINT16 DI;
5036 UINT16 Reserved1;
5037 UINT16 SI;
5038 UINT16 Reserved2;
5039 UINT16 BP;
5040 UINT16 Reserved3;
5041 UINT16 SP;
5042 UINT16 Reserved4;
5043 UINT16 BX;
5044 UINT16 Reserved5;
5045 UINT16 DX;
5046 UINT16 Reserved6;
5047 UINT16 CX;
5048 UINT16 Reserved7;
5049 UINT16 AX;
5050 UINT16 Reserved8;
5051 } IA32_WORD_REGS;
5052
5053 typedef struct {
5054 UINT32 EDI;
5055 UINT32 ESI;
5056 UINT32 EBP;
5057 UINT32 ESP;
5058 UINT32 EBX;
5059 UINT32 EDX;
5060 UINT32 ECX;
5061 UINT32 EAX;
5062 UINT16 DS;
5063 UINT16 ES;
5064 UINT16 FS;
5065 UINT16 GS;
5066 IA32_EFLAGS32 EFLAGS;
5067 UINT32 Eip;
5068 UINT16 CS;
5069 UINT16 SS;
5070 } IA32_DWORD_REGS;
5071
5072 typedef union {
5073 IA32_DWORD_REGS E;
5074 IA32_WORD_REGS X;
5075 IA32_BYTE_REGS H;
5076 } IA32_REGISTER_SET;
5077
5078 //
5079 // Byte packed structure for an 16-bit real mode thunks
5080 //
5081 typedef struct {
5082 IA32_REGISTER_SET *RealModeState;
5083 VOID *RealModeBuffer;
5084 UINT32 RealModeBufferSize;
5085 UINT32 ThunkAttributes;
5086 } THUNK_CONTEXT;
5087
5088 #define THUNK_ATTRIBUTE_BIG_REAL_MODE 0x00000001
5089 #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 0x00000002
5090 #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004
5091
5092 /**
5093 Retrieves CPUID information.
5094
5095 Executes the CPUID instruction with EAX set to the value specified by Index.
5096 This function always returns Index.
5097 If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
5098 If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
5099 If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
5100 If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
5101 This function is only available on IA-32 and X64.
5102
5103 @param Index The 32-bit value to load into EAX prior to invoking the CPUID
5104 instruction.
5105 @param Eax Pointer to the 32-bit EAX value returned by the CPUID
5106 instruction. This is an optional parameter that may be NULL.
5107 @param Ebx Pointer to the 32-bit EBX value returned by the CPUID
5108 instruction. This is an optional parameter that may be NULL.
5109 @param Ecx Pointer to the 32-bit ECX value returned by the CPUID
5110 instruction. This is an optional parameter that may be NULL.
5111 @param Edx Pointer to the 32-bit EDX value returned by the CPUID
5112 instruction. This is an optional parameter that may be NULL.
5113
5114 @return Index
5115
5116 **/
5117 UINT32
5118 EFIAPI
5119 AsmCpuid (
5120 IN UINT32 Index,
5121 OUT UINT32 *Eax, OPTIONAL
5122 OUT UINT32 *Ebx, OPTIONAL
5123 OUT UINT32 *Ecx, OPTIONAL
5124 OUT UINT32 *Edx OPTIONAL
5125 );
5126
5127
5128 /**
5129 Retrieves CPUID information using an extended leaf identifier.
5130
5131 Executes the CPUID instruction with EAX set to the value specified by Index
5132 and ECX set to the value specified by SubIndex. This function always returns
5133 Index. This function is only available on IA-32 and x64.
5134
5135 If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
5136 If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
5137 If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
5138 If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
5139
5140 @param Index The 32-bit value to load into EAX prior to invoking the
5141 CPUID instruction.
5142 @param SubIndex The 32-bit value to load into ECX prior to invoking the
5143 CPUID instruction.
5144 @param Eax Pointer to the 32-bit EAX value returned by the CPUID
5145 instruction. This is an optional parameter that may be
5146 NULL.
5147 @param Ebx Pointer to the 32-bit EBX value returned by the CPUID
5148 instruction. This is an optional parameter that may be
5149 NULL.
5150 @param Ecx Pointer to the 32-bit ECX value returned by the CPUID
5151 instruction. This is an optional parameter that may be
5152 NULL.
5153 @param Edx Pointer to the 32-bit EDX value returned by the CPUID
5154 instruction. This is an optional parameter that may be
5155 NULL.
5156
5157 @return Index
5158
5159 **/
5160 UINT32
5161 EFIAPI
5162 AsmCpuidEx (
5163 IN UINT32 Index,
5164 IN UINT32 SubIndex,
5165 OUT UINT32 *Eax, OPTIONAL
5166 OUT UINT32 *Ebx, OPTIONAL
5167 OUT UINT32 *Ecx, OPTIONAL
5168 OUT UINT32 *Edx OPTIONAL
5169 );
5170
5171
5172 /**
5173 Returns the lower 32-bits of a Machine Specific Register(MSR).
5174
5175 Reads and returns the lower 32-bits of the MSR specified by Index.
5176 No parameter checking is performed on Index, and some Index values may cause
5177 CPU exceptions. The caller must either guarantee that Index is valid, or the
5178 caller must set up exception handlers to catch the exceptions. This function
5179 is only available on IA-32 and X64.
5180
5181 @param Index The 32-bit MSR index to read.
5182
5183 @return The lower 32 bits of the MSR identified by Index.
5184
5185 **/
5186 UINT32
5187 EFIAPI
5188 AsmReadMsr32 (
5189 IN UINT32 Index
5190 );
5191
5192
5193 /**
5194 Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).
5195
5196 Writes the 32-bit value specified by Value to the MSR specified by Index. The
5197 upper 32-bits of the MSR write are set to zero. The 32-bit value written to
5198 the MSR is returned. No parameter checking is performed on Index or Value,
5199 and some of these may cause CPU exceptions. The caller must either guarantee
5200 that Index and Value are valid, or the caller must establish proper exception
5201 handlers. This function is only available on IA-32 and X64.
5202
5203 @param Index The 32-bit MSR index to write.
5204 @param Value The 32-bit value to write to the MSR.
5205
5206 @return Value
5207
5208 **/
5209 UINT32
5210 EFIAPI
5211 AsmWriteMsr32 (
5212 IN UINT32 Index,
5213 IN UINT32 Value
5214 );
5215
5216
5217 /**
5218 Reads a 64-bit MSR, performs a bitwise inclusive OR on the lower 32-bits, and
5219 writes the result back to the 64-bit MSR.
5220
5221 Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
5222 between the lower 32-bits of the read result and the value specified by
5223 OrData, and writes the result to the 64-bit MSR specified by Index. The lower
5224 32-bits of the value written to the MSR is returned. No parameter checking is
5225 performed on Index or OrData, and some of these may cause CPU exceptions. The
5226 caller must either guarantee that Index and OrData are valid, or the caller
5227 must establish proper exception handlers. This function is only available on
5228 IA-32 and X64.
5229
5230 @param Index The 32-bit MSR index to write.
5231 @param OrData The value to OR with the read value from the MSR.
5232
5233 @return The lower 32-bit value written to the MSR.
5234
5235 **/
5236 UINT32
5237 EFIAPI
5238 AsmMsrOr32 (
5239 IN UINT32 Index,
5240 IN UINT32 OrData
5241 );
5242
5243
5244 /**
5245 Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
5246 the result back to the 64-bit MSR.
5247
5248 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
5249 lower 32-bits of the read result and the value specified by AndData, and
5250 writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
5251 the value written to the MSR is returned. No parameter checking is performed
5252 on Index or AndData, and some of these may cause CPU exceptions. The caller
5253 must either guarantee that Index and AndData are valid, or the caller must
5254 establish proper exception handlers. This function is only available on IA-32
5255 and X64.
5256
5257 @param Index The 32-bit MSR index to write.
5258 @param AndData The value to AND with the read value from the MSR.
5259
5260 @return The lower 32-bit value written to the MSR.
5261
5262 **/
5263 UINT32
5264 EFIAPI
5265 AsmMsrAnd32 (
5266 IN UINT32 Index,
5267 IN UINT32 AndData
5268 );
5269
5270
5271 /**
5272 Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive OR
5273 on the lower 32-bits, and writes the result back to the 64-bit MSR.
5274
5275 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
5276 lower 32-bits of the read result and the value specified by AndData
5277 preserving the upper 32-bits, performs a bitwise inclusive OR between the
5278 result of the AND operation and the value specified by OrData, and writes the
5279 result to the 64-bit MSR specified by Address. The lower 32-bits of the value
5280 written to the MSR is returned. No parameter checking is performed on Index,
5281 AndData, or OrData, and some of these may cause CPU exceptions. The caller
5282 must either guarantee that Index, AndData, and OrData are valid, or the
5283 caller must establish proper exception handlers. This function is only
5284 available on IA-32 and X64.
5285
5286 @param Index The 32-bit MSR index to write.
5287 @param AndData The value to AND with the read value from the MSR.
5288 @param OrData The value to OR with the result of the AND operation.
5289
5290 @return The lower 32-bit value written to the MSR.
5291
5292 **/
5293 UINT32
5294 EFIAPI
5295 AsmMsrAndThenOr32 (
5296 IN UINT32 Index,
5297 IN UINT32 AndData,
5298 IN UINT32 OrData
5299 );
5300
5301
5302 /**
5303 Reads a bit field of an MSR.
5304
5305 Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
5306 specified by the StartBit and the EndBit. The value of the bit field is
5307 returned. The caller must either guarantee that Index is valid, or the caller
5308 must set up exception handlers to catch the exceptions. This function is only
5309 available on IA-32 and X64.
5310
5311 If StartBit is greater than 31, then ASSERT().
5312 If EndBit is greater than 31, then ASSERT().
5313 If EndBit is less than StartBit, then ASSERT().
5314
5315 @param Index The 32-bit MSR index to read.
5316 @param StartBit The ordinal of the least significant bit in the bit field.
5317 Range 0..31.
5318 @param EndBit The ordinal of the most significant bit in the bit field.
5319 Range 0..31.
5320
5321 @return The bit field read from the MSR.
5322
5323 **/
5324 UINT32
5325 EFIAPI
5326 AsmMsrBitFieldRead32 (
5327 IN UINT32 Index,
5328 IN UINTN StartBit,
5329 IN UINTN EndBit
5330 );
5331
5332
5333 /**
5334 Writes a bit field to an MSR.
5335
5336 Writes Value to a bit field in the lower 32-bits of a 64-bit MSR. The bit
5337 field is specified by the StartBit and the EndBit. All other bits in the
5338 destination MSR are preserved. The lower 32-bits of the MSR written is
5339 returned. Extra left bits in Value are stripped. The caller must either
5340 guarantee that Index and the data written is valid, or the caller must set up
5341 exception handlers to catch the exceptions. This function is only available
5342 on IA-32 and X64.
5343
5344 If StartBit is greater than 31, then ASSERT().
5345 If EndBit is greater than 31, then ASSERT().
5346 If EndBit is less than StartBit, then ASSERT().
5347
5348 @param Index The 32-bit MSR index to write.
5349 @param StartBit The ordinal of the least significant bit in the bit field.
5350 Range 0..31.
5351 @param EndBit The ordinal of the most significant bit in the bit field.
5352 Range 0..31.
5353 @param Value New value of the bit field.
5354
5355 @return The lower 32-bit of the value written to the MSR.
5356
5357 **/
5358 UINT32
5359 EFIAPI
5360 AsmMsrBitFieldWrite32 (
5361 IN UINT32 Index,
5362 IN UINTN StartBit,
5363 IN UINTN EndBit,
5364 IN UINT32 Value
5365 );
5366
5367
5368 /**
5369 Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
5370 result back to the bit field in the 64-bit MSR.
5371
5372 Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
5373 between the read result and the value specified by OrData, and writes the
5374 result to the 64-bit MSR specified by Index. The lower 32-bits of the value
5375 written to the MSR are returned. Extra left bits in OrData are stripped. The
5376 caller must either guarantee that Index and the data written is valid, or
5377 the caller must set up exception handlers to catch the exceptions. This
5378 function is only available on IA-32 and X64.
5379
5380 If StartBit is greater than 31, then ASSERT().
5381 If EndBit is greater than 31, then ASSERT().
5382 If EndBit is less than StartBit, then ASSERT().
5383
5384 @param Index The 32-bit MSR index to write.
5385 @param StartBit The ordinal of the least significant bit in the bit field.
5386 Range 0..31.
5387 @param EndBit The ordinal of the most significant bit in the bit field.
5388 Range 0..31.
5389 @param OrData The value to OR with the read value from the MSR.
5390
5391 @return The lower 32-bit of the value written to the MSR.
5392
5393 **/
5394 UINT32
5395 EFIAPI
5396 AsmMsrBitFieldOr32 (
5397 IN UINT32 Index,
5398 IN UINTN StartBit,
5399 IN UINTN EndBit,
5400 IN UINT32 OrData
5401 );
5402
5403
5404 /**
5405 Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
5406 result back to the bit field in the 64-bit MSR.
5407
5408 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
5409 read result and the value specified by AndData, and writes the result to the
5410 64-bit MSR specified by Index. The lower 32-bits of the value written to the
5411 MSR are returned. Extra left bits in AndData are stripped. The caller must
5412 either guarantee that Index and the data written is valid, or the caller must
5413 set up exception handlers to catch the exceptions. This function is only
5414 available on IA-32 and X64.
5415
5416 If StartBit is greater than 31, then ASSERT().
5417 If EndBit is greater than 31, then ASSERT().
5418 If EndBit is less than StartBit, then ASSERT().
5419
5420 @param Index The 32-bit MSR index to write.
5421 @param StartBit The ordinal of the least significant bit in the bit field.
5422 Range 0..31.
5423 @param EndBit The ordinal of the most significant bit in the bit field.
5424 Range 0..31.
5425 @param AndData The value to AND with the read value from the MSR.
5426
5427 @return The lower 32-bit of the value written to the MSR.
5428
5429 **/
5430 UINT32
5431 EFIAPI
5432 AsmMsrBitFieldAnd32 (
5433 IN UINT32 Index,
5434 IN UINTN StartBit,
5435 IN UINTN EndBit,
5436 IN UINT32 AndData
5437 );
5438
5439
5440 /**
5441 Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
5442 bitwise inclusive OR, and writes the result back to the bit field in the
5443 64-bit MSR.
5444
5445 Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
5446 bitwise inclusive OR between the read result and the value specified by
5447 AndData, and writes the result to the 64-bit MSR specified by Index. The
5448 lower 32-bits of the value written to the MSR are returned. Extra left bits
5449 in both AndData and OrData are stripped. The caller must either guarantee
5450 that Index and the data written is valid, or the caller must set up exception
5451 handlers to catch the exceptions. This function is only available on IA-32
5452 and X64.
5453
5454 If StartBit is greater than 31, then ASSERT().
5455 If EndBit is greater than 31, then ASSERT().
5456 If EndBit is less than StartBit, then ASSERT().
5457
5458 @param Index The 32-bit MSR index to write.
5459 @param StartBit The ordinal of the least significant bit in the bit field.
5460 Range 0..31.
5461 @param EndBit The ordinal of the most significant bit in the bit field.
5462 Range 0..31.
5463 @param AndData The value to AND with the read value from the MSR.
5464 @param OrData The value to OR with the result of the AND operation.
5465
5466 @return The lower 32-bit of the value written to the MSR.
5467
5468 **/
5469 UINT32
5470 EFIAPI
5471 AsmMsrBitFieldAndThenOr32 (
5472 IN UINT32 Index,
5473 IN UINTN StartBit,
5474 IN UINTN EndBit,
5475 IN UINT32 AndData,
5476 IN UINT32 OrData
5477 );
5478
5479
5480 /**
5481 Returns a 64-bit Machine Specific Register(MSR).
5482
5483 Reads and returns the 64-bit MSR specified by Index. No parameter checking is
5484 performed on Index, and some Index values may cause CPU exceptions. The
5485 caller must either guarantee that Index is valid, or the caller must set up
5486 exception handlers to catch the exceptions. This function is only available
5487 on IA-32 and X64.
5488
5489 @param Index The 32-bit MSR index to read.
5490
5491 @return The value of the MSR identified by Index.
5492
5493 **/
5494 UINT64
5495 EFIAPI
5496 AsmReadMsr64 (
5497 IN UINT32 Index
5498 );
5499
5500
5501 /**
5502 Writes a 64-bit value to a Machine Specific Register(MSR), and returns the
5503 value.
5504
5505 Writes the 64-bit value specified by Value to the MSR specified by Index. The
5506 64-bit value written to the MSR is returned. No parameter checking is
5507 performed on Index or Value, and some of these may cause CPU exceptions. The
5508 caller must either guarantee that Index and Value are valid, or the caller
5509 must establish proper exception handlers. This function is only available on
5510 IA-32 and X64.
5511
5512 @param Index The 32-bit MSR index to write.
5513 @param Value The 64-bit value to write to the MSR.
5514
5515 @return Value
5516
5517 **/
5518 UINT64
5519 EFIAPI
5520 AsmWriteMsr64 (
5521 IN UINT32 Index,
5522 IN UINT64 Value
5523 );
5524
5525
5526 /**
5527 Reads a 64-bit MSR, performs a bitwise inclusive OR, and writes the result
5528 back to the 64-bit MSR.
5529
5530 Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
5531 between the read result and the value specified by OrData, and writes the
5532 result to the 64-bit MSR specified by Index. The value written to the MSR is
5533 returned. No parameter checking is performed on Index or OrData, and some of
5534 these may cause CPU exceptions. The caller must either guarantee that Index
5535 and OrData are valid, or the caller must establish proper exception handlers.
5536 This function is only available on IA-32 and X64.
5537
5538 @param Index The 32-bit MSR index to write.
5539 @param OrData The value to OR with the read value from the MSR.
5540
5541 @return The value written back to the MSR.
5542
5543 **/
5544 UINT64
5545 EFIAPI
5546 AsmMsrOr64 (
5547 IN UINT32 Index,
5548 IN UINT64 OrData
5549 );
5550
5551
5552 /**
5553 Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
5554 64-bit MSR.
5555
5556 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
5557 read result and the value specified by OrData, and writes the result to the
5558 64-bit MSR specified by Index. The value written to the MSR is returned. No
5559 parameter checking is performed on Index or OrData, and some of these may
5560 cause CPU exceptions. The caller must either guarantee that Index and OrData
5561 are valid, or the caller must establish proper exception handlers. This
5562 function is only available on IA-32 and X64.
5563
5564 @param Index The 32-bit MSR index to write.
5565 @param AndData The value to AND with the read value from the MSR.
5566
5567 @return The value written back to the MSR.
5568
5569 **/
5570 UINT64
5571 EFIAPI
5572 AsmMsrAnd64 (
5573 IN UINT32 Index,
5574 IN UINT64 AndData
5575 );
5576
5577
5578 /**
5579 Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive
5580 OR, and writes the result back to the 64-bit MSR.
5581
5582 Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
5583 result and the value specified by AndData, performs a bitwise inclusive OR
5584 between the result of the AND operation and the value specified by OrData,
5585 and writes the result to the 64-bit MSR specified by Index. The value written
5586 to the MSR is returned. No parameter checking is performed on Index, AndData,
5587 or OrData, and some of these may cause CPU exceptions. The caller must either
5588 guarantee that Index, AndData, and OrData are valid, or the caller must
5589 establish proper exception handlers. This function is only available on IA-32
5590 and X64.
5591
5592 @param Index The 32-bit MSR index to write.
5593 @param AndData The value to AND with the read value from the MSR.
5594 @param OrData The value to OR with the result of the AND operation.
5595
5596 @return The value written back to the MSR.
5597
5598 **/
5599 UINT64
5600 EFIAPI
5601 AsmMsrAndThenOr64 (
5602 IN UINT32 Index,
5603 IN UINT64 AndData,
5604 IN UINT64 OrData
5605 );
5606
5607
5608 /**
5609 Reads a bit field of an MSR.
5610
5611 Reads the bit field in the 64-bit MSR. The bit field is specified by the
5612 StartBit and the EndBit. The value of the bit field is returned. The caller
5613 must either guarantee that Index is valid, or the caller must set up
5614 exception handlers to catch the exceptions. This function is only available
5615 on IA-32 and X64.
5616
5617 If StartBit is greater than 63, then ASSERT().
5618 If EndBit is greater than 63, then ASSERT().
5619 If EndBit is less than StartBit, then ASSERT().
5620
5621 @param Index The 32-bit MSR index to read.
5622 @param StartBit The ordinal of the least significant bit in the bit field.
5623 Range 0..63.
5624 @param EndBit The ordinal of the most significant bit in the bit field.
5625 Range 0..63.
5626
5627 @return The value read from the MSR.
5628
5629 **/
5630 UINT64
5631 EFIAPI
5632 AsmMsrBitFieldRead64 (
5633 IN UINT32 Index,
5634 IN UINTN StartBit,
5635 IN UINTN EndBit
5636 );
5637
5638
5639 /**
5640 Writes a bit field to an MSR.
5641
5642 Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
5643 the StartBit and the EndBit. All other bits in the destination MSR are
5644 preserved. The MSR written is returned. Extra left bits in Value are
5645 stripped. The caller must either guarantee that Index and the data written is
5646 valid, or the caller must set up exception handlers to catch the exceptions.
5647 This function is only available on IA-32 and X64.
5648
5649 If StartBit is greater than 63, then ASSERT().
5650 If EndBit is greater than 63, then ASSERT().
5651 If EndBit is less than StartBit, then ASSERT().
5652
5653 @param Index The 32-bit MSR index to write.
5654 @param StartBit The ordinal of the least significant bit in the bit field.
5655 Range 0..63.
5656 @param EndBit The ordinal of the most significant bit in the bit field.
5657 Range 0..63.
5658 @param Value New value of the bit field.
5659
5660 @return The value written back to the MSR.
5661
5662 **/
5663 UINT64
5664 EFIAPI
5665 AsmMsrBitFieldWrite64 (
5666 IN UINT32 Index,
5667 IN UINTN StartBit,
5668 IN UINTN EndBit,
5669 IN UINT64 Value
5670 );
5671
5672
5673 /**
5674 Reads a bit field in a 64-bit MSR, performs a bitwise inclusive OR, and
5675 writes the result back to the bit field in the 64-bit MSR.
5676
5677 Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
5678 between the read result and the value specified by OrData, and writes the
5679 result to the 64-bit MSR specified by Index. The value written to the MSR is
5680 returned. Extra left bits in OrData are stripped. The caller must either
5681 guarantee that Index and the data written is valid, or the caller must set up
5682 exception handlers to catch the exceptions. This function is only available
5683 on IA-32 and X64.
5684
5685 If StartBit is greater than 63, then ASSERT().
5686 If EndBit is greater than 63, then ASSERT().
5687 If EndBit is less than StartBit, then ASSERT().
5688
5689 @param Index The 32-bit MSR index to write.
5690 @param StartBit The ordinal of the least significant bit in the bit field.
5691 Range 0..63.
5692 @param EndBit The ordinal of the most significant bit in the bit field.
5693 Range 0..63.
5694 @param OrData The value to OR with the read value from the bit field.
5695
5696 @return The value written back to the MSR.
5697
5698 **/
5699 UINT64
5700 EFIAPI
5701 AsmMsrBitFieldOr64 (
5702 IN UINT32 Index,
5703 IN UINTN StartBit,
5704 IN UINTN EndBit,
5705 IN UINT64 OrData
5706 );
5707
5708
5709 /**
5710 Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
5711 result back to the bit field in the 64-bit MSR.
5712
5713 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
5714 read result and the value specified by AndData, and writes the result to the
5715 64-bit MSR specified by Index. The value written to the MSR is returned.
5716 Extra left bits in AndData are stripped. The caller must either guarantee
5717 that Index and the data written is valid, or the caller must set up exception
5718 handlers to catch the exceptions. This function is only available on IA-32
5719 and X64.
5720
5721 If StartBit is greater than 63, then ASSERT().
5722 If EndBit is greater than 63, then ASSERT().
5723 If EndBit is less than StartBit, then ASSERT().
5724
5725 @param Index The 32-bit MSR index to write.
5726 @param StartBit The ordinal of the least significant bit in the bit field.
5727 Range 0..63.
5728 @param EndBit The ordinal of the most significant bit in the bit field.
5729 Range 0..63.
5730 @param AndData The value to AND with the read value from the bit field.
5731
5732 @return The value written back to the MSR.
5733
5734 **/
5735 UINT64
5736 EFIAPI
5737 AsmMsrBitFieldAnd64 (
5738 IN UINT32 Index,
5739 IN UINTN StartBit,
5740 IN UINTN EndBit,
5741 IN UINT64 AndData
5742 );
5743
5744
5745 /**
5746 Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
5747 bitwise inclusive OR, and writes the result back to the bit field in the
5748 64-bit MSR.
5749
5750 Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
5751 a bitwise inclusive OR between the read result and the value specified by
5752 AndData, and writes the result to the 64-bit MSR specified by Index. The
5753 value written to the MSR is returned. Extra left bits in both AndData and
5754 OrData are stripped. The caller must either guarantee that Index and the data
5755 written is valid, or the caller must set up exception handlers to catch the
5756 exceptions. This function is only available on IA-32 and X64.
5757
5758 If StartBit is greater than 63, then ASSERT().
5759 If EndBit is greater than 63, then ASSERT().
5760 If EndBit is less than StartBit, then ASSERT().
5761
5762 @param Index The 32-bit MSR index to write.
5763 @param StartBit The ordinal of the least significant bit in the bit field.
5764 Range 0..63.
5765 @param EndBit The ordinal of the most significant bit in the bit field.
5766 Range 0..63.
5767 @param AndData The value to AND with the read value from the bit field.
5768 @param OrData The value to OR with the result of the AND operation.
5769
5770 @return The value written back to the MSR.
5771
5772 **/
5773 UINT64
5774 EFIAPI
5775 AsmMsrBitFieldAndThenOr64 (
5776 IN UINT32 Index,
5777 IN UINTN StartBit,
5778 IN UINTN EndBit,
5779 IN UINT64 AndData,
5780 IN UINT64 OrData
5781 );
5782
5783
5784 /**
5785 Reads the current value of the EFLAGS register.
5786
5787 Reads and returns the current value of the EFLAGS register. This function is
5788 only available on IA-32 and X64. This returns a 32-bit value on IA-32 and a
5789 64-bit value on X64.
5790
5791 @return EFLAGS on IA-32 or RFLAGS on X64.
5792
5793 **/
5794 UINTN
5795 EFIAPI
5796 AsmReadEflags (
5797 VOID
5798 );
5799
5800
5801 /**
5802 Reads the current value of the Control Register 0 (CR0).
5803
5804 Reads and returns the current value of CR0. This function is only available
5805 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5806 X64.
5807
5808 @return The value of the Control Register 0 (CR0).
5809
5810 **/
5811 UINTN
5812 EFIAPI
5813 AsmReadCr0 (
5814 VOID
5815 );
5816
5817
5818 /**
5819 Reads the current value of the Control Register 2 (CR2).
5820
5821 Reads and returns the current value of CR2. This function is only available
5822 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5823 X64.
5824
5825 @return The value of the Control Register 2 (CR2).
5826
5827 **/
5828 UINTN
5829 EFIAPI
5830 AsmReadCr2 (
5831 VOID
5832 );
5833
5834
5835 /**
5836 Reads the current value of the Control Register 3 (CR3).
5837
5838 Reads and returns the current value of CR3. This function is only available
5839 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5840 X64.
5841
5842 @return The value of the Control Register 3 (CR3).
5843
5844 **/
5845 UINTN
5846 EFIAPI
5847 AsmReadCr3 (
5848 VOID
5849 );
5850
5851
5852 /**
5853 Reads the current value of the Control Register 4 (CR4).
5854
5855 Reads and returns the current value of CR4. This function is only available
5856 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5857 X64.
5858
5859 @return The value of the Control Register 4 (CR4).
5860
5861 **/
5862 UINTN
5863 EFIAPI
5864 AsmReadCr4 (
5865 VOID
5866 );
5867
5868
5869 /**
5870 Writes a value to Control Register 0 (CR0).
5871
5872 Writes and returns a new value to CR0. This function is only available on
5873 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
5874
5875 @param Cr0 The value to write to CR0.
5876
5877 @return The value written to CR0.
5878
5879 **/
5880 UINTN
5881 EFIAPI
5882 AsmWriteCr0 (
5883 UINTN Cr0
5884 );
5885
5886
5887 /**
5888 Writes a value to Control Register 2 (CR2).
5889
5890 Writes and returns a new value to CR2. This function is only available on
5891 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
5892
5893 @param Cr2 The value to write to CR2.
5894
5895 @return The value written to CR2.
5896
5897 **/
5898 UINTN
5899 EFIAPI
5900 AsmWriteCr2 (
5901 UINTN Cr2
5902 );
5903
5904
5905 /**
5906 Writes a value to Control Register 3 (CR3).
5907
5908 Writes and returns a new value to CR3. This function is only available on
5909 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
5910
5911 @param Cr3 The value to write to CR3.
5912
5913 @return The value written to CR3.
5914
5915 **/
5916 UINTN
5917 EFIAPI
5918 AsmWriteCr3 (
5919 UINTN Cr3
5920 );
5921
5922
5923 /**
5924 Writes a value to Control Register 4 (CR4).
5925
5926 Writes and returns a new value to CR4. This function is only available on
5927 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
5928
5929 @param Cr4 The value to write to CR4.
5930
5931 @return The value written to CR4.
5932
5933 **/
5934 UINTN
5935 EFIAPI
5936 AsmWriteCr4 (
5937 UINTN Cr4
5938 );
5939
5940
5941 /**
5942 Reads the current value of Debug Register 0 (DR0).
5943
5944 Reads and returns the current value of DR0. This function is only available
5945 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5946 X64.
5947
5948 @return The value of Debug Register 0 (DR0).
5949
5950 **/
5951 UINTN
5952 EFIAPI
5953 AsmReadDr0 (
5954 VOID
5955 );
5956
5957
5958 /**
5959 Reads the current value of Debug Register 1 (DR1).
5960
5961 Reads and returns the current value of DR1. This function is only available
5962 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5963 X64.
5964
5965 @return The value of Debug Register 1 (DR1).
5966
5967 **/
5968 UINTN
5969 EFIAPI
5970 AsmReadDr1 (
5971 VOID
5972 );
5973
5974
5975 /**
5976 Reads the current value of Debug Register 2 (DR2).
5977
5978 Reads and returns the current value of DR2. This function is only available
5979 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5980 X64.
5981
5982 @return The value of Debug Register 2 (DR2).
5983
5984 **/
5985 UINTN
5986 EFIAPI
5987 AsmReadDr2 (
5988 VOID
5989 );
5990
5991
5992 /**
5993 Reads the current value of Debug Register 3 (DR3).
5994
5995 Reads and returns the current value of DR3. This function is only available
5996 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
5997 X64.
5998
5999 @return The value of Debug Register 3 (DR3).
6000
6001 **/
6002 UINTN
6003 EFIAPI
6004 AsmReadDr3 (
6005 VOID
6006 );
6007
6008
6009 /**
6010 Reads the current value of Debug Register 4 (DR4).
6011
6012 Reads and returns the current value of DR4. This function is only available
6013 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
6014 X64.
6015
6016 @return The value of Debug Register 4 (DR4).
6017
6018 **/
6019 UINTN
6020 EFIAPI
6021 AsmReadDr4 (
6022 VOID
6023 );
6024
6025
6026 /**
6027 Reads the current value of Debug Register 5 (DR5).
6028
6029 Reads and returns the current value of DR5. This function is only available
6030 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
6031 X64.
6032
6033 @return The value of Debug Register 5 (DR5).
6034
6035 **/
6036 UINTN
6037 EFIAPI
6038 AsmReadDr5 (
6039 VOID
6040 );
6041
6042
6043 /**
6044 Reads the current value of Debug Register 6 (DR6).
6045
6046 Reads and returns the current value of DR6. This function is only available
6047 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
6048 X64.
6049
6050 @return The value of Debug Register 6 (DR6).
6051
6052 **/
6053 UINTN
6054 EFIAPI
6055 AsmReadDr6 (
6056 VOID
6057 );
6058
6059
6060 /**
6061 Reads the current value of Debug Register 7 (DR7).
6062
6063 Reads and returns the current value of DR7. This function is only available
6064 on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
6065 X64.
6066
6067 @return The value of Debug Register 7 (DR7).
6068
6069 **/
6070 UINTN
6071 EFIAPI
6072 AsmReadDr7 (
6073 VOID
6074 );
6075
6076
6077 /**
6078 Writes a value to Debug Register 0 (DR0).
6079
6080 Writes and returns a new value to DR0. This function is only available on
6081 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6082
6083 @param Dr0 The value to write to Dr0.
6084
6085 @return The value written to Debug Register 0 (DR0).
6086
6087 **/
6088 UINTN
6089 EFIAPI
6090 AsmWriteDr0 (
6091 UINTN Dr0
6092 );
6093
6094
6095 /**
6096 Writes a value to Debug Register 1 (DR1).
6097
6098 Writes and returns a new value to DR1. This function is only available on
6099 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6100
6101 @param Dr1 The value to write to Dr1.
6102
6103 @return The value written to Debug Register 1 (DR1).
6104
6105 **/
6106 UINTN
6107 EFIAPI
6108 AsmWriteDr1 (
6109 UINTN Dr1
6110 );
6111
6112
6113 /**
6114 Writes a value to Debug Register 2 (DR2).
6115
6116 Writes and returns a new value to DR2. This function is only available on
6117 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6118
6119 @param Dr2 The value to write to Dr2.
6120
6121 @return The value written to Debug Register 2 (DR2).
6122
6123 **/
6124 UINTN
6125 EFIAPI
6126 AsmWriteDr2 (
6127 UINTN Dr2
6128 );
6129
6130
6131 /**
6132 Writes a value to Debug Register 3 (DR3).
6133
6134 Writes and returns a new value to DR3. This function is only available on
6135 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6136
6137 @param Dr3 The value to write to Dr3.
6138
6139 @return The value written to Debug Register 3 (DR3).
6140
6141 **/
6142 UINTN
6143 EFIAPI
6144 AsmWriteDr3 (
6145 UINTN Dr3
6146 );
6147
6148
6149 /**
6150 Writes a value to Debug Register 4 (DR4).
6151
6152 Writes and returns a new value to DR4. This function is only available on
6153 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6154
6155 @param Dr4 The value to write to Dr4.
6156
6157 @return The value written to Debug Register 4 (DR4).
6158
6159 **/
6160 UINTN
6161 EFIAPI
6162 AsmWriteDr4 (
6163 UINTN Dr4
6164 );
6165
6166
6167 /**
6168 Writes a value to Debug Register 5 (DR5).
6169
6170 Writes and returns a new value to DR5. This function is only available on
6171 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6172
6173 @param Dr5 The value to write to Dr5.
6174
6175 @return The value written to Debug Register 5 (DR5).
6176
6177 **/
6178 UINTN
6179 EFIAPI
6180 AsmWriteDr5 (
6181 UINTN Dr5
6182 );
6183
6184
6185 /**
6186 Writes a value to Debug Register 6 (DR6).
6187
6188 Writes and returns a new value to DR6. This function is only available on
6189 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6190
6191 @param Dr6 The value to write to Dr6.
6192
6193 @return The value written to Debug Register 6 (DR6).
6194
6195 **/
6196 UINTN
6197 EFIAPI
6198 AsmWriteDr6 (
6199 UINTN Dr6
6200 );
6201
6202
6203 /**
6204 Writes a value to Debug Register 7 (DR7).
6205
6206 Writes and returns a new value to DR7. This function is only available on
6207 IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
6208
6209 @param Dr7 The value to write to Dr7.
6210
6211 @return The value written to Debug Register 7 (DR7).
6212
6213 **/
6214 UINTN
6215 EFIAPI
6216 AsmWriteDr7 (
6217 UINTN Dr7
6218 );
6219
6220
6221 /**
6222 Reads the current value of Code Segment Register (CS).
6223
6224 Reads and returns the current value of CS. This function is only available on
6225 IA-32 and X64.
6226
6227 @return The current value of CS.
6228
6229 **/
6230 UINT16
6231 EFIAPI
6232 AsmReadCs (
6233 VOID
6234 );
6235
6236
6237 /**
6238 Reads the current value of Data Segment Register (DS).
6239
6240 Reads and returns the current value of DS. This function is only available on
6241 IA-32 and X64.
6242
6243 @return The current value of DS.
6244
6245 **/
6246 UINT16
6247 EFIAPI
6248 AsmReadDs (
6249 VOID
6250 );
6251
6252
6253 /**
6254 Reads the current value of Extra Segment Register (ES).
6255
6256 Reads and returns the current value of ES. This function is only available on
6257 IA-32 and X64.
6258
6259 @return The current value of ES.
6260
6261 **/
6262 UINT16
6263 EFIAPI
6264 AsmReadEs (
6265 VOID
6266 );
6267
6268
6269 /**
6270 Reads the current value of FS Data Segment Register (FS).
6271
6272 Reads and returns the current value of FS. This function is only available on
6273 IA-32 and X64.
6274
6275 @return The current value of FS.
6276
6277 **/
6278 UINT16
6279 EFIAPI
6280 AsmReadFs (
6281 VOID
6282 );
6283
6284
6285 /**
6286 Reads the current value of GS Data Segment Register (GS).
6287
6288 Reads and returns the current value of GS. This function is only available on
6289 IA-32 and X64.
6290
6291 @return The current value of GS.
6292
6293 **/
6294 UINT16
6295 EFIAPI
6296 AsmReadGs (
6297 VOID
6298 );
6299
6300
6301 /**
6302 Reads the current value of Stack Segment Register (SS).
6303
6304 Reads and returns the current value of SS. This function is only available on
6305 IA-32 and X64.
6306
6307 @return The current value of SS.
6308
6309 **/
6310 UINT16
6311 EFIAPI
6312 AsmReadSs (
6313 VOID
6314 );
6315
6316
6317 /**
6318 Reads the current value of Task Register (TR).
6319
6320 Reads and returns the current value of TR. This function is only available on
6321 IA-32 and X64.
6322
6323 @return The current value of TR.
6324
6325 **/
6326 UINT16
6327 EFIAPI
6328 AsmReadTr (
6329 VOID
6330 );
6331
6332
6333 /**
6334 Reads the current Global Descriptor Table Register(GDTR) descriptor.
6335
6336 Reads and returns the current GDTR descriptor and returns it in Gdtr. This
6337 function is only available on IA-32 and X64.
6338
6339 If Gdtr is NULL, then ASSERT().
6340
6341 @param Gdtr Pointer to a GDTR descriptor.
6342
6343 **/
6344 VOID
6345 EFIAPI
6346 AsmReadGdtr (
6347 OUT IA32_DESCRIPTOR *Gdtr
6348 );
6349
6350
6351 /**
6352 Writes the current Global Descriptor Table Register (GDTR) descriptor.
6353
6354 Writes and the current GDTR descriptor specified by Gdtr. This function is
6355 only available on IA-32 and X64.
6356
6357 If Gdtr is NULL, then ASSERT().
6358
6359 @param Gdtr Pointer to a GDTR descriptor.
6360
6361 **/
6362 VOID
6363 EFIAPI
6364 AsmWriteGdtr (
6365 IN CONST IA32_DESCRIPTOR *Gdtr
6366 );
6367
6368
6369 /**
6370 Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.
6371
6372 Reads and returns the current IDTR descriptor and returns it in Idtr. This
6373 function is only available on IA-32 and X64.
6374
6375 If Idtr is NULL, then ASSERT().
6376
6377 @param Idtr Pointer to a IDTR descriptor.
6378
6379 **/
6380 VOID
6381 EFIAPI
6382 AsmReadIdtr (
6383 OUT IA32_DESCRIPTOR *Idtr
6384 );
6385
6386
6387 /**
6388 Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.
6389
6390 Writes the current IDTR descriptor and returns it in Idtr. This function is
6391 only available on IA-32 and X64.
6392
6393 If Idtr is NULL, then ASSERT().
6394
6395 @param Idtr Pointer to a IDTR descriptor.
6396
6397 **/
6398 VOID
6399 EFIAPI
6400 AsmWriteIdtr (
6401 IN CONST IA32_DESCRIPTOR *Idtr
6402 );
6403
6404
6405 /**
6406 Reads the current Local Descriptor Table Register(LDTR) selector.
6407
6408 Reads and returns the current 16-bit LDTR descriptor value. This function is
6409 only available on IA-32 and X64.
6410
6411 @return The current selector of LDT.
6412
6413 **/
6414 UINT16
6415 EFIAPI
6416 AsmReadLdtr (
6417 VOID
6418 );
6419
6420
6421 /**
6422 Writes the current Local Descriptor Table Register (GDTR) selector.
6423
6424 Writes and the current LDTR descriptor specified by Ldtr. This function is
6425 only available on IA-32 and X64.
6426
6427 @param Ldtr 16-bit LDTR selector value.
6428
6429 **/
6430 VOID
6431 EFIAPI
6432 AsmWriteLdtr (
6433 IN UINT16 Ldtr
6434 );
6435
6436
6437 /**
6438 Save the current floating point/SSE/SSE2 context to a buffer.
6439
6440 Saves the current floating point/SSE/SSE2 state to the buffer specified by
6441 Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
6442 available on IA-32 and X64.
6443
6444 If Buffer is NULL, then ASSERT().
6445 If Buffer is not aligned on a 16-byte boundary, then ASSERT().
6446
6447 @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.
6448
6449 **/
6450 VOID
6451 EFIAPI
6452 AsmFxSave (
6453 OUT IA32_FX_BUFFER *Buffer
6454 );
6455
6456
6457 /**
6458 Restores the current floating point/SSE/SSE2 context from a buffer.
6459
6460 Restores the current floating point/SSE/SSE2 state from the buffer specified
6461 by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
6462 only available on IA-32 and X64.
6463
6464 If Buffer is NULL, then ASSERT().
6465 If Buffer is not aligned on a 16-byte boundary, then ASSERT().
6466 If Buffer was not saved with AsmFxSave(), then ASSERT().
6467
6468 @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.
6469
6470 **/
6471 VOID
6472 EFIAPI
6473 AsmFxRestore (
6474 IN CONST IA32_FX_BUFFER *Buffer
6475 );
6476
6477
6478 /**
6479 Reads the current value of 64-bit MMX Register #0 (MM0).
6480
6481 Reads and returns the current value of MM0. This function is only available
6482 on IA-32 and X64.
6483
6484 @return The current value of MM0.
6485
6486 **/
6487 UINT64
6488 EFIAPI
6489 AsmReadMm0 (
6490 VOID
6491 );
6492
6493
6494 /**
6495 Reads the current value of 64-bit MMX Register #1 (MM1).
6496
6497 Reads and returns the current value of MM1. This function is only available
6498 on IA-32 and X64.
6499
6500 @return The current value of MM1.
6501
6502 **/
6503 UINT64
6504 EFIAPI
6505 AsmReadMm1 (
6506 VOID
6507 );
6508
6509
6510 /**
6511 Reads the current value of 64-bit MMX Register #2 (MM2).
6512
6513 Reads and returns the current value of MM2. This function is only available
6514 on IA-32 and X64.
6515
6516 @return The current value of MM2.
6517
6518 **/
6519 UINT64
6520 EFIAPI
6521 AsmReadMm2 (
6522 VOID
6523 );
6524
6525
6526 /**
6527 Reads the current value of 64-bit MMX Register #3 (MM3).
6528
6529 Reads and returns the current value of MM3. This function is only available
6530 on IA-32 and X64.
6531
6532 @return The current value of MM3.
6533
6534 **/
6535 UINT64
6536 EFIAPI
6537 AsmReadMm3 (
6538 VOID
6539 );
6540
6541
6542 /**
6543 Reads the current value of 64-bit MMX Register #4 (MM4).
6544
6545 Reads and returns the current value of MM4. This function is only available
6546 on IA-32 and X64.
6547
6548 @return The current value of MM4.
6549
6550 **/
6551 UINT64
6552 EFIAPI
6553 AsmReadMm4 (
6554 VOID
6555 );
6556
6557
6558 /**
6559 Reads the current value of 64-bit MMX Register #5 (MM5).
6560
6561 Reads and returns the current value of MM5. This function is only available
6562 on IA-32 and X64.
6563
6564 @return The current value of MM5.
6565
6566 **/
6567 UINT64
6568 EFIAPI
6569 AsmReadMm5 (
6570 VOID
6571 );
6572
6573
6574 /**
6575 Reads the current value of 64-bit MMX Register #6 (MM6).
6576
6577 Reads and returns the current value of MM6. This function is only available
6578 on IA-32 and X64.
6579
6580 @return The current value of MM6.
6581
6582 **/
6583 UINT64
6584 EFIAPI
6585 AsmReadMm6 (
6586 VOID
6587 );
6588
6589
6590 /**
6591 Reads the current value of 64-bit MMX Register #7 (MM7).
6592
6593 Reads and returns the current value of MM7. This function is only available
6594 on IA-32 and X64.
6595
6596 @return The current value of MM7.
6597
6598 **/
6599 UINT64
6600 EFIAPI
6601 AsmReadMm7 (
6602 VOID
6603 );
6604
6605
6606 /**
6607 Writes the current value of 64-bit MMX Register #0 (MM0).
6608
6609 Writes the current value of MM0. This function is only available on IA32 and
6610 X64.
6611
6612 @param Value The 64-bit value to write to MM0.
6613
6614 **/
6615 VOID
6616 EFIAPI
6617 AsmWriteMm0 (
6618 IN UINT64 Value
6619 );
6620
6621
6622 /**
6623 Writes the current value of 64-bit MMX Register #1 (MM1).
6624
6625 Writes the current value of MM1. This function is only available on IA32 and
6626 X64.
6627
6628 @param Value The 64-bit value to write to MM1.
6629
6630 **/
6631 VOID
6632 EFIAPI
6633 AsmWriteMm1 (
6634 IN UINT64 Value
6635 );
6636
6637
6638 /**
6639 Writes the current value of 64-bit MMX Register #2 (MM2).
6640
6641 Writes the current value of MM2. This function is only available on IA32 and
6642 X64.
6643
6644 @param Value The 64-bit value to write to MM2.
6645
6646 **/
6647 VOID
6648 EFIAPI
6649 AsmWriteMm2 (
6650 IN UINT64 Value
6651 );
6652
6653
6654 /**
6655 Writes the current value of 64-bit MMX Register #3 (MM3).
6656
6657 Writes the current value of MM3. This function is only available on IA32 and
6658 X64.
6659
6660 @param Value The 64-bit value to write to MM3.
6661
6662 **/
6663 VOID
6664 EFIAPI
6665 AsmWriteMm3 (
6666 IN UINT64 Value
6667 );
6668
6669
6670 /**
6671 Writes the current value of 64-bit MMX Register #4 (MM4).
6672
6673 Writes the current value of MM4. This function is only available on IA32 and
6674 X64.
6675
6676 @param Value The 64-bit value to write to MM4.
6677
6678 **/
6679 VOID
6680 EFIAPI
6681 AsmWriteMm4 (
6682 IN UINT64 Value
6683 );
6684
6685
6686 /**
6687 Writes the current value of 64-bit MMX Register #5 (MM5).
6688
6689 Writes the current value of MM5. This function is only available on IA32 and
6690 X64.
6691
6692 @param Value The 64-bit value to write to MM5.
6693
6694 **/
6695 VOID
6696 EFIAPI
6697 AsmWriteMm5 (
6698 IN UINT64 Value
6699 );
6700
6701
6702 /**
6703 Writes the current value of 64-bit MMX Register #6 (MM6).
6704
6705 Writes the current value of MM6. This function is only available on IA32 and
6706 X64.
6707
6708 @param Value The 64-bit value to write to MM6.
6709
6710 **/
6711 VOID
6712 EFIAPI
6713 AsmWriteMm6 (
6714 IN UINT64 Value
6715 );
6716
6717
6718 /**
6719 Writes the current value of 64-bit MMX Register #7 (MM7).
6720
6721 Writes the current value of MM7. This function is only available on IA32 and
6722 X64.
6723
6724 @param Value The 64-bit value to write to MM7.
6725
6726 **/
6727 VOID
6728 EFIAPI
6729 AsmWriteMm7 (
6730 IN UINT64 Value
6731 );
6732
6733
6734 /**
6735 Reads the current value of Time Stamp Counter (TSC).
6736
6737 Reads and returns the current value of TSC. This function is only available
6738 on IA-32 and X64.
6739
6740 @return The current value of TSC
6741
6742 **/
6743 UINT64
6744 EFIAPI
6745 AsmReadTsc (
6746 VOID
6747 );
6748
6749
6750 /**
6751 Reads the current value of a Performance Counter (PMC).
6752
6753 Reads and returns the current value of performance counter specified by
6754 Index. This function is only available on IA-32 and X64.
6755
6756 @param Index The 32-bit Performance Counter index to read.
6757
6758 @return The value of the PMC specified by Index.
6759
6760 **/
6761 UINT64
6762 EFIAPI
6763 AsmReadPmc (
6764 IN UINT32 Index
6765 );
6766
6767
6768 /**
6769 Sets up a monitor buffer that is used by AsmMwait().
6770
6771 Executes a MONITOR instruction with the register state specified by Eax, Ecx
6772 and Edx. Returns Eax. This function is only available on IA-32 and X64.
6773
6774 @param Eax The value to load into EAX or RAX before executing the MONITOR
6775 instruction.
6776 @param Ecx The value to load into ECX or RCX before executing the MONITOR
6777 instruction.
6778 @param Edx The value to load into EDX or RDX before executing the MONITOR
6779 instruction.
6780
6781 @return Eax
6782
6783 **/
6784 UINTN
6785 EFIAPI
6786 AsmMonitor (
6787 IN UINTN Eax,
6788 IN UINTN Ecx,
6789 IN UINTN Edx
6790 );
6791
6792
6793 /**
6794 Executes an MWAIT instruction.
6795
6796 Executes an MWAIT instruction with the register state specified by Eax and
6797 Ecx. Returns Eax. This function is only available on IA-32 and X64.
6798
6799 @param Eax The value to load into EAX or RAX before executing the MONITOR
6800 instruction.
6801 @param Ecx The value to load into ECX or RCX before executing the MONITOR
6802 instruction.
6803
6804 @return Eax
6805
6806 **/
6807 UINTN
6808 EFIAPI
6809 AsmMwait (
6810 IN UINTN Eax,
6811 IN UINTN Ecx
6812 );
6813
6814
6815 /**
6816 Executes a WBINVD instruction.
6817
6818 Executes a WBINVD instruction. This function is only available on IA-32 and
6819 X64.
6820
6821 **/
6822 VOID
6823 EFIAPI
6824 AsmWbinvd (
6825 VOID
6826 );
6827
6828
6829 /**
6830 Executes a INVD instruction.
6831
6832 Executes a INVD instruction. This function is only available on IA-32 and
6833 X64.
6834
6835 **/
6836 VOID
6837 EFIAPI
6838 AsmInvd (
6839 VOID
6840 );
6841
6842
6843 /**
6844 Flushes a cache line from all the instruction and data caches within the
6845 coherency domain of the CPU.
6846
6847 Flushed the cache line specified by LinearAddress, and returns LinearAddress.
6848 This function is only available on IA-32 and X64.
6849
6850 @param LinearAddress The address of the cache line to flush. If the CPU is
6851 in a physical addressing mode, then LinearAddress is a
6852 physical address. If the CPU is in a virtual
6853 addressing mode, then LinearAddress is a virtual
6854 address.
6855
6856 @return LinearAddress
6857 **/
6858 VOID *
6859 EFIAPI
6860 AsmFlushCacheLine (
6861 IN VOID *LinearAddress
6862 );
6863
6864
6865 /**
6866 Enables the 32-bit paging mode on the CPU.
6867
6868 Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
6869 must be properly initialized prior to calling this service. This function
6870 assumes the current execution mode is 32-bit protected mode. This function is
6871 only available on IA-32. After the 32-bit paging mode is enabled, control is
6872 transferred to the function specified by EntryPoint using the new stack
6873 specified by NewStack and passing in the parameters specified by Context1 and
6874 Context2. Context1 and Context2 are optional and may be NULL. The function
6875 EntryPoint must never return.
6876
6877 If the current execution mode is not 32-bit protected mode, then ASSERT().
6878 If EntryPoint is NULL, then ASSERT().
6879 If NewStack is NULL, then ASSERT().
6880
6881 There are a number of constraints that must be followed before calling this
6882 function:
6883 1) Interrupts must be disabled.
6884 2) The caller must be in 32-bit protected mode with flat descriptors. This
6885 means all descriptors must have a base of 0 and a limit of 4GB.
6886 3) CR0 and CR4 must be compatible with 32-bit protected mode with flat
6887 descriptors.
6888 4) CR3 must point to valid page tables that will be used once the transition
6889 is complete, and those page tables must guarantee that the pages for this
6890 function and the stack are identity mapped.
6891
6892 @param EntryPoint A pointer to function to call with the new stack after
6893 paging is enabled.
6894 @param Context1 A pointer to the context to pass into the EntryPoint
6895 function as the first parameter after paging is enabled.
6896 @param Context2 A pointer to the context to pass into the EntryPoint
6897 function as the second parameter after paging is enabled.
6898 @param NewStack A pointer to the new stack to use for the EntryPoint
6899 function after paging is enabled.
6900
6901 **/
6902 VOID
6903 EFIAPI
6904 AsmEnablePaging32 (
6905 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
6906 IN VOID *Context1, OPTIONAL
6907 IN VOID *Context2, OPTIONAL
6908 IN VOID *NewStack
6909 );
6910
6911
6912 /**
6913 Disables the 32-bit paging mode on the CPU.
6914
6915 Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
6916 mode. This function assumes the current execution mode is 32-paged protected
6917 mode. This function is only available on IA-32. After the 32-bit paging mode
6918 is disabled, control is transferred to the function specified by EntryPoint
6919 using the new stack specified by NewStack and passing in the parameters
6920 specified by Context1 and Context2. Context1 and Context2 are optional and
6921 may be NULL. The function EntryPoint must never return.
6922
6923 If the current execution mode is not 32-bit paged mode, then ASSERT().
6924 If EntryPoint is NULL, then ASSERT().
6925 If NewStack is NULL, then ASSERT().
6926
6927 There are a number of constraints that must be followed before calling this
6928 function:
6929 1) Interrupts must be disabled.
6930 2) The caller must be in 32-bit paged mode.
6931 3) CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
6932 4) CR3 must point to valid page tables that guarantee that the pages for
6933 this function and the stack are identity mapped.
6934
6935 @param EntryPoint A pointer to function to call with the new stack after
6936 paging is disabled.
6937 @param Context1 A pointer to the context to pass into the EntryPoint
6938 function as the first parameter after paging is disabled.
6939 @param Context2 A pointer to the context to pass into the EntryPoint
6940 function as the second parameter after paging is
6941 disabled.
6942 @param NewStack A pointer to the new stack to use for the EntryPoint
6943 function after paging is disabled.
6944
6945 **/
6946 VOID
6947 EFIAPI
6948 AsmDisablePaging32 (
6949 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
6950 IN VOID *Context1, OPTIONAL
6951 IN VOID *Context2, OPTIONAL
6952 IN VOID *NewStack
6953 );
6954
6955
6956 /**
6957 Enables the 64-bit paging mode on the CPU.
6958
6959 Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
6960 must be properly initialized prior to calling this service. This function
6961 assumes the current execution mode is 32-bit protected mode with flat
6962 descriptors. This function is only available on IA-32. After the 64-bit
6963 paging mode is enabled, control is transferred to the function specified by
6964 EntryPoint using the new stack specified by NewStack and passing in the
6965 parameters specified by Context1 and Context2. Context1 and Context2 are
6966 optional and may be 0. The function EntryPoint must never return.
6967
6968 If the current execution mode is not 32-bit protected mode with flat
6969 descriptors, then ASSERT().
6970 If EntryPoint is 0, then ASSERT().
6971 If NewStack is 0, then ASSERT().
6972
6973 @param Cs The 16-bit selector to load in the CS before EntryPoint
6974 is called. The descriptor in the GDT that this selector
6975 references must be setup for long mode.
6976 @param EntryPoint The 64-bit virtual address of the function to call with
6977 the new stack after paging is enabled.
6978 @param Context1 The 64-bit virtual address of the context to pass into
6979 the EntryPoint function as the first parameter after
6980 paging is enabled.
6981 @param Context2 The 64-bit virtual address of the context to pass into
6982 the EntryPoint function as the second parameter after
6983 paging is enabled.
6984 @param NewStack The 64-bit virtual address of the new stack to use for
6985 the EntryPoint function after paging is enabled.
6986
6987 **/
6988 VOID
6989 EFIAPI
6990 AsmEnablePaging64 (
6991 IN UINT16 CodeSelector,
6992 IN UINT64 EntryPoint,
6993 IN UINT64 Context1, OPTIONAL
6994 IN UINT64 Context2, OPTIONAL
6995 IN UINT64 NewStack
6996 );
6997
6998
6999 /**
7000 Disables the 64-bit paging mode on the CPU.
7001
7002 Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
7003 mode. This function assumes the current execution mode is 64-paging mode.
7004 This function is only available on X64. After the 64-bit paging mode is
7005 disabled, control is transferred to the function specified by EntryPoint
7006 using the new stack specified by NewStack and passing in the parameters
7007 specified by Context1 and Context2. Context1 and Context2 are optional and
7008 may be 0. The function EntryPoint must never return.
7009
7010 If the current execution mode is not 64-bit paged mode, then ASSERT().
7011 If EntryPoint is 0, then ASSERT().
7012 If NewStack is 0, then ASSERT().
7013
7014 @param Cs The 16-bit selector to load in the CS before EntryPoint
7015 is called. The descriptor in the GDT that this selector
7016 references must be setup for 32-bit protected mode.
7017 @param EntryPoint The 64-bit virtual address of the function to call with
7018 the new stack after paging is disabled.
7019 @param Context1 The 64-bit virtual address of the context to pass into
7020 the EntryPoint function as the first parameter after
7021 paging is disabled.
7022 @param Context2 The 64-bit virtual address of the context to pass into
7023 the EntryPoint function as the second parameter after
7024 paging is disabled.
7025 @param NewStack The 64-bit virtual address of the new stack to use for
7026 the EntryPoint function after paging is disabled.
7027
7028 **/
7029 VOID
7030 EFIAPI
7031 AsmDisablePaging64 (
7032 IN UINT16 CodeSelector,
7033 IN UINT32 EntryPoint,
7034 IN UINT32 Context1, OPTIONAL
7035 IN UINT32 Context2, OPTIONAL
7036 IN UINT32 NewStack
7037 );
7038
7039
7040 //
7041 // 16-bit thunking services
7042 //
7043
7044 /**
7045 Retrieves the properties for 16-bit thunk functions.
7046
7047 Computes the size of the buffer and stack below 1MB required to use the
7048 AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This
7049 buffer size is returned in RealModeBufferSize, and the stack size is returned
7050 in ExtraStackSize. If parameters are passed to the 16-bit real mode code,
7051 then the actual minimum stack size is ExtraStackSize plus the maximum number
7052 of bytes that need to be passed to the 16-bit real mode code.
7053
7054 If RealModeBufferSize is NULL, then ASSERT().
7055 If ExtraStackSize is NULL, then ASSERT().
7056
7057 @param RealModeBufferSize A pointer to the size of the buffer below 1MB
7058 required to use the 16-bit thunk functions.
7059 @param ExtraStackSize A pointer to the extra size of stack below 1MB
7060 that the 16-bit thunk functions require for
7061 temporary storage in the transition to and from
7062 16-bit real mode.
7063
7064 **/
7065 VOID
7066 EFIAPI
7067 AsmGetThunk16Properties (
7068 OUT UINT32 *RealModeBufferSize,
7069 OUT UINT32 *ExtraStackSize
7070 );
7071
7072
7073 /**
7074 Prepares all structures a code required to use AsmThunk16().
7075
7076 Prepares all structures and code required to use AsmThunk16().
7077
7078 If ThunkContext is NULL, then ASSERT().
7079
7080 @param ThunkContext A pointer to the context structure that describes the
7081 16-bit real mode code to call.
7082
7083 **/
7084 VOID
7085 EFIAPI
7086 AsmPrepareThunk16 (
7087 OUT THUNK_CONTEXT *ThunkContext
7088 );
7089
7090
7091 /**
7092 Transfers control to a 16-bit real mode entry point and returns the results.
7093
7094 Transfers control to a 16-bit real mode entry point and returns the results.
7095 AsmPrepareThunk16() must be called with ThunkContext before this function is
7096 used.
7097
7098 If ThunkContext is NULL, then ASSERT().
7099 If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().
7100
7101 @param ThunkContext A pointer to the context structure that describes the
7102 16-bit real mode code to call.
7103
7104 **/
7105 VOID
7106 EFIAPI
7107 AsmThunk16 (
7108 IN OUT THUNK_CONTEXT *ThunkContext
7109 );
7110
7111
7112 /**
7113 Prepares all structures and code for a 16-bit real mode thunk, transfers
7114 control to a 16-bit real mode entry point, and returns the results.
7115
7116 Prepares all structures and code for a 16-bit real mode thunk, transfers
7117 control to a 16-bit real mode entry point, and returns the results. If the
7118 caller only need to perform a single 16-bit real mode thunk, then this
7119 service should be used. If the caller intends to make more than one 16-bit
7120 real mode thunk, then it is more efficient if AsmPrepareThunk16() is called
7121 once and AsmThunk16() can be called for each 16-bit real mode thunk.
7122
7123 If ThunkContext is NULL, then ASSERT().
7124
7125 @param ThunkContext A pointer to the context structure that describes the
7126 16-bit real mode code to call.
7127
7128 **/
7129 VOID
7130 EFIAPI
7131 AsmPrepareAndThunk16 (
7132 IN OUT THUNK_CONTEXT *ThunkContext
7133 );
7134
7135 #else
7136
7137 #endif
7138
7139 #endif
7140