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