]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/Library/BaseLib.h
MdePkg/BaseLib: Add AsciiStrToGuid/HexToBytes/ToIpv[4/6]Address
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
1 /** @file
2 Provides string functions, linked list functions, math functions, synchronization
3 functions, file path functions, and CPU architecture-specific functions.
4
5 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
6 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php.
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #ifndef __BASE_LIB__
18 #define __BASE_LIB__
19
20 //
21 // Definitions for architecture-specific types
22 //
23 #if defined (MDE_CPU_IA32)
24 ///
25 /// The IA-32 architecture context buffer used by SetJump() and LongJump().
26 ///
27 typedef struct {
28 UINT32 Ebx;
29 UINT32 Esi;
30 UINT32 Edi;
31 UINT32 Ebp;
32 UINT32 Esp;
33 UINT32 Eip;
34 } BASE_LIBRARY_JUMP_BUFFER;
35
36 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4
37
38 #endif // defined (MDE_CPU_IA32)
39
40 #if defined (MDE_CPU_IPF)
41
42 ///
43 /// The Itanium architecture context buffer used by SetJump() and LongJump().
44 ///
45 typedef struct {
46 UINT64 F2[2];
47 UINT64 F3[2];
48 UINT64 F4[2];
49 UINT64 F5[2];
50 UINT64 F16[2];
51 UINT64 F17[2];
52 UINT64 F18[2];
53 UINT64 F19[2];
54 UINT64 F20[2];
55 UINT64 F21[2];
56 UINT64 F22[2];
57 UINT64 F23[2];
58 UINT64 F24[2];
59 UINT64 F25[2];
60 UINT64 F26[2];
61 UINT64 F27[2];
62 UINT64 F28[2];
63 UINT64 F29[2];
64 UINT64 F30[2];
65 UINT64 F31[2];
66 UINT64 R4;
67 UINT64 R5;
68 UINT64 R6;
69 UINT64 R7;
70 UINT64 SP;
71 UINT64 BR0;
72 UINT64 BR1;
73 UINT64 BR2;
74 UINT64 BR3;
75 UINT64 BR4;
76 UINT64 BR5;
77 UINT64 InitialUNAT;
78 UINT64 AfterSpillUNAT;
79 UINT64 PFS;
80 UINT64 BSP;
81 UINT64 Predicates;
82 UINT64 LoopCount;
83 UINT64 FPSR;
84 } BASE_LIBRARY_JUMP_BUFFER;
85
86 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10
87
88 #endif // defined (MDE_CPU_IPF)
89
90 #if defined (MDE_CPU_X64)
91 ///
92 /// The x64 architecture context buffer used by SetJump() and LongJump().
93 ///
94 typedef struct {
95 UINT64 Rbx;
96 UINT64 Rsp;
97 UINT64 Rbp;
98 UINT64 Rdi;
99 UINT64 Rsi;
100 UINT64 R12;
101 UINT64 R13;
102 UINT64 R14;
103 UINT64 R15;
104 UINT64 Rip;
105 UINT64 MxCsr;
106 UINT8 XmmBuffer[160]; ///< XMM6-XMM15.
107 } BASE_LIBRARY_JUMP_BUFFER;
108
109 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
110
111 #endif // defined (MDE_CPU_X64)
112
113 #if defined (MDE_CPU_EBC)
114 ///
115 /// The EBC context buffer used by SetJump() and LongJump().
116 ///
117 typedef struct {
118 UINT64 R0;
119 UINT64 R1;
120 UINT64 R2;
121 UINT64 R3;
122 UINT64 IP;
123 } BASE_LIBRARY_JUMP_BUFFER;
124
125 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
126
127 #endif // defined (MDE_CPU_EBC)
128
129 #if defined (MDE_CPU_ARM)
130
131 typedef struct {
132 UINT32 R3; ///< A copy of R13.
133 UINT32 R4;
134 UINT32 R5;
135 UINT32 R6;
136 UINT32 R7;
137 UINT32 R8;
138 UINT32 R9;
139 UINT32 R10;
140 UINT32 R11;
141 UINT32 R12;
142 UINT32 R14;
143 } BASE_LIBRARY_JUMP_BUFFER;
144
145 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4
146
147 #endif // defined (MDE_CPU_ARM)
148
149 #if defined (MDE_CPU_AARCH64)
150 typedef struct {
151 // GP regs
152 UINT64 X19;
153 UINT64 X20;
154 UINT64 X21;
155 UINT64 X22;
156 UINT64 X23;
157 UINT64 X24;
158 UINT64 X25;
159 UINT64 X26;
160 UINT64 X27;
161 UINT64 X28;
162 UINT64 FP;
163 UINT64 LR;
164 UINT64 IP0;
165
166 // FP regs
167 UINT64 D8;
168 UINT64 D9;
169 UINT64 D10;
170 UINT64 D11;
171 UINT64 D12;
172 UINT64 D13;
173 UINT64 D14;
174 UINT64 D15;
175 } BASE_LIBRARY_JUMP_BUFFER;
176
177 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
178
179 #endif // defined (MDE_CPU_AARCH64)
180
181
182 //
183 // String Services
184 //
185
186
187 /**
188 Returns the length of a Null-terminated Unicode string.
189
190 This function is similar as strlen_s defined in C11.
191
192 If String is not aligned on a 16-bit boundary, then ASSERT().
193
194 @param String A pointer to a Null-terminated Unicode string.
195 @param MaxSize The maximum number of Destination Unicode
196 char, including terminating null char.
197
198 @retval 0 If String is NULL.
199 @retval MaxSize If there is no null character in the first MaxSize characters of String.
200 @return The number of characters that percede the terminating null character.
201
202 **/
203 UINTN
204 EFIAPI
205 StrnLenS (
206 IN CONST CHAR16 *String,
207 IN UINTN MaxSize
208 );
209
210 /**
211 Returns the size of a Null-terminated Unicode string in bytes, including the
212 Null terminator.
213
214 This function returns the size of the Null-terminated Unicode string
215 specified by String in bytes, including the Null terminator.
216
217 If String is not aligned on a 16-bit boundary, then ASSERT().
218
219 @param String A pointer to a Null-terminated Unicode string.
220 @param MaxSize The maximum number of Destination Unicode
221 char, including the Null terminator.
222
223 @retval 0 If String is NULL.
224 @retval (sizeof (CHAR16) * (MaxSize + 1))
225 If there is no Null terminator in the first MaxSize characters of
226 String.
227 @return The size of the Null-terminated Unicode string in bytes, including
228 the Null terminator.
229
230 **/
231 UINTN
232 EFIAPI
233 StrnSizeS (
234 IN CONST CHAR16 *String,
235 IN UINTN MaxSize
236 );
237
238 /**
239 Copies the string pointed to by Source (including the terminating null char)
240 to the array pointed to by Destination.
241
242 This function is similar as strcpy_s defined in C11.
243
244 If Destination is not aligned on a 16-bit boundary, then ASSERT().
245 If Source is not aligned on a 16-bit boundary, then ASSERT().
246 If an error would be returned, then the function will also ASSERT().
247
248 If an error is returned, then the Destination is unmodified.
249
250 @param Destination A pointer to a Null-terminated Unicode string.
251 @param DestMax The maximum number of Destination Unicode
252 char, including terminating null char.
253 @param Source A pointer to a Null-terminated Unicode string.
254
255 @retval RETURN_SUCCESS String is copied.
256 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
257 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
258 If Source is NULL.
259 If PcdMaximumUnicodeStringLength is not zero,
260 and DestMax is greater than
261 PcdMaximumUnicodeStringLength.
262 If DestMax is 0.
263 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
264 **/
265 RETURN_STATUS
266 EFIAPI
267 StrCpyS (
268 OUT CHAR16 *Destination,
269 IN UINTN DestMax,
270 IN CONST CHAR16 *Source
271 );
272
273 /**
274 Copies not more than Length successive char from the string pointed to by
275 Source to the array pointed to by Destination. If no null char is copied from
276 Source, then Destination[Length] is always set to null.
277
278 This function is similar as strncpy_s defined in C11.
279
280 If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
281 If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
282 If an error would be returned, then the function will also ASSERT().
283
284 If an error is returned, then the Destination is unmodified.
285
286 @param Destination A pointer to a Null-terminated Unicode string.
287 @param DestMax The maximum number of Destination Unicode
288 char, including terminating null char.
289 @param Source A pointer to a Null-terminated Unicode string.
290 @param Length The maximum number of Unicode characters to copy.
291
292 @retval RETURN_SUCCESS String is copied.
293 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
294 MIN(StrLen(Source), Length).
295 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
296 If Source is NULL.
297 If PcdMaximumUnicodeStringLength is not zero,
298 and DestMax is greater than
299 PcdMaximumUnicodeStringLength.
300 If DestMax is 0.
301 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
302 **/
303 RETURN_STATUS
304 EFIAPI
305 StrnCpyS (
306 OUT CHAR16 *Destination,
307 IN UINTN DestMax,
308 IN CONST CHAR16 *Source,
309 IN UINTN Length
310 );
311
312 /**
313 Appends a copy of the string pointed to by Source (including the terminating
314 null char) to the end of the string pointed to by Destination.
315
316 This function is similar as strcat_s defined in C11.
317
318 If Destination is not aligned on a 16-bit boundary, then ASSERT().
319 If Source is not aligned on a 16-bit boundary, then ASSERT().
320 If an error would be returned, then the function will also ASSERT().
321
322 If an error is returned, then the Destination is unmodified.
323
324 @param Destination A pointer to a Null-terminated Unicode string.
325 @param DestMax The maximum number of Destination Unicode
326 char, including terminating null char.
327 @param Source A pointer to a Null-terminated Unicode string.
328
329 @retval RETURN_SUCCESS String is appended.
330 @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
331 StrLen(Destination).
332 @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
333 greater than StrLen(Source).
334 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
335 If Source is NULL.
336 If PcdMaximumUnicodeStringLength is not zero,
337 and DestMax is greater than
338 PcdMaximumUnicodeStringLength.
339 If DestMax is 0.
340 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
341 **/
342 RETURN_STATUS
343 EFIAPI
344 StrCatS (
345 IN OUT CHAR16 *Destination,
346 IN UINTN DestMax,
347 IN CONST CHAR16 *Source
348 );
349
350 /**
351 Appends not more than Length successive char from the string pointed to by
352 Source to the end of the string pointed to by Destination. If no null char is
353 copied from Source, then Destination[StrLen(Destination) + Length] is always
354 set to null.
355
356 This function is similar as strncat_s defined in C11.
357
358 If Destination is not aligned on a 16-bit boundary, then ASSERT().
359 If Source is not aligned on a 16-bit boundary, then ASSERT().
360 If an error would be returned, then the function will also ASSERT().
361
362 If an error is returned, then the Destination is unmodified.
363
364 @param Destination A pointer to a Null-terminated Unicode string.
365 @param DestMax The maximum number of Destination Unicode
366 char, including terminating null char.
367 @param Source A pointer to a Null-terminated Unicode string.
368 @param Length The maximum number of Unicode characters to copy.
369
370 @retval RETURN_SUCCESS String is appended.
371 @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
372 StrLen(Destination).
373 @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
374 greater than MIN(StrLen(Source), Length).
375 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
376 If Source is NULL.
377 If PcdMaximumUnicodeStringLength is not zero,
378 and DestMax is greater than
379 PcdMaximumUnicodeStringLength.
380 If DestMax is 0.
381 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
382 **/
383 RETURN_STATUS
384 EFIAPI
385 StrnCatS (
386 IN OUT CHAR16 *Destination,
387 IN UINTN DestMax,
388 IN CONST CHAR16 *Source,
389 IN UINTN Length
390 );
391
392 /**
393 Convert a Null-terminated Unicode decimal string to a value of type UINTN.
394
395 This function outputs a value of type UINTN by interpreting the contents of
396 the Unicode string specified by String as a decimal number. The format of the
397 input Unicode string String is:
398
399 [spaces] [decimal digits].
400
401 The valid decimal digit character is in the range [0-9]. The function will
402 ignore the pad space, which includes spaces or tab characters, before
403 [decimal digits]. The running zero in the beginning of [decimal digits] will
404 be ignored. Then, the function stops at the first character that is a not a
405 valid decimal character or a Null-terminator, whichever one comes first.
406
407 If String is NULL, then ASSERT().
408 If Data is NULL, then ASSERT().
409 If String is not aligned in a 16-bit boundary, then ASSERT().
410 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
411 PcdMaximumUnicodeStringLength Unicode characters, not including the
412 Null-terminator, then ASSERT().
413
414 If String has no valid decimal digits in the above format, then 0 is stored
415 at the location pointed to by Data.
416 If the number represented by String exceeds the range defined by UINTN, then
417 MAX_UINTN is stored at the location pointed to by Data.
418
419 If EndPointer is not NULL, a pointer to the character that stopped the scan
420 is stored at the location pointed to by EndPointer. If String has no valid
421 decimal digits right after the optional pad spaces, the value of String is
422 stored at the location pointed to by EndPointer.
423
424 @param String Pointer to a Null-terminated Unicode string.
425 @param EndPointer Pointer to character that stops scan.
426 @param Data Pointer to the converted value.
427
428 @retval RETURN_SUCCESS Value is translated from String.
429 @retval RETURN_INVALID_PARAMETER If String is NULL.
430 If Data is NULL.
431 If PcdMaximumUnicodeStringLength is not
432 zero, and String contains more than
433 PcdMaximumUnicodeStringLength Unicode
434 characters, not including the
435 Null-terminator.
436 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
437 the range defined by UINTN.
438
439 **/
440 RETURN_STATUS
441 EFIAPI
442 StrDecimalToUintnS (
443 IN CONST CHAR16 *String,
444 OUT CHAR16 **EndPointer, OPTIONAL
445 OUT UINTN *Data
446 );
447
448 /**
449 Convert a Null-terminated Unicode decimal string to a value of type UINT64.
450
451 This function outputs a value of type UINT64 by interpreting the contents of
452 the Unicode string specified by String as a decimal number. The format of the
453 input Unicode string String is:
454
455 [spaces] [decimal digits].
456
457 The valid decimal digit character is in the range [0-9]. The function will
458 ignore the pad space, which includes spaces or tab characters, before
459 [decimal digits]. The running zero in the beginning of [decimal digits] will
460 be ignored. Then, the function stops at the first character that is a not a
461 valid decimal character or a Null-terminator, whichever one comes first.
462
463 If String is NULL, then ASSERT().
464 If Data is NULL, then ASSERT().
465 If String is not aligned in a 16-bit boundary, then ASSERT().
466 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
467 PcdMaximumUnicodeStringLength Unicode characters, not including the
468 Null-terminator, then ASSERT().
469
470 If String has no valid decimal digits in the above format, then 0 is stored
471 at the location pointed to by Data.
472 If the number represented by String exceeds the range defined by UINT64, then
473 MAX_UINT64 is stored at the location pointed to by Data.
474
475 If EndPointer is not NULL, a pointer to the character that stopped the scan
476 is stored at the location pointed to by EndPointer. If String has no valid
477 decimal digits right after the optional pad spaces, the value of String is
478 stored at the location pointed to by EndPointer.
479
480 @param String Pointer to a Null-terminated Unicode string.
481 @param EndPointer Pointer to character that stops scan.
482 @param Data Pointer to the converted value.
483
484 @retval RETURN_SUCCESS Value is translated from String.
485 @retval RETURN_INVALID_PARAMETER If String is NULL.
486 If Data is NULL.
487 If PcdMaximumUnicodeStringLength is not
488 zero, and String contains more than
489 PcdMaximumUnicodeStringLength Unicode
490 characters, not including the
491 Null-terminator.
492 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
493 the range defined by UINT64.
494
495 **/
496 RETURN_STATUS
497 EFIAPI
498 StrDecimalToUint64S (
499 IN CONST CHAR16 *String,
500 OUT CHAR16 **EndPointer, OPTIONAL
501 OUT UINT64 *Data
502 );
503
504 /**
505 Convert a Null-terminated Unicode hexadecimal string to a value of type
506 UINTN.
507
508 This function outputs a value of type UINTN by interpreting the contents of
509 the Unicode string specified by String as a hexadecimal number. The format of
510 the input Unicode string String is:
511
512 [spaces][zeros][x][hexadecimal digits].
513
514 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
515 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
516 If "x" appears in the input string, it must be prefixed with at least one 0.
517 The function will ignore the pad space, which includes spaces or tab
518 characters, before [zeros], [x] or [hexadecimal digit]. The running zero
519 before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts
520 after [x] or the first valid hexadecimal digit. Then, the function stops at
521 the first character that is a not a valid hexadecimal character or NULL,
522 whichever one comes first.
523
524 If String is NULL, then ASSERT().
525 If Data is NULL, then ASSERT().
526 If String is not aligned in a 16-bit boundary, then ASSERT().
527 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
528 PcdMaximumUnicodeStringLength Unicode characters, not including the
529 Null-terminator, then ASSERT().
530
531 If String has no valid hexadecimal digits in the above format, then 0 is
532 stored at the location pointed to by Data.
533 If the number represented by String exceeds the range defined by UINTN, then
534 MAX_UINTN is stored at the location pointed to by Data.
535
536 If EndPointer is not NULL, a pointer to the character that stopped the scan
537 is stored at the location pointed to by EndPointer. If String has no valid
538 hexadecimal digits right after the optional pad spaces, the value of String
539 is stored at the location pointed to by EndPointer.
540
541 @param String Pointer to a Null-terminated Unicode string.
542 @param EndPointer Pointer to character that stops scan.
543 @param Data Pointer to the converted value.
544
545 @retval RETURN_SUCCESS Value is translated from String.
546 @retval RETURN_INVALID_PARAMETER If String is NULL.
547 If Data is NULL.
548 If PcdMaximumUnicodeStringLength is not
549 zero, and String contains more than
550 PcdMaximumUnicodeStringLength Unicode
551 characters, not including the
552 Null-terminator.
553 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
554 the range defined by UINTN.
555
556 **/
557 RETURN_STATUS
558 EFIAPI
559 StrHexToUintnS (
560 IN CONST CHAR16 *String,
561 OUT CHAR16 **EndPointer, OPTIONAL
562 OUT UINTN *Data
563 );
564
565 /**
566 Convert a Null-terminated Unicode hexadecimal string to a value of type
567 UINT64.
568
569 This function outputs a value of type UINT64 by interpreting the contents of
570 the Unicode string specified by String as a hexadecimal number. The format of
571 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
579 characters, before [zeros], [x] or [hexadecimal digit]. The running zero
580 before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts
581 after [x] or the first valid hexadecimal digit. Then, the function stops at
582 the first character that is a not a valid hexadecimal character or NULL,
583 whichever one comes first.
584
585 If String is NULL, then ASSERT().
586 If Data is NULL, then ASSERT().
587 If String is not aligned in a 16-bit boundary, then ASSERT().
588 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
589 PcdMaximumUnicodeStringLength Unicode characters, not including the
590 Null-terminator, then ASSERT().
591
592 If String has no valid hexadecimal digits in the above format, then 0 is
593 stored at the location pointed to by Data.
594 If the number represented by String exceeds the range defined by UINT64, then
595 MAX_UINT64 is stored at the location pointed to by Data.
596
597 If EndPointer is not NULL, a pointer to the character that stopped the scan
598 is stored at the location pointed to by EndPointer. If String has no valid
599 hexadecimal digits right after the optional pad spaces, the value of String
600 is stored at the location pointed to by EndPointer.
601
602 @param String Pointer to a Null-terminated Unicode string.
603 @param EndPointer Pointer to character that stops scan.
604 @param Data Pointer to the converted value.
605
606 @retval RETURN_SUCCESS Value is translated from String.
607 @retval RETURN_INVALID_PARAMETER If String is NULL.
608 If Data is NULL.
609 If PcdMaximumUnicodeStringLength is not
610 zero, and String contains more than
611 PcdMaximumUnicodeStringLength Unicode
612 characters, not including the
613 Null-terminator.
614 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
615 the range defined by UINT64.
616
617 **/
618 RETURN_STATUS
619 EFIAPI
620 StrHexToUint64S (
621 IN CONST CHAR16 *String,
622 OUT CHAR16 **EndPointer, OPTIONAL
623 OUT UINT64 *Data
624 );
625
626 /**
627 Returns the length of a Null-terminated Ascii string.
628
629 This function is similar as strlen_s defined in C11.
630
631 @param String A pointer to a Null-terminated Ascii string.
632 @param MaxSize The maximum number of Destination Ascii
633 char, including terminating null char.
634
635 @retval 0 If String is NULL.
636 @retval MaxSize If there is no null character in the first MaxSize characters of String.
637 @return The number of characters that percede the terminating null character.
638
639 **/
640 UINTN
641 EFIAPI
642 AsciiStrnLenS (
643 IN CONST CHAR8 *String,
644 IN UINTN MaxSize
645 );
646
647 /**
648 Returns the size of a Null-terminated Ascii string in bytes, including the
649 Null terminator.
650
651 This function returns the size of the Null-terminated Ascii string specified
652 by String in bytes, including the Null terminator.
653
654 @param String A pointer to a Null-terminated Ascii string.
655 @param MaxSize The maximum number of Destination Ascii
656 char, including the Null terminator.
657
658 @retval 0 If String is NULL.
659 @retval (sizeof (CHAR8) * (MaxSize + 1))
660 If there is no Null terminator in the first MaxSize characters of
661 String.
662 @return The size of the Null-terminated Ascii string in bytes, including the
663 Null terminator.
664
665 **/
666 UINTN
667 EFIAPI
668 AsciiStrnSizeS (
669 IN CONST CHAR8 *String,
670 IN UINTN MaxSize
671 );
672
673 /**
674 Copies the string pointed to by Source (including the terminating null char)
675 to the array pointed to by Destination.
676
677 This function is similar as strcpy_s defined in C11.
678
679 If an error would be returned, then the function will also ASSERT().
680
681 If an error is returned, then the Destination is unmodified.
682
683 @param Destination A pointer to a Null-terminated Ascii string.
684 @param DestMax The maximum number of Destination Ascii
685 char, including terminating null char.
686 @param Source A pointer to a Null-terminated Ascii string.
687
688 @retval RETURN_SUCCESS String is copied.
689 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
690 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
691 If Source is NULL.
692 If PcdMaximumAsciiStringLength is not zero,
693 and DestMax is greater than
694 PcdMaximumAsciiStringLength.
695 If DestMax is 0.
696 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
697 **/
698 RETURN_STATUS
699 EFIAPI
700 AsciiStrCpyS (
701 OUT CHAR8 *Destination,
702 IN UINTN DestMax,
703 IN CONST CHAR8 *Source
704 );
705
706 /**
707 Copies not more than Length successive char from the string pointed to by
708 Source to the array pointed to by Destination. If no null char is copied from
709 Source, then Destination[Length] is always set to null.
710
711 This function is similar as strncpy_s defined in C11.
712
713 If an error would be returned, then the function will also ASSERT().
714
715 If an error is returned, then the Destination is unmodified.
716
717 @param Destination A pointer to a Null-terminated Ascii string.
718 @param DestMax The maximum number of Destination Ascii
719 char, including terminating null char.
720 @param Source A pointer to a Null-terminated Ascii string.
721 @param Length The maximum number of Ascii characters to copy.
722
723 @retval RETURN_SUCCESS String is copied.
724 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
725 MIN(StrLen(Source), Length).
726 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
727 If Source is NULL.
728 If PcdMaximumAsciiStringLength is not zero,
729 and DestMax is greater than
730 PcdMaximumAsciiStringLength.
731 If DestMax is 0.
732 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
733 **/
734 RETURN_STATUS
735 EFIAPI
736 AsciiStrnCpyS (
737 OUT CHAR8 *Destination,
738 IN UINTN DestMax,
739 IN CONST CHAR8 *Source,
740 IN UINTN Length
741 );
742
743 /**
744 Appends a copy of the string pointed to by Source (including the terminating
745 null char) to the end of the string pointed to by Destination.
746
747 This function is similar as strcat_s defined in C11.
748
749 If an error would be returned, then the function will also ASSERT().
750
751 If an error is returned, then the Destination is unmodified.
752
753 @param Destination A pointer to a Null-terminated Ascii string.
754 @param DestMax The maximum number of Destination Ascii
755 char, including terminating null char.
756 @param Source A pointer to a Null-terminated Ascii string.
757
758 @retval RETURN_SUCCESS String is appended.
759 @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
760 StrLen(Destination).
761 @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
762 greater than StrLen(Source).
763 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
764 If Source is NULL.
765 If PcdMaximumAsciiStringLength is not zero,
766 and DestMax is greater than
767 PcdMaximumAsciiStringLength.
768 If DestMax is 0.
769 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
770 **/
771 RETURN_STATUS
772 EFIAPI
773 AsciiStrCatS (
774 IN OUT CHAR8 *Destination,
775 IN UINTN DestMax,
776 IN CONST CHAR8 *Source
777 );
778
779 /**
780 Appends not more than Length successive char from the string pointed to by
781 Source to the end of the string pointed to by Destination. If no null char is
782 copied from Source, then Destination[StrLen(Destination) + Length] is always
783 set to null.
784
785 This function is similar as strncat_s defined in C11.
786
787 If an error would be returned, then the function will also ASSERT().
788
789 If an error is returned, then the Destination is unmodified.
790
791 @param Destination A pointer to a Null-terminated Ascii string.
792 @param DestMax The maximum number of Destination Ascii
793 char, including terminating null char.
794 @param Source A pointer to a Null-terminated Ascii string.
795 @param Length The maximum number of Ascii characters to copy.
796
797 @retval RETURN_SUCCESS String is appended.
798 @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
799 StrLen(Destination).
800 @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
801 greater than MIN(StrLen(Source), Length).
802 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
803 If Source is NULL.
804 If PcdMaximumAsciiStringLength is not zero,
805 and DestMax is greater than
806 PcdMaximumAsciiStringLength.
807 If DestMax is 0.
808 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
809 **/
810 RETURN_STATUS
811 EFIAPI
812 AsciiStrnCatS (
813 IN OUT CHAR8 *Destination,
814 IN UINTN DestMax,
815 IN CONST CHAR8 *Source,
816 IN UINTN Length
817 );
818
819 /**
820 Convert a Null-terminated Ascii decimal string to a value of type UINTN.
821
822 This function outputs a value of type UINTN by interpreting the contents of
823 the Ascii string specified by String as a decimal number. The format of the
824 input Ascii string String is:
825
826 [spaces] [decimal digits].
827
828 The valid decimal digit character is in the range [0-9]. The function will
829 ignore the pad space, which includes spaces or tab characters, before
830 [decimal digits]. The running zero in the beginning of [decimal digits] will
831 be ignored. Then, the function stops at the first character that is a not a
832 valid decimal character or a Null-terminator, whichever one comes first.
833
834 If String is NULL, then ASSERT().
835 If Data is NULL, then ASSERT().
836 If PcdMaximumAsciiStringLength is not zero, and String contains more than
837 PcdMaximumAsciiStringLength Ascii characters, not including the
838 Null-terminator, then ASSERT().
839
840 If String has no valid decimal digits in the above format, then 0 is stored
841 at the location pointed to by Data.
842 If the number represented by String exceeds the range defined by UINTN, then
843 MAX_UINTN is stored at the location pointed to by Data.
844
845 If EndPointer is not NULL, a pointer to the character that stopped the scan
846 is stored at the location pointed to by EndPointer. If String has no valid
847 decimal digits right after the optional pad spaces, the value of String is
848 stored at the location pointed to by EndPointer.
849
850 @param String Pointer to a Null-terminated Ascii string.
851 @param EndPointer Pointer to character that stops scan.
852 @param Data Pointer to the converted value.
853
854 @retval RETURN_SUCCESS Value is translated from String.
855 @retval RETURN_INVALID_PARAMETER If String is NULL.
856 If Data is NULL.
857 If PcdMaximumAsciiStringLength is not zero,
858 and String contains more than
859 PcdMaximumAsciiStringLength Ascii
860 characters, not including the
861 Null-terminator.
862 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
863 the range defined by UINTN.
864
865 **/
866 RETURN_STATUS
867 EFIAPI
868 AsciiStrDecimalToUintnS (
869 IN CONST CHAR8 *String,
870 OUT CHAR8 **EndPointer, OPTIONAL
871 OUT UINTN *Data
872 );
873
874 /**
875 Convert a Null-terminated Ascii decimal string to a value of type UINT64.
876
877 This function outputs a value of type UINT64 by interpreting the contents of
878 the Ascii string specified by String as a decimal number. The format of the
879 input Ascii string String is:
880
881 [spaces] [decimal digits].
882
883 The valid decimal digit character is in the range [0-9]. The function will
884 ignore the pad space, which includes spaces or tab characters, before
885 [decimal digits]. The running zero in the beginning of [decimal digits] will
886 be ignored. Then, the function stops at the first character that is a not a
887 valid decimal character or a Null-terminator, whichever one comes first.
888
889 If String is NULL, then ASSERT().
890 If Data is NULL, then ASSERT().
891 If PcdMaximumAsciiStringLength is not zero, and String contains more than
892 PcdMaximumAsciiStringLength Ascii characters, not including the
893 Null-terminator, then ASSERT().
894
895 If String has no valid decimal digits in the above format, then 0 is stored
896 at the location pointed to by Data.
897 If the number represented by String exceeds the range defined by UINT64, then
898 MAX_UINT64 is stored at the location pointed to by Data.
899
900 If EndPointer is not NULL, a pointer to the character that stopped the scan
901 is stored at the location pointed to by EndPointer. If String has no valid
902 decimal digits right after the optional pad spaces, the value of String is
903 stored at the location pointed to by EndPointer.
904
905 @param String Pointer to a Null-terminated Ascii string.
906 @param EndPointer Pointer to character that stops scan.
907 @param Data Pointer to the converted value.
908
909 @retval RETURN_SUCCESS Value is translated from String.
910 @retval RETURN_INVALID_PARAMETER If String is NULL.
911 If Data is NULL.
912 If PcdMaximumAsciiStringLength is not zero,
913 and String contains more than
914 PcdMaximumAsciiStringLength Ascii
915 characters, not including the
916 Null-terminator.
917 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
918 the range defined by UINT64.
919
920 **/
921 RETURN_STATUS
922 EFIAPI
923 AsciiStrDecimalToUint64S (
924 IN CONST CHAR8 *String,
925 OUT CHAR8 **EndPointer, OPTIONAL
926 OUT UINT64 *Data
927 );
928
929 /**
930 Convert a Null-terminated Ascii hexadecimal string to a value of type UINTN.
931
932 This function outputs a value of type UINTN by interpreting the contents of
933 the Ascii string specified by String as a hexadecimal number. The format of
934 the input Ascii string String is:
935
936 [spaces][zeros][x][hexadecimal digits].
937
938 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
939 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If
940 "x" appears in the input string, it must be prefixed with at least one 0. The
941 function will ignore the pad space, which includes spaces or tab characters,
942 before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or
943 [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or
944 the first valid hexadecimal digit. Then, the function stops at the first
945 character that is a not a valid hexadecimal character or Null-terminator,
946 whichever on comes first.
947
948 If String is NULL, then ASSERT().
949 If Data is NULL, then ASSERT().
950 If PcdMaximumAsciiStringLength is not zero, and String contains more than
951 PcdMaximumAsciiStringLength Ascii characters, not including the
952 Null-terminator, then ASSERT().
953
954 If String has no valid hexadecimal digits in the above format, then 0 is
955 stored at the location pointed to by Data.
956 If the number represented by String exceeds the range defined by UINTN, then
957 MAX_UINTN is stored at the location pointed to by Data.
958
959 If EndPointer is not NULL, a pointer to the character that stopped the scan
960 is stored at the location pointed to by EndPointer. If String has no valid
961 hexadecimal digits right after the optional pad spaces, the value of String
962 is stored at the location pointed to by EndPointer.
963
964 @param String Pointer to a Null-terminated Ascii string.
965 @param EndPointer Pointer to character that stops scan.
966 @param Data Pointer to the converted value.
967
968 @retval RETURN_SUCCESS Value is translated from String.
969 @retval RETURN_INVALID_PARAMETER If String is NULL.
970 If Data is NULL.
971 If PcdMaximumAsciiStringLength is not zero,
972 and String contains more than
973 PcdMaximumAsciiStringLength Ascii
974 characters, not including the
975 Null-terminator.
976 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
977 the range defined by UINTN.
978
979 **/
980 RETURN_STATUS
981 EFIAPI
982 AsciiStrHexToUintnS (
983 IN CONST CHAR8 *String,
984 OUT CHAR8 **EndPointer, OPTIONAL
985 OUT UINTN *Data
986 );
987
988 /**
989 Convert a Null-terminated Ascii hexadecimal string to a value of type UINT64.
990
991 This function outputs a value of type UINT64 by interpreting the contents of
992 the Ascii string specified by String as a hexadecimal number. The format of
993 the input Ascii string String is:
994
995 [spaces][zeros][x][hexadecimal digits].
996
997 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
998 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If
999 "x" appears in the input string, it must be prefixed with at least one 0. The
1000 function will ignore the pad space, which includes spaces or tab characters,
1001 before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or
1002 [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or
1003 the first valid hexadecimal digit. Then, the function stops at the first
1004 character that is a not a valid hexadecimal character or Null-terminator,
1005 whichever on comes first.
1006
1007 If String is NULL, then ASSERT().
1008 If Data is NULL, then ASSERT().
1009 If PcdMaximumAsciiStringLength is not zero, and String contains more than
1010 PcdMaximumAsciiStringLength Ascii characters, not including the
1011 Null-terminator, then ASSERT().
1012
1013 If String has no valid hexadecimal digits in the above format, then 0 is
1014 stored at the location pointed to by Data.
1015 If the number represented by String exceeds the range defined by UINT64, then
1016 MAX_UINT64 is stored at the location pointed to by Data.
1017
1018 If EndPointer is not NULL, a pointer to the character that stopped the scan
1019 is stored at the location pointed to by EndPointer. If String has no valid
1020 hexadecimal digits right after the optional pad spaces, the value of String
1021 is stored at the location pointed to by EndPointer.
1022
1023 @param String Pointer to a Null-terminated Ascii string.
1024 @param EndPointer Pointer to character that stops scan.
1025 @param Data Pointer to the converted value.
1026
1027 @retval RETURN_SUCCESS Value is translated from String.
1028 @retval RETURN_INVALID_PARAMETER If String is NULL.
1029 If Data is NULL.
1030 If PcdMaximumAsciiStringLength is not zero,
1031 and String contains more than
1032 PcdMaximumAsciiStringLength Ascii
1033 characters, not including the
1034 Null-terminator.
1035 @retval RETURN_UNSUPPORTED If the number represented by String exceeds
1036 the range defined by UINT64.
1037
1038 **/
1039 RETURN_STATUS
1040 EFIAPI
1041 AsciiStrHexToUint64S (
1042 IN CONST CHAR8 *String,
1043 OUT CHAR8 **EndPointer, OPTIONAL
1044 OUT UINT64 *Data
1045 );
1046
1047
1048 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
1049
1050 /**
1051 [ATTENTION] This function is deprecated for security reason.
1052
1053 Copies one Null-terminated Unicode string to another Null-terminated Unicode
1054 string and returns the new Unicode string.
1055
1056 This function copies the contents of the Unicode string Source to the Unicode
1057 string Destination, and returns Destination. If Source and Destination
1058 overlap, then the results are undefined.
1059
1060 If Destination is NULL, then ASSERT().
1061 If Destination is not aligned on a 16-bit boundary, then ASSERT().
1062 If Source is NULL, then ASSERT().
1063 If Source is not aligned on a 16-bit boundary, then ASSERT().
1064 If Source and Destination overlap, then ASSERT().
1065 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1066 PcdMaximumUnicodeStringLength Unicode characters not including the
1067 Null-terminator, then ASSERT().
1068
1069 @param Destination The pointer to a Null-terminated Unicode string.
1070 @param Source The pointer to a Null-terminated Unicode string.
1071
1072 @return Destination.
1073
1074 **/
1075 CHAR16 *
1076 EFIAPI
1077 StrCpy (
1078 OUT CHAR16 *Destination,
1079 IN CONST CHAR16 *Source
1080 );
1081
1082
1083 /**
1084 [ATTENTION] This function is deprecated for security reason.
1085
1086 Copies up to a specified length from one Null-terminated Unicode string to
1087 another Null-terminated Unicode string and returns the new Unicode string.
1088
1089 This function copies the contents of the Unicode string Source to the Unicode
1090 string Destination, and returns Destination. At most, Length Unicode
1091 characters are copied from Source to Destination. If Length is 0, then
1092 Destination is returned unmodified. If Length is greater that the number of
1093 Unicode characters in Source, then Destination is padded with Null Unicode
1094 characters. If Source and Destination overlap, then the results are
1095 undefined.
1096
1097 If Length > 0 and Destination is NULL, then ASSERT().
1098 If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
1099 If Length > 0 and Source is NULL, then ASSERT().
1100 If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
1101 If Source and Destination overlap, then ASSERT().
1102 If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
1103 PcdMaximumUnicodeStringLength, then ASSERT().
1104 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1105 PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
1106 then ASSERT().
1107
1108 @param Destination The pointer to a Null-terminated Unicode string.
1109 @param Source The pointer to a Null-terminated Unicode string.
1110 @param Length The maximum number of Unicode characters to copy.
1111
1112 @return Destination.
1113
1114 **/
1115 CHAR16 *
1116 EFIAPI
1117 StrnCpy (
1118 OUT CHAR16 *Destination,
1119 IN CONST CHAR16 *Source,
1120 IN UINTN Length
1121 );
1122 #endif
1123
1124 /**
1125 Returns the length of a Null-terminated Unicode string.
1126
1127 This function returns the number of Unicode characters in the Null-terminated
1128 Unicode string specified by String.
1129
1130 If String is NULL, then ASSERT().
1131 If String is not aligned on a 16-bit boundary, then ASSERT().
1132 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1133 PcdMaximumUnicodeStringLength Unicode characters not including the
1134 Null-terminator, then ASSERT().
1135
1136 @param String Pointer to a Null-terminated Unicode string.
1137
1138 @return The length of String.
1139
1140 **/
1141 UINTN
1142 EFIAPI
1143 StrLen (
1144 IN CONST CHAR16 *String
1145 );
1146
1147
1148 /**
1149 Returns the size of a Null-terminated Unicode string in bytes, including the
1150 Null terminator.
1151
1152 This function returns the size, in bytes, of the Null-terminated Unicode string
1153 specified by String.
1154
1155 If String is NULL, then ASSERT().
1156 If String is not aligned on a 16-bit boundary, then ASSERT().
1157 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1158 PcdMaximumUnicodeStringLength Unicode characters not including the
1159 Null-terminator, then ASSERT().
1160
1161 @param String The pointer to a Null-terminated Unicode string.
1162
1163 @return The size of String.
1164
1165 **/
1166 UINTN
1167 EFIAPI
1168 StrSize (
1169 IN CONST CHAR16 *String
1170 );
1171
1172
1173 /**
1174 Compares two Null-terminated Unicode strings, and returns the difference
1175 between the first mismatched Unicode characters.
1176
1177 This function compares the Null-terminated Unicode string FirstString to the
1178 Null-terminated Unicode string SecondString. If FirstString is identical to
1179 SecondString, then 0 is returned. Otherwise, the value returned is the first
1180 mismatched Unicode character in SecondString subtracted from the first
1181 mismatched Unicode character in FirstString.
1182
1183 If FirstString is NULL, then ASSERT().
1184 If FirstString is not aligned on a 16-bit boundary, then ASSERT().
1185 If SecondString is NULL, then ASSERT().
1186 If SecondString is not aligned on a 16-bit boundary, then ASSERT().
1187 If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
1188 than PcdMaximumUnicodeStringLength Unicode characters not including the
1189 Null-terminator, then ASSERT().
1190 If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
1191 than PcdMaximumUnicodeStringLength Unicode characters, not including the
1192 Null-terminator, then ASSERT().
1193
1194 @param FirstString The pointer to a Null-terminated Unicode string.
1195 @param SecondString The pointer to a Null-terminated Unicode string.
1196
1197 @retval 0 FirstString is identical to SecondString.
1198 @return others FirstString is not identical to SecondString.
1199
1200 **/
1201 INTN
1202 EFIAPI
1203 StrCmp (
1204 IN CONST CHAR16 *FirstString,
1205 IN CONST CHAR16 *SecondString
1206 );
1207
1208
1209 /**
1210 Compares up to a specified length the contents of two Null-terminated Unicode strings,
1211 and returns the difference between the first mismatched Unicode characters.
1212
1213 This function compares the Null-terminated Unicode string FirstString to the
1214 Null-terminated Unicode string SecondString. At most, Length Unicode
1215 characters will be compared. If Length is 0, then 0 is returned. If
1216 FirstString is identical to SecondString, then 0 is returned. Otherwise, the
1217 value returned is the first mismatched Unicode character in SecondString
1218 subtracted from the first mismatched Unicode character in FirstString.
1219
1220 If Length > 0 and FirstString is NULL, then ASSERT().
1221 If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT().
1222 If Length > 0 and SecondString is NULL, then ASSERT().
1223 If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT().
1224 If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
1225 PcdMaximumUnicodeStringLength, then ASSERT().
1226 If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than
1227 PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
1228 then ASSERT().
1229 If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than
1230 PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
1231 then ASSERT().
1232
1233 @param FirstString The pointer to a Null-terminated Unicode string.
1234 @param SecondString The pointer to a Null-terminated Unicode string.
1235 @param Length The maximum number of Unicode characters to compare.
1236
1237 @retval 0 FirstString is identical to SecondString.
1238 @return others FirstString is not identical to SecondString.
1239
1240 **/
1241 INTN
1242 EFIAPI
1243 StrnCmp (
1244 IN CONST CHAR16 *FirstString,
1245 IN CONST CHAR16 *SecondString,
1246 IN UINTN Length
1247 );
1248
1249
1250 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
1251
1252 /**
1253 [ATTENTION] This function is deprecated for security reason.
1254
1255 Concatenates one Null-terminated Unicode string to another Null-terminated
1256 Unicode string, and returns the concatenated Unicode string.
1257
1258 This function concatenates two Null-terminated Unicode strings. The contents
1259 of Null-terminated Unicode string Source are concatenated to the end of
1260 Null-terminated Unicode string Destination. The Null-terminated concatenated
1261 Unicode String is returned. If Source and Destination overlap, then the
1262 results are undefined.
1263
1264 If Destination is NULL, then ASSERT().
1265 If Destination is not aligned on a 16-bit boundary, then ASSERT().
1266 If Source is NULL, then ASSERT().
1267 If Source is not aligned on a 16-bit boundary, then ASSERT().
1268 If Source and Destination overlap, then ASSERT().
1269 If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
1270 than PcdMaximumUnicodeStringLength Unicode characters, not including the
1271 Null-terminator, then ASSERT().
1272 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1273 PcdMaximumUnicodeStringLength Unicode characters, not including the
1274 Null-terminator, then ASSERT().
1275 If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
1276 and Source results in a Unicode string with more than
1277 PcdMaximumUnicodeStringLength Unicode characters, not including the
1278 Null-terminator, then ASSERT().
1279
1280 @param Destination The pointer to a Null-terminated Unicode string.
1281 @param Source The pointer to a Null-terminated Unicode string.
1282
1283 @return Destination.
1284
1285 **/
1286 CHAR16 *
1287 EFIAPI
1288 StrCat (
1289 IN OUT CHAR16 *Destination,
1290 IN CONST CHAR16 *Source
1291 );
1292
1293
1294 /**
1295 [ATTENTION] This function is deprecated for security reason.
1296
1297 Concatenates up to a specified length one Null-terminated Unicode to the end
1298 of another Null-terminated Unicode string, and returns the concatenated
1299 Unicode string.
1300
1301 This function concatenates two Null-terminated Unicode strings. The contents
1302 of Null-terminated Unicode string Source are concatenated to the end of
1303 Null-terminated Unicode string Destination, and Destination is returned. At
1304 most, Length Unicode characters are concatenated from Source to the end of
1305 Destination, and Destination is always Null-terminated. If Length is 0, then
1306 Destination is returned unmodified. If Source and Destination overlap, then
1307 the results are undefined.
1308
1309 If Destination is NULL, then ASSERT().
1310 If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
1311 If Length > 0 and Source is NULL, then ASSERT().
1312 If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
1313 If Source and Destination overlap, then ASSERT().
1314 If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
1315 PcdMaximumUnicodeStringLength, then ASSERT().
1316 If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
1317 than PcdMaximumUnicodeStringLength Unicode characters, not including the
1318 Null-terminator, then ASSERT().
1319 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1320 PcdMaximumUnicodeStringLength Unicode characters, not including the
1321 Null-terminator, then ASSERT().
1322 If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
1323 and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength
1324 Unicode characters, not including the Null-terminator, then ASSERT().
1325
1326 @param Destination The pointer to a Null-terminated Unicode string.
1327 @param Source The pointer to a Null-terminated Unicode string.
1328 @param Length The maximum number of Unicode characters to concatenate from
1329 Source.
1330
1331 @return Destination.
1332
1333 **/
1334 CHAR16 *
1335 EFIAPI
1336 StrnCat (
1337 IN OUT CHAR16 *Destination,
1338 IN CONST CHAR16 *Source,
1339 IN UINTN Length
1340 );
1341 #endif
1342
1343 /**
1344 Returns the first occurrence of a Null-terminated Unicode sub-string
1345 in a Null-terminated Unicode string.
1346
1347 This function scans the contents of the Null-terminated Unicode string
1348 specified by String and returns the first occurrence of SearchString.
1349 If SearchString is not found in String, then NULL is returned. If
1350 the length of SearchString is zero, then String is returned.
1351
1352 If String is NULL, then ASSERT().
1353 If String is not aligned on a 16-bit boundary, then ASSERT().
1354 If SearchString is NULL, then ASSERT().
1355 If SearchString is not aligned on a 16-bit boundary, then ASSERT().
1356
1357 If PcdMaximumUnicodeStringLength is not zero, and SearchString
1358 or String contains more than PcdMaximumUnicodeStringLength Unicode
1359 characters, not including the Null-terminator, then ASSERT().
1360
1361 @param String The pointer to a Null-terminated Unicode string.
1362 @param SearchString The pointer to a Null-terminated Unicode string to search for.
1363
1364 @retval NULL If the SearchString does not appear in String.
1365 @return others If there is a match.
1366
1367 **/
1368 CHAR16 *
1369 EFIAPI
1370 StrStr (
1371 IN CONST CHAR16 *String,
1372 IN CONST CHAR16 *SearchString
1373 );
1374
1375 /**
1376 Convert a Null-terminated Unicode decimal string to a value of
1377 type UINTN.
1378
1379 This function returns a value of type UINTN by interpreting the contents
1380 of the Unicode string specified by String as a decimal number. The format
1381 of the input Unicode string String is:
1382
1383 [spaces] [decimal digits].
1384
1385 The valid decimal digit character is in the range [0-9]. The
1386 function will ignore the pad space, which includes spaces or
1387 tab characters, before [decimal digits]. The running zero in the
1388 beginning of [decimal digits] will be ignored. Then, the function
1389 stops at the first character that is a not a valid decimal character
1390 or a Null-terminator, whichever one comes first.
1391
1392 If String is NULL, then ASSERT().
1393 If String is not aligned in a 16-bit boundary, then ASSERT().
1394 If String has only pad spaces, then 0 is returned.
1395 If String has no pad spaces or valid decimal digits,
1396 then 0 is returned.
1397 If the number represented by String overflows according
1398 to the range defined by UINTN, then MAX_UINTN is returned.
1399
1400 If PcdMaximumUnicodeStringLength is not zero, and String contains
1401 more than PcdMaximumUnicodeStringLength Unicode characters not including
1402 the Null-terminator, then ASSERT().
1403
1404 @param String The pointer to a Null-terminated Unicode string.
1405
1406 @retval Value translated from String.
1407
1408 **/
1409 UINTN
1410 EFIAPI
1411 StrDecimalToUintn (
1412 IN CONST CHAR16 *String
1413 );
1414
1415 /**
1416 Convert a Null-terminated Unicode decimal string to a value of
1417 type UINT64.
1418
1419 This function returns a value of type UINT64 by interpreting the contents
1420 of the Unicode string specified by String as a decimal number. The format
1421 of the input Unicode string String is:
1422
1423 [spaces] [decimal digits].
1424
1425 The valid decimal digit character is in the range [0-9]. The
1426 function will ignore the pad space, which includes spaces or
1427 tab characters, before [decimal digits]. The running zero in the
1428 beginning of [decimal digits] will be ignored. Then, the function
1429 stops at the first character that is a not a valid decimal character
1430 or a Null-terminator, whichever one comes first.
1431
1432 If String is NULL, then ASSERT().
1433 If String is not aligned in a 16-bit boundary, then ASSERT().
1434 If String has only pad spaces, then 0 is returned.
1435 If String has no pad spaces or valid decimal digits,
1436 then 0 is returned.
1437 If the number represented by String overflows according
1438 to the range defined by UINT64, then MAX_UINT64 is returned.
1439
1440 If PcdMaximumUnicodeStringLength is not zero, and String contains
1441 more than PcdMaximumUnicodeStringLength Unicode characters not including
1442 the Null-terminator, then ASSERT().
1443
1444 @param String The pointer to a Null-terminated Unicode string.
1445
1446 @retval Value translated from String.
1447
1448 **/
1449 UINT64
1450 EFIAPI
1451 StrDecimalToUint64 (
1452 IN CONST CHAR16 *String
1453 );
1454
1455
1456 /**
1457 Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
1458
1459 This function returns a value of type UINTN by interpreting the contents
1460 of the Unicode string specified by String as a hexadecimal number.
1461 The format of the input Unicode string String is:
1462
1463 [spaces][zeros][x][hexadecimal digits].
1464
1465 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1466 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
1467 If "x" appears in the input string, it must be prefixed with at least one 0.
1468 The function will ignore the pad space, which includes spaces or tab characters,
1469 before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
1470 [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
1471 first valid hexadecimal digit. Then, the function stops at the first character
1472 that is a not a valid hexadecimal character or NULL, whichever one comes first.
1473
1474 If String is NULL, then ASSERT().
1475 If String is not aligned in a 16-bit boundary, then ASSERT().
1476 If String has only pad spaces, then zero is returned.
1477 If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
1478 then zero is returned.
1479 If the number represented by String overflows according to the range defined by
1480 UINTN, then MAX_UINTN is returned.
1481
1482 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1483 PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
1484 then ASSERT().
1485
1486 @param String The pointer to a Null-terminated Unicode string.
1487
1488 @retval Value translated from String.
1489
1490 **/
1491 UINTN
1492 EFIAPI
1493 StrHexToUintn (
1494 IN CONST CHAR16 *String
1495 );
1496
1497
1498 /**
1499 Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
1500
1501 This function returns a value of type UINT64 by interpreting the contents
1502 of the Unicode string specified by String as a hexadecimal number.
1503 The format of the input Unicode string String is
1504
1505 [spaces][zeros][x][hexadecimal digits].
1506
1507 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1508 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
1509 If "x" appears in the input string, it must be prefixed with at least one 0.
1510 The function will ignore the pad space, which includes spaces or tab characters,
1511 before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
1512 [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
1513 first valid hexadecimal digit. Then, the function stops at the first character that is
1514 a not a valid hexadecimal character or NULL, whichever one comes first.
1515
1516 If String is NULL, then ASSERT().
1517 If String is not aligned in a 16-bit boundary, then ASSERT().
1518 If String has only pad spaces, then zero is returned.
1519 If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
1520 then zero is returned.
1521 If the number represented by String overflows according to the range defined by
1522 UINT64, then MAX_UINT64 is returned.
1523
1524 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1525 PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
1526 then ASSERT().
1527
1528 @param String The pointer to a Null-terminated Unicode string.
1529
1530 @retval Value translated from String.
1531
1532 **/
1533 UINT64
1534 EFIAPI
1535 StrHexToUint64 (
1536 IN CONST CHAR16 *String
1537 );
1538
1539 /**
1540 Convert a Null-terminated Unicode string to IPv6 address and prefix length.
1541
1542 This function outputs a value of type IPv6_ADDRESS and may output a value
1543 of type UINT8 by interpreting the contents of the Unicode string specified
1544 by String. The format of the input Unicode string String is as follows:
1545
1546 X:X:X:X:X:X:X:X[/P]
1547
1548 X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and
1549 [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low
1550 memory address and high byte is stored in high memory address. P contains decimal
1551 digit characters in the range [0-9]. The running zero in the beginning of P will
1552 be ignored. /P is optional.
1553
1554 When /P is not in the String, the function stops at the first character that is
1555 not a valid hexadecimal digit character after eight X's are converted.
1556
1557 When /P is in the String, the function stops at the first character that is not
1558 a valid decimal digit character after P is converted.
1559
1560 "::" can be used to compress one or more groups of X when X contains only 0.
1561 The "::" can only appear once in the String.
1562
1563 If String is NULL, then ASSERT().
1564
1565 If Address is NULL, then ASSERT().
1566
1567 If String is not aligned in a 16-bit boundary, then ASSERT().
1568
1569 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1570 PcdMaximumUnicodeStringLength Unicode characters, not including the
1571 Null-terminator, then ASSERT().
1572
1573 If EndPointer is not NULL and Address is translated from String, a pointer
1574 to the character that stopped the scan is stored at the location pointed to
1575 by EndPointer.
1576
1577 @param String Pointer to a Null-terminated Unicode string.
1578 @param EndPointer Pointer to character that stops scan.
1579 @param Address Pointer to the converted IPv6 address.
1580 @param PrefixLength Pointer to the converted IPv6 address prefix
1581 length. MAX_UINT8 is returned when /P is
1582 not in the String.
1583
1584 @retval RETURN_SUCCESS Address is translated from String.
1585 @retval RETURN_INVALID_PARAMETER If String is NULL.
1586 If Data is NULL.
1587 @retval RETURN_UNSUPPORTED If X contains more than four hexadecimal
1588 digit characters.
1589 If String contains "::" and number of X
1590 is not less than 8.
1591 If P starts with character that is not a
1592 valid decimal digit character.
1593 If the decimal number converted from P
1594 exceeds 128.
1595
1596 **/
1597 RETURN_STATUS
1598 EFIAPI
1599 StrToIpv6Address (
1600 IN CONST CHAR16 *String,
1601 OUT CHAR16 **EndPointer, OPTIONAL
1602 OUT IPv6_ADDRESS *Address,
1603 OUT UINT8 *PrefixLength OPTIONAL
1604 );
1605
1606 /**
1607 Convert a Null-terminated Unicode string to IPv4 address and prefix length.
1608
1609 This function outputs a value of type IPv4_ADDRESS and may output a value
1610 of type UINT8 by interpreting the contents of the Unicode string specified
1611 by String. The format of the input Unicode string String is as follows:
1612
1613 D.D.D.D[/P]
1614
1615 D and P are decimal digit characters in the range [0-9]. The running zero in
1616 the beginning of D and P will be ignored. /P is optional.
1617
1618 When /P is not in the String, the function stops at the first character that is
1619 not a valid decimal digit character after four D's are converted.
1620
1621 When /P is in the String, the function stops at the first character that is not
1622 a valid decimal digit character after P is converted.
1623
1624 If String is NULL, then ASSERT().
1625
1626 If Address is NULL, then ASSERT().
1627
1628 If String is not aligned in a 16-bit boundary, then ASSERT().
1629
1630 If PcdMaximumUnicodeStringLength is not zero, and String contains more than
1631 PcdMaximumUnicodeStringLength Unicode characters, not including the
1632 Null-terminator, then ASSERT().
1633
1634 If EndPointer is not NULL and Address is translated from String, a pointer
1635 to the character that stopped the scan is stored at the location pointed to
1636 by EndPointer.
1637
1638 @param String Pointer to a Null-terminated Unicode string.
1639 @param EndPointer Pointer to character that stops scan.
1640 @param Address Pointer to the converted IPv4 address.
1641 @param PrefixLength Pointer to the converted IPv4 address prefix
1642 length. MAX_UINT8 is returned when /P is
1643 not in the String.
1644
1645 @retval RETURN_SUCCESS Address is translated from String.
1646 @retval RETURN_INVALID_PARAMETER If String is NULL.
1647 If Data is NULL.
1648 @retval RETURN_UNSUPPORTED If String is not in the correct format.
1649 If any decimal number converted from D
1650 exceeds 255.
1651 If the decimal number converted from P
1652 exceeds 32.
1653
1654 **/
1655 RETURN_STATUS
1656 EFIAPI
1657 StrToIpv4Address (
1658 IN CONST CHAR16 *String,
1659 OUT CHAR16 **EndPointer, OPTIONAL
1660 OUT IPv4_ADDRESS *Address,
1661 OUT UINT8 *PrefixLength OPTIONAL
1662 );
1663
1664 #define GUID_STRING_LENGTH 36
1665
1666 /**
1667 Convert a Null-terminated Unicode GUID string to a value of type
1668 EFI_GUID.
1669
1670 This function outputs a GUID value by interpreting the contents of
1671 the Unicode string specified by String. The format of the input
1672 Unicode string String consists of 36 characters, as follows:
1673
1674 aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
1675
1676 The pairs aa - pp are two characters in the range [0-9], [a-f] and
1677 [A-F], with each pair representing a single byte hexadecimal value.
1678
1679 The mapping between String and the EFI_GUID structure is as follows:
1680 aa Data1[24:31]
1681 bb Data1[16:23]
1682 cc Data1[8:15]
1683 dd Data1[0:7]
1684 ee Data2[8:15]
1685 ff Data2[0:7]
1686 gg Data3[8:15]
1687 hh Data3[0:7]
1688 ii Data4[0:7]
1689 jj Data4[8:15]
1690 kk Data4[16:23]
1691 ll Data4[24:31]
1692 mm Data4[32:39]
1693 nn Data4[40:47]
1694 oo Data4[48:55]
1695 pp Data4[56:63]
1696
1697 If String is NULL, then ASSERT().
1698 If Guid is NULL, then ASSERT().
1699 If String is not aligned in a 16-bit boundary, then ASSERT().
1700
1701 @param String Pointer to a Null-terminated Unicode string.
1702 @param Guid Pointer to the converted GUID.
1703
1704 @retval RETURN_SUCCESS Guid is translated from String.
1705 @retval RETURN_INVALID_PARAMETER If String is NULL.
1706 If Data is NULL.
1707 @retval RETURN_UNSUPPORTED If String is not as the above format.
1708
1709 **/
1710 RETURN_STATUS
1711 EFIAPI
1712 StrToGuid (
1713 IN CONST CHAR16 *String,
1714 OUT GUID *Guid
1715 );
1716
1717 /**
1718 Convert a Null-terminated Unicode hexadecimal string to a byte array.
1719
1720 This function outputs a byte array by interpreting the contents of
1721 the Unicode string specified by String in hexadecimal format. The format of
1722 the input Unicode string String is:
1723
1724 [XX]*
1725
1726 X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].
1727 The function decodes every two hexadecimal digit characters as one byte. The
1728 decoding stops after Length of characters and outputs Buffer containing
1729 (Length / 2) bytes.
1730
1731 If String is not aligned in a 16-bit boundary, then ASSERT().
1732
1733 If String is NULL, then ASSERT().
1734
1735 If Buffer is NULL, then ASSERT().
1736
1737 If Length is not multiple of 2, then ASSERT().
1738
1739 If PcdMaximumUnicodeStringLength is not zero and Length is greater than
1740 PcdMaximumUnicodeStringLength, then ASSERT().
1741
1742 If MaxBufferSize is less than (Length / 2), then ASSERT().
1743
1744 @param String Pointer to a Null-terminated Unicode string.
1745 @param Length The number of Unicode characters to decode.
1746 @param Buffer Pointer to the converted bytes array.
1747 @param MaxBufferSize The maximum size of Buffer.
1748
1749 @retval RETURN_SUCCESS Buffer is translated from String.
1750 @retval RETURN_INVALID_PARAMETER If String is NULL.
1751 If Data is NULL.
1752 If Length is not multiple of 2.
1753 If PcdMaximumUnicodeStringLength is not zero,
1754 and Length is greater than
1755 PcdMaximumUnicodeStringLength.
1756 @retval RETURN_UNSUPPORTED If Length of characters from String contain
1757 a character that is not valid hexadecimal
1758 digit characters, or a Null-terminator.
1759 @retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2).
1760 **/
1761 RETURN_STATUS
1762 EFIAPI
1763 StrHexToBytes (
1764 IN CONST CHAR16 *String,
1765 IN UINTN Length,
1766 OUT UINT8 *Buffer,
1767 IN UINTN MaxBufferSize
1768 );
1769
1770 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
1771
1772 /**
1773 [ATTENTION] This function is deprecated for security reason.
1774
1775 Convert a Null-terminated Unicode string to a Null-terminated
1776 ASCII string and returns the ASCII string.
1777
1778 This function converts the content of the Unicode string Source
1779 to the ASCII string Destination by copying the lower 8 bits of
1780 each Unicode character. It returns Destination.
1781
1782 The caller is responsible to make sure Destination points to a buffer with size
1783 equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.
1784
1785 If any Unicode characters in Source contain non-zero value in
1786 the upper 8 bits, then ASSERT().
1787
1788 If Destination is NULL, then ASSERT().
1789 If Source is NULL, then ASSERT().
1790 If Source is not aligned on a 16-bit boundary, then ASSERT().
1791 If Source and Destination overlap, then ASSERT().
1792
1793 If PcdMaximumUnicodeStringLength is not zero, and Source contains
1794 more than PcdMaximumUnicodeStringLength Unicode characters not including
1795 the Null-terminator, then ASSERT().
1796
1797 If PcdMaximumAsciiStringLength is not zero, and Source contains more
1798 than PcdMaximumAsciiStringLength Unicode characters not including the
1799 Null-terminator, then ASSERT().
1800
1801 @param Source The pointer to a Null-terminated Unicode string.
1802 @param Destination The pointer to a Null-terminated ASCII string.
1803
1804 @return Destination.
1805
1806 **/
1807 CHAR8 *
1808 EFIAPI
1809 UnicodeStrToAsciiStr (
1810 IN CONST CHAR16 *Source,
1811 OUT CHAR8 *Destination
1812 );
1813
1814 #endif
1815
1816 /**
1817 Convert a Null-terminated Unicode string to a Null-terminated
1818 ASCII string.
1819
1820 This function is similar to AsciiStrCpyS.
1821
1822 This function converts the content of the Unicode string Source
1823 to the ASCII string Destination by copying the lower 8 bits of
1824 each Unicode character. The function terminates the ASCII string
1825 Destination by appending a Null-terminator character at the end.
1826
1827 The caller is responsible to make sure Destination points to a buffer with size
1828 equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.
1829
1830 If any Unicode characters in Source contain non-zero value in
1831 the upper 8 bits, then ASSERT().
1832
1833 If Source is not aligned on a 16-bit boundary, then ASSERT().
1834 If an error would be returned, then the function will also ASSERT().
1835
1836 If an error is returned, then the Destination is unmodified.
1837
1838 @param Source The pointer to a Null-terminated Unicode string.
1839 @param Destination The pointer to a Null-terminated ASCII string.
1840 @param DestMax The maximum number of Destination Ascii
1841 char, including terminating null char.
1842
1843 @retval RETURN_SUCCESS String is converted.
1844 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
1845 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
1846 If Source is NULL.
1847 If PcdMaximumAsciiStringLength is not zero,
1848 and DestMax is greater than
1849 PcdMaximumAsciiStringLength.
1850 If PcdMaximumUnicodeStringLength is not zero,
1851 and DestMax is greater than
1852 PcdMaximumUnicodeStringLength.
1853 If DestMax is 0.
1854 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
1855
1856 **/
1857 RETURN_STATUS
1858 EFIAPI
1859 UnicodeStrToAsciiStrS (
1860 IN CONST CHAR16 *Source,
1861 OUT CHAR8 *Destination,
1862 IN UINTN DestMax
1863 );
1864
1865 /**
1866 Convert not more than Length successive characters from a Null-terminated
1867 Unicode string to a Null-terminated Ascii string. If no null char is copied
1868 from Source, then Destination[Length] is always set to null.
1869
1870 This function converts not more than Length successive characters from the
1871 Unicode string Source to the Ascii string Destination by copying the lower 8
1872 bits of each Unicode character. The function terminates the Ascii string
1873 Destination by appending a Null-terminator character at the end.
1874
1875 The caller is responsible to make sure Destination points to a buffer with size
1876 equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.
1877
1878 If any Unicode characters in Source contain non-zero value in the upper 8
1879 bits, then ASSERT().
1880 If Source is not aligned on a 16-bit boundary, then ASSERT().
1881 If an error would be returned, then the function will also ASSERT().
1882
1883 If an error is returned, then the Destination is unmodified.
1884
1885 @param Source The pointer to a Null-terminated Unicode string.
1886 @param Length The maximum number of Unicode characters to
1887 convert.
1888 @param Destination The pointer to a Null-terminated Ascii string.
1889 @param DestMax The maximum number of Destination Ascii
1890 char, including terminating null char.
1891 @param DestinationLength The number of Unicode characters converted.
1892
1893 @retval RETURN_SUCCESS String is converted.
1894 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
1895 If Source is NULL.
1896 If DestinationLength is NULL.
1897 If PcdMaximumAsciiStringLength is not zero,
1898 and Length or DestMax is greater than
1899 PcdMaximumAsciiStringLength.
1900 If PcdMaximumUnicodeStringLength is not
1901 zero, and Length or DestMax is greater than
1902 PcdMaximumUnicodeStringLength.
1903 If DestMax is 0.
1904 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
1905 MIN(StrLen(Source), Length).
1906 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
1907
1908 **/
1909 RETURN_STATUS
1910 EFIAPI
1911 UnicodeStrnToAsciiStrS (
1912 IN CONST CHAR16 *Source,
1913 IN UINTN Length,
1914 OUT CHAR8 *Destination,
1915 IN UINTN DestMax,
1916 OUT UINTN *DestinationLength
1917 );
1918
1919 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
1920
1921 /**
1922 [ATTENTION] This function is deprecated for security reason.
1923
1924 Copies one Null-terminated ASCII string to another Null-terminated ASCII
1925 string and returns the new ASCII string.
1926
1927 This function copies the contents of the ASCII string Source to the ASCII
1928 string Destination, and returns Destination. If Source and Destination
1929 overlap, then the results are undefined.
1930
1931 If Destination is NULL, then ASSERT().
1932 If Source is NULL, then ASSERT().
1933 If Source and Destination overlap, then ASSERT().
1934 If PcdMaximumAsciiStringLength is not zero and Source contains more than
1935 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1936 then ASSERT().
1937
1938 @param Destination The pointer to a Null-terminated ASCII string.
1939 @param Source The pointer to a Null-terminated ASCII string.
1940
1941 @return Destination
1942
1943 **/
1944 CHAR8 *
1945 EFIAPI
1946 AsciiStrCpy (
1947 OUT CHAR8 *Destination,
1948 IN CONST CHAR8 *Source
1949 );
1950
1951
1952 /**
1953 [ATTENTION] This function is deprecated for security reason.
1954
1955 Copies up to a specified length one Null-terminated ASCII string to another
1956 Null-terminated ASCII string and returns the new ASCII string.
1957
1958 This function copies the contents of the ASCII string Source to the ASCII
1959 string Destination, and returns Destination. At most, Length ASCII characters
1960 are copied from Source to Destination. If Length is 0, then Destination is
1961 returned unmodified. If Length is greater that the number of ASCII characters
1962 in Source, then Destination is padded with Null ASCII characters. If Source
1963 and Destination overlap, then the results are undefined.
1964
1965 If Destination is NULL, then ASSERT().
1966 If Source is NULL, then ASSERT().
1967 If Source and Destination overlap, then ASSERT().
1968 If PcdMaximumAsciiStringLength is not zero, and Length is greater than
1969 PcdMaximumAsciiStringLength, then ASSERT().
1970 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
1971 PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1972 then ASSERT().
1973
1974 @param Destination The pointer to a Null-terminated ASCII string.
1975 @param Source The pointer to a Null-terminated ASCII string.
1976 @param Length The maximum number of ASCII characters to copy.
1977
1978 @return Destination
1979
1980 **/
1981 CHAR8 *
1982 EFIAPI
1983 AsciiStrnCpy (
1984 OUT CHAR8 *Destination,
1985 IN CONST CHAR8 *Source,
1986 IN UINTN Length
1987 );
1988 #endif
1989
1990 /**
1991 Returns the length of a Null-terminated ASCII string.
1992
1993 This function returns the number of ASCII characters in the Null-terminated
1994 ASCII string specified by String.
1995
1996 If Length > 0 and Destination is NULL, then ASSERT().
1997 If Length > 0 and Source is NULL, then ASSERT().
1998 If PcdMaximumAsciiStringLength is not zero and String contains more than
1999 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2000 then ASSERT().
2001
2002 @param String The pointer to a Null-terminated ASCII string.
2003
2004 @return The length of String.
2005
2006 **/
2007 UINTN
2008 EFIAPI
2009 AsciiStrLen (
2010 IN CONST CHAR8 *String
2011 );
2012
2013
2014 /**
2015 Returns the size of a Null-terminated ASCII string in bytes, including the
2016 Null terminator.
2017
2018 This function returns the size, in bytes, of the Null-terminated ASCII string
2019 specified by String.
2020
2021 If String is NULL, then ASSERT().
2022 If PcdMaximumAsciiStringLength is not zero and String contains more than
2023 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2024 then ASSERT().
2025
2026 @param String The pointer to a Null-terminated ASCII string.
2027
2028 @return The size of String.
2029
2030 **/
2031 UINTN
2032 EFIAPI
2033 AsciiStrSize (
2034 IN CONST CHAR8 *String
2035 );
2036
2037
2038 /**
2039 Compares two Null-terminated ASCII strings, and returns the difference
2040 between the first mismatched ASCII characters.
2041
2042 This function compares the Null-terminated ASCII string FirstString to the
2043 Null-terminated ASCII string SecondString. If FirstString is identical to
2044 SecondString, then 0 is returned. Otherwise, the value returned is the first
2045 mismatched ASCII character in SecondString subtracted from the first
2046 mismatched ASCII character in FirstString.
2047
2048 If FirstString is NULL, then ASSERT().
2049 If SecondString is NULL, then ASSERT().
2050 If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
2051 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2052 then ASSERT().
2053 If PcdMaximumAsciiStringLength is not zero and SecondString contains more
2054 than PcdMaximumAsciiStringLength ASCII characters not including the
2055 Null-terminator, then ASSERT().
2056
2057 @param FirstString The pointer to a Null-terminated ASCII string.
2058 @param SecondString The pointer to a Null-terminated ASCII string.
2059
2060 @retval ==0 FirstString is identical to SecondString.
2061 @retval !=0 FirstString is not identical to SecondString.
2062
2063 **/
2064 INTN
2065 EFIAPI
2066 AsciiStrCmp (
2067 IN CONST CHAR8 *FirstString,
2068 IN CONST CHAR8 *SecondString
2069 );
2070
2071
2072 /**
2073 Performs a case insensitive comparison of two Null-terminated ASCII strings,
2074 and returns the difference between the first mismatched ASCII characters.
2075
2076 This function performs a case insensitive comparison of the Null-terminated
2077 ASCII string FirstString to the Null-terminated ASCII string SecondString. If
2078 FirstString is identical to SecondString, then 0 is returned. Otherwise, the
2079 value returned is the first mismatched lower case ASCII character in
2080 SecondString subtracted from the first mismatched lower case ASCII character
2081 in FirstString.
2082
2083 If FirstString is NULL, then ASSERT().
2084 If SecondString is NULL, then ASSERT().
2085 If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
2086 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2087 then ASSERT().
2088 If PcdMaximumAsciiStringLength is not zero and SecondString contains more
2089 than PcdMaximumAsciiStringLength ASCII characters not including the
2090 Null-terminator, then ASSERT().
2091
2092 @param FirstString The pointer to a Null-terminated ASCII string.
2093 @param SecondString The pointer to a Null-terminated ASCII string.
2094
2095 @retval ==0 FirstString is identical to SecondString using case insensitive
2096 comparisons.
2097 @retval !=0 FirstString is not identical to SecondString using case
2098 insensitive comparisons.
2099
2100 **/
2101 INTN
2102 EFIAPI
2103 AsciiStriCmp (
2104 IN CONST CHAR8 *FirstString,
2105 IN CONST CHAR8 *SecondString
2106 );
2107
2108
2109 /**
2110 Compares two Null-terminated ASCII strings with maximum lengths, and returns
2111 the difference between the first mismatched ASCII characters.
2112
2113 This function compares the Null-terminated ASCII string FirstString to the
2114 Null-terminated ASCII string SecondString. At most, Length ASCII characters
2115 will be compared. If Length is 0, then 0 is returned. If FirstString is
2116 identical to SecondString, then 0 is returned. Otherwise, the value returned
2117 is the first mismatched ASCII character in SecondString subtracted from the
2118 first mismatched ASCII character in FirstString.
2119
2120 If Length > 0 and FirstString is NULL, then ASSERT().
2121 If Length > 0 and SecondString is NULL, then ASSERT().
2122 If PcdMaximumAsciiStringLength is not zero, and Length is greater than
2123 PcdMaximumAsciiStringLength, then ASSERT().
2124 If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than
2125 PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
2126 then ASSERT().
2127 If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than
2128 PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
2129 then ASSERT().
2130
2131 @param FirstString The pointer to a Null-terminated ASCII string.
2132 @param SecondString The pointer to a Null-terminated ASCII string.
2133 @param Length The maximum number of ASCII characters for compare.
2134
2135 @retval ==0 FirstString is identical to SecondString.
2136 @retval !=0 FirstString is not identical to SecondString.
2137
2138 **/
2139 INTN
2140 EFIAPI
2141 AsciiStrnCmp (
2142 IN CONST CHAR8 *FirstString,
2143 IN CONST CHAR8 *SecondString,
2144 IN UINTN Length
2145 );
2146
2147
2148 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
2149
2150 /**
2151 [ATTENTION] This function is deprecated for security reason.
2152
2153 Concatenates one Null-terminated ASCII string to another Null-terminated
2154 ASCII string, and returns the concatenated ASCII string.
2155
2156 This function concatenates two Null-terminated ASCII strings. The contents of
2157 Null-terminated ASCII string Source are concatenated to the end of Null-
2158 terminated ASCII string Destination. The Null-terminated concatenated ASCII
2159 String is returned.
2160
2161 If Destination is NULL, then ASSERT().
2162 If Source is NULL, then ASSERT().
2163 If PcdMaximumAsciiStringLength is not zero and Destination contains more than
2164 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2165 then ASSERT().
2166 If PcdMaximumAsciiStringLength is not zero and Source contains more than
2167 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2168 then ASSERT().
2169 If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
2170 Source results in a ASCII string with more than PcdMaximumAsciiStringLength
2171 ASCII characters, then ASSERT().
2172
2173 @param Destination The pointer to a Null-terminated ASCII string.
2174 @param Source The pointer to a Null-terminated ASCII string.
2175
2176 @return Destination
2177
2178 **/
2179 CHAR8 *
2180 EFIAPI
2181 AsciiStrCat (
2182 IN OUT CHAR8 *Destination,
2183 IN CONST CHAR8 *Source
2184 );
2185
2186
2187 /**
2188 [ATTENTION] This function is deprecated for security reason.
2189
2190 Concatenates up to a specified length one Null-terminated ASCII string to
2191 the end of another Null-terminated ASCII string, and returns the
2192 concatenated ASCII string.
2193
2194 This function concatenates two Null-terminated ASCII strings. The contents
2195 of Null-terminated ASCII string Source are concatenated to the end of Null-
2196 terminated ASCII string Destination, and Destination is returned. At most,
2197 Length ASCII characters are concatenated from Source to the end of
2198 Destination, and Destination is always Null-terminated. If Length is 0, then
2199 Destination is returned unmodified. If Source and Destination overlap, then
2200 the results are undefined.
2201
2202 If Length > 0 and Destination is NULL, then ASSERT().
2203 If Length > 0 and Source is NULL, then ASSERT().
2204 If Source and Destination overlap, then ASSERT().
2205 If PcdMaximumAsciiStringLength is not zero, and Length is greater than
2206 PcdMaximumAsciiStringLength, then ASSERT().
2207 If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
2208 PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
2209 then ASSERT().
2210 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
2211 PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
2212 then ASSERT().
2213 If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
2214 Source results in a ASCII string with more than PcdMaximumAsciiStringLength
2215 ASCII characters, not including the Null-terminator, then ASSERT().
2216
2217 @param Destination The pointer to a Null-terminated ASCII string.
2218 @param Source The pointer to a Null-terminated ASCII string.
2219 @param Length The maximum number of ASCII characters to concatenate from
2220 Source.
2221
2222 @return Destination
2223
2224 **/
2225 CHAR8 *
2226 EFIAPI
2227 AsciiStrnCat (
2228 IN OUT CHAR8 *Destination,
2229 IN CONST CHAR8 *Source,
2230 IN UINTN Length
2231 );
2232 #endif
2233
2234 /**
2235 Returns the first occurrence of a Null-terminated ASCII sub-string
2236 in a Null-terminated ASCII string.
2237
2238 This function scans the contents of the ASCII string specified by String
2239 and returns the first occurrence of SearchString. If SearchString is not
2240 found in String, then NULL is returned. If the length of SearchString is zero,
2241 then String is returned.
2242
2243 If String is NULL, then ASSERT().
2244 If SearchString is NULL, then ASSERT().
2245
2246 If PcdMaximumAsciiStringLength is not zero, and SearchString or
2247 String contains more than PcdMaximumAsciiStringLength Unicode characters
2248 not including the Null-terminator, then ASSERT().
2249
2250 @param String The pointer to a Null-terminated ASCII string.
2251 @param SearchString The pointer to a Null-terminated ASCII string to search for.
2252
2253 @retval NULL If the SearchString does not appear in String.
2254 @retval others If there is a match return the first occurrence of SearchingString.
2255 If the length of SearchString is zero,return String.
2256
2257 **/
2258 CHAR8 *
2259 EFIAPI
2260 AsciiStrStr (
2261 IN CONST CHAR8 *String,
2262 IN CONST CHAR8 *SearchString
2263 );
2264
2265
2266 /**
2267 Convert a Null-terminated ASCII decimal string to a value of type
2268 UINTN.
2269
2270 This function returns a value of type UINTN by interpreting the contents
2271 of the ASCII string String as a decimal number. The format of the input
2272 ASCII string String is:
2273
2274 [spaces] [decimal digits].
2275
2276 The valid decimal digit character is in the range [0-9]. The function will
2277 ignore the pad space, which includes spaces or tab characters, before the digits.
2278 The running zero in the beginning of [decimal digits] will be ignored. Then, the
2279 function stops at the first character that is a not a valid decimal character or
2280 Null-terminator, whichever on comes first.
2281
2282 If String has only pad spaces, then 0 is returned.
2283 If String has no pad spaces or valid decimal digits, then 0 is returned.
2284 If the number represented by String overflows according to the range defined by
2285 UINTN, then MAX_UINTN is returned.
2286 If String is NULL, then ASSERT().
2287 If PcdMaximumAsciiStringLength is not zero, and String contains more than
2288 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2289 then ASSERT().
2290
2291 @param String The pointer to a Null-terminated ASCII string.
2292
2293 @retval The value translated from String.
2294
2295 **/
2296 UINTN
2297 EFIAPI
2298 AsciiStrDecimalToUintn (
2299 IN CONST CHAR8 *String
2300 );
2301
2302
2303 /**
2304 Convert a Null-terminated ASCII decimal string to a value of type
2305 UINT64.
2306
2307 This function returns a value of type UINT64 by interpreting the contents
2308 of the ASCII string String as a decimal number. The format of the input
2309 ASCII string String is:
2310
2311 [spaces] [decimal digits].
2312
2313 The valid decimal digit character is in the range [0-9]. The function will
2314 ignore the pad space, which includes spaces or tab characters, before the digits.
2315 The running zero in the beginning of [decimal digits] will be ignored. Then, the
2316 function stops at the first character that is a not a valid decimal character or
2317 Null-terminator, whichever on comes first.
2318
2319 If String has only pad spaces, then 0 is returned.
2320 If String has no pad spaces or valid decimal digits, then 0 is returned.
2321 If the number represented by String overflows according to the range defined by
2322 UINT64, then MAX_UINT64 is returned.
2323 If String is NULL, then ASSERT().
2324 If PcdMaximumAsciiStringLength is not zero, and String contains more than
2325 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2326 then ASSERT().
2327
2328 @param String The pointer to a Null-terminated ASCII string.
2329
2330 @retval Value translated from String.
2331
2332 **/
2333 UINT64
2334 EFIAPI
2335 AsciiStrDecimalToUint64 (
2336 IN CONST CHAR8 *String
2337 );
2338
2339
2340 /**
2341 Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
2342
2343 This function returns a value of type UINTN by interpreting the contents of
2344 the ASCII string String as a hexadecimal number. The format of the input ASCII
2345 string String is:
2346
2347 [spaces][zeros][x][hexadecimal digits].
2348
2349 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
2350 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
2351 appears in the input string, it must be prefixed with at least one 0. The function
2352 will ignore the pad space, which includes spaces or tab characters, before [zeros],
2353 [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
2354 will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
2355 digit. Then, the function stops at the first character that is a not a valid
2356 hexadecimal character or Null-terminator, whichever on comes first.
2357
2358 If String has only pad spaces, then 0 is returned.
2359 If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
2360 0 is returned.
2361
2362 If the number represented by String overflows according to the range defined by UINTN,
2363 then MAX_UINTN is returned.
2364 If String is NULL, then ASSERT().
2365 If PcdMaximumAsciiStringLength is not zero,
2366 and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
2367 the Null-terminator, then ASSERT().
2368
2369 @param String The pointer to a Null-terminated ASCII string.
2370
2371 @retval Value translated from String.
2372
2373 **/
2374 UINTN
2375 EFIAPI
2376 AsciiStrHexToUintn (
2377 IN CONST CHAR8 *String
2378 );
2379
2380
2381 /**
2382 Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
2383
2384 This function returns a value of type UINT64 by interpreting the contents of
2385 the ASCII string String as a hexadecimal number. The format of the input ASCII
2386 string String is:
2387
2388 [spaces][zeros][x][hexadecimal digits].
2389
2390 The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
2391 The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
2392 appears in the input string, it must be prefixed with at least one 0. The function
2393 will ignore the pad space, which includes spaces or tab characters, before [zeros],
2394 [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
2395 will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
2396 digit. Then, the function stops at the first character that is a not a valid
2397 hexadecimal character or Null-terminator, whichever on comes first.
2398
2399 If String has only pad spaces, then 0 is returned.
2400 If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
2401 0 is returned.
2402
2403 If the number represented by String overflows according to the range defined by UINT64,
2404 then MAX_UINT64 is returned.
2405 If String is NULL, then ASSERT().
2406 If PcdMaximumAsciiStringLength is not zero,
2407 and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
2408 the Null-terminator, then ASSERT().
2409
2410 @param String The pointer to a Null-terminated ASCII string.
2411
2412 @retval Value translated from String.
2413
2414 **/
2415 UINT64
2416 EFIAPI
2417 AsciiStrHexToUint64 (
2418 IN CONST CHAR8 *String
2419 );
2420
2421 /**
2422 Convert a Null-terminated ASCII string to IPv6 address and prefix length.
2423
2424 This function outputs a value of type IPv6_ADDRESS and may output a value
2425 of type UINT8 by interpreting the contents of the ASCII string specified
2426 by String. The format of the input ASCII string String is as follows:
2427
2428 X:X:X:X:X:X:X:X[/P]
2429
2430 X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and
2431 [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low
2432 memory address and high byte is stored in high memory address. P contains decimal
2433 digit characters in the range [0-9]. The running zero in the beginning of P will
2434 be ignored. /P is optional.
2435
2436 When /P is not in the String, the function stops at the first character that is
2437 not a valid hexadecimal digit character after eight X's are converted.
2438
2439 When /P is in the String, the function stops at the first character that is not
2440 a valid decimal digit character after P is converted.
2441
2442 "::" can be used to compress one or more groups of X when X contains only 0.
2443 The "::" can only appear once in the String.
2444
2445 If String is NULL, then ASSERT().
2446
2447 If Address is NULL, then ASSERT().
2448
2449 If EndPointer is not NULL and Address is translated from String, a pointer
2450 to the character that stopped the scan is stored at the location pointed to
2451 by EndPointer.
2452
2453 @param String Pointer to a Null-terminated ASCII string.
2454 @param EndPointer Pointer to character that stops scan.
2455 @param Address Pointer to the converted IPv6 address.
2456 @param PrefixLength Pointer to the converted IPv6 address prefix
2457 length. MAX_UINT8 is returned when /P is
2458 not in the String.
2459
2460 @retval RETURN_SUCCESS Address is translated from String.
2461 @retval RETURN_INVALID_PARAMETER If String is NULL.
2462 If Data is NULL.
2463 @retval RETURN_UNSUPPORTED If X contains more than four hexadecimal
2464 digit characters.
2465 If String contains "::" and number of X
2466 is not less than 8.
2467 If P starts with character that is not a
2468 valid decimal digit character.
2469 If the decimal number converted from P
2470 exceeds 128.
2471
2472 **/
2473 RETURN_STATUS
2474 EFIAPI
2475 AsciiStrToIpv6Address (
2476 IN CONST CHAR8 *String,
2477 OUT CHAR8 **EndPointer, OPTIONAL
2478 OUT IPv6_ADDRESS *Address,
2479 OUT UINT8 *PrefixLength OPTIONAL
2480 );
2481
2482 /**
2483 Convert a Null-terminated ASCII string to IPv4 address and prefix length.
2484
2485 This function outputs a value of type IPv4_ADDRESS and may output a value
2486 of type UINT8 by interpreting the contents of the ASCII string specified
2487 by String. The format of the input ASCII string String is as follows:
2488
2489 D.D.D.D[/P]
2490
2491 D and P are decimal digit characters in the range [0-9]. The running zero in
2492 the beginning of D and P will be ignored. /P is optional.
2493
2494 When /P is not in the String, the function stops at the first character that is
2495 not a valid decimal digit character after four D's are converted.
2496
2497 When /P is in the String, the function stops at the first character that is not
2498 a valid decimal digit character after P is converted.
2499
2500 If String is NULL, then ASSERT().
2501
2502 If Address is NULL, then ASSERT().
2503
2504 If EndPointer is not NULL and Address is translated from String, a pointer
2505 to the character that stopped the scan is stored at the location pointed to
2506 by EndPointer.
2507
2508 @param String Pointer to a Null-terminated ASCII string.
2509 @param EndPointer Pointer to character that stops scan.
2510 @param Address Pointer to the converted IPv4 address.
2511 @param PrefixLength Pointer to the converted IPv4 address prefix
2512 length. MAX_UINT8 is returned when /P is
2513 not in the String.
2514
2515 @retval RETURN_SUCCESS Address is translated from String.
2516 @retval RETURN_INVALID_PARAMETER If String is NULL.
2517 If Data is NULL.
2518 @retval RETURN_UNSUPPORTED If String is not in the correct format.
2519 If any decimal number converted from D
2520 exceeds 255.
2521 If the decimal number converted from P
2522 exceeds 32.
2523
2524 **/
2525 RETURN_STATUS
2526 EFIAPI
2527 AsciiStrToIpv4Address (
2528 IN CONST CHAR8 *String,
2529 OUT CHAR8 **EndPointer, OPTIONAL
2530 OUT IPv4_ADDRESS *Address,
2531 OUT UINT8 *PrefixLength OPTIONAL
2532 );
2533
2534 /**
2535 Convert a Null-terminated ASCII GUID string to a value of type
2536 EFI_GUID.
2537
2538 This function outputs a GUID value by interpreting the contents of
2539 the ASCII string specified by String. The format of the input
2540 ASCII string String consists of 36 characters, as follows:
2541
2542 aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
2543
2544 The pairs aa - pp are two characters in the range [0-9], [a-f] and
2545 [A-F], with each pair representing a single byte hexadecimal value.
2546
2547 The mapping between String and the EFI_GUID structure is as follows:
2548 aa Data1[24:31]
2549 bb Data1[16:23]
2550 cc Data1[8:15]
2551 dd Data1[0:7]
2552 ee Data2[8:15]
2553 ff Data2[0:7]
2554 gg Data3[8:15]
2555 hh Data3[0:7]
2556 ii Data4[0:7]
2557 jj Data4[8:15]
2558 kk Data4[16:23]
2559 ll Data4[24:31]
2560 mm Data4[32:39]
2561 nn Data4[40:47]
2562 oo Data4[48:55]
2563 pp Data4[56:63]
2564
2565 If String is NULL, then ASSERT().
2566 If Guid is NULL, then ASSERT().
2567
2568 @param String Pointer to a Null-terminated ASCII string.
2569 @param Guid Pointer to the converted GUID.
2570
2571 @retval RETURN_SUCCESS Guid is translated from String.
2572 @retval RETURN_INVALID_PARAMETER If String is NULL.
2573 If Data is NULL.
2574 @retval RETURN_UNSUPPORTED If String is not as the above format.
2575
2576 **/
2577 RETURN_STATUS
2578 EFIAPI
2579 AsciiStrToGuid (
2580 IN CONST CHAR8 *String,
2581 OUT GUID *Guid
2582 );
2583
2584 /**
2585 Convert a Null-terminated ASCII hexadecimal string to a byte array.
2586
2587 This function outputs a byte array by interpreting the contents of
2588 the ASCII string specified by String in hexadecimal format. The format of
2589 the input ASCII string String is:
2590
2591 [XX]*
2592
2593 X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].
2594 The function decodes every two hexadecimal digit characters as one byte. The
2595 decoding stops after Length of characters and outputs Buffer containing
2596 (Length / 2) bytes.
2597
2598 If String is NULL, then ASSERT().
2599
2600 If Buffer is NULL, then ASSERT().
2601
2602 If Length is not multiple of 2, then ASSERT().
2603
2604 If PcdMaximumAsciiStringLength is not zero and Length is greater than
2605 PcdMaximumAsciiStringLength, then ASSERT().
2606
2607 If MaxBufferSize is less than (Length / 2), then ASSERT().
2608
2609 @param String Pointer to a Null-terminated ASCII string.
2610 @param Length The number of ASCII characters to decode.
2611 @param Buffer Pointer to the converted bytes array.
2612 @param MaxBufferSize The maximum size of Buffer.
2613
2614 @retval RETURN_SUCCESS Buffer is translated from String.
2615 @retval RETURN_INVALID_PARAMETER If String is NULL.
2616 If Data is NULL.
2617 If Length is not multiple of 2.
2618 If PcdMaximumAsciiStringLength is not zero,
2619 and Length is greater than
2620 PcdMaximumAsciiStringLength.
2621 @retval RETURN_UNSUPPORTED If Length of characters from String contain
2622 a character that is not valid hexadecimal
2623 digit characters, or a Null-terminator.
2624 @retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2).
2625 **/
2626 RETURN_STATUS
2627 EFIAPI
2628 AsciiStrHexToBytes (
2629 IN CONST CHAR8 *String,
2630 IN UINTN Length,
2631 OUT UINT8 *Buffer,
2632 IN UINTN MaxBufferSize
2633 );
2634
2635 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
2636
2637 /**
2638 [ATTENTION] This function is deprecated for security reason.
2639
2640 Convert one Null-terminated ASCII string to a Null-terminated
2641 Unicode string and returns the Unicode string.
2642
2643 This function converts the contents of the ASCII string Source to the Unicode
2644 string Destination, and returns Destination. The function terminates the
2645 Unicode string Destination by appending a Null-terminator character at the end.
2646 The caller is responsible to make sure Destination points to a buffer with size
2647 equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
2648
2649 If Destination is NULL, then ASSERT().
2650 If Destination is not aligned on a 16-bit boundary, then ASSERT().
2651 If Source is NULL, then ASSERT().
2652 If Source and Destination overlap, then ASSERT().
2653 If PcdMaximumAsciiStringLength is not zero, and Source contains more than
2654 PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
2655 then ASSERT().
2656 If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
2657 PcdMaximumUnicodeStringLength ASCII characters not including the
2658 Null-terminator, then ASSERT().
2659
2660 @param Source The pointer to a Null-terminated ASCII string.
2661 @param Destination The pointer to a Null-terminated Unicode string.
2662
2663 @return Destination.
2664
2665 **/
2666 CHAR16 *
2667 EFIAPI
2668 AsciiStrToUnicodeStr (
2669 IN CONST CHAR8 *Source,
2670 OUT CHAR16 *Destination
2671 );
2672
2673 #endif
2674
2675 /**
2676 Convert one Null-terminated ASCII string to a Null-terminated
2677 Unicode string.
2678
2679 This function is similar to StrCpyS.
2680
2681 This function converts the contents of the ASCII string Source to the Unicode
2682 string Destination. The function terminates the Unicode string Destination by
2683 appending a Null-terminator character at the end.
2684
2685 The caller is responsible to make sure Destination points to a buffer with size
2686 equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
2687
2688 If Destination is not aligned on a 16-bit boundary, then ASSERT().
2689 If an error would be returned, then the function will also ASSERT().
2690
2691 If an error is returned, then the Destination is unmodified.
2692
2693 @param Source The pointer to a Null-terminated ASCII string.
2694 @param Destination The pointer to a Null-terminated Unicode string.
2695 @param DestMax The maximum number of Destination Unicode
2696 char, including terminating null char.
2697
2698 @retval RETURN_SUCCESS String is converted.
2699 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
2700 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
2701 If Source is NULL.
2702 If PcdMaximumUnicodeStringLength is not zero,
2703 and DestMax is greater than
2704 PcdMaximumUnicodeStringLength.
2705 If PcdMaximumAsciiStringLength is not zero,
2706 and DestMax is greater than
2707 PcdMaximumAsciiStringLength.
2708 If DestMax is 0.
2709 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
2710
2711 **/
2712 RETURN_STATUS
2713 EFIAPI
2714 AsciiStrToUnicodeStrS (
2715 IN CONST CHAR8 *Source,
2716 OUT CHAR16 *Destination,
2717 IN UINTN DestMax
2718 );
2719
2720 /**
2721 Convert not more than Length successive characters from a Null-terminated
2722 Ascii string to a Null-terminated Unicode string. If no null char is copied
2723 from Source, then Destination[Length] is always set to null.
2724
2725 This function converts not more than Length successive characters from the
2726 Ascii string Source to the Unicode string Destination. The function
2727 terminates the Unicode string Destination by appending a Null-terminator
2728 character at the end.
2729
2730 The caller is responsible to make sure Destination points to a buffer with
2731 size not smaller than
2732 ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof (CHAR8)) in bytes.
2733
2734 If Destination is not aligned on a 16-bit boundary, then ASSERT().
2735 If an error would be returned, then the function will also ASSERT().
2736
2737 If an error is returned, then Destination and DestinationLength are
2738 unmodified.
2739
2740 @param Source The pointer to a Null-terminated Ascii string.
2741 @param Length The maximum number of Ascii characters to convert.
2742 @param Destination The pointer to a Null-terminated Unicode string.
2743 @param DestMax The maximum number of Destination Unicode char,
2744 including terminating null char.
2745 @param DestinationLength The number of Ascii characters converted.
2746
2747 @retval RETURN_SUCCESS String is converted.
2748 @retval RETURN_INVALID_PARAMETER If Destination is NULL.
2749 If Source is NULL.
2750 If DestinationLength is NULL.
2751 If PcdMaximumUnicodeStringLength is not
2752 zero, and Length or DestMax is greater than
2753 PcdMaximumUnicodeStringLength.
2754 If PcdMaximumAsciiStringLength is not zero,
2755 and Length or DestMax is greater than
2756 PcdMaximumAsciiStringLength.
2757 If DestMax is 0.
2758 @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
2759 MIN(AsciiStrLen(Source), Length).
2760 @retval RETURN_ACCESS_DENIED If Source and Destination overlap.
2761
2762 **/
2763 RETURN_STATUS
2764 EFIAPI
2765 AsciiStrnToUnicodeStrS (
2766 IN CONST CHAR8 *Source,
2767 IN UINTN Length,
2768 OUT CHAR16 *Destination,
2769 IN UINTN DestMax,
2770 OUT UINTN *DestinationLength
2771 );
2772
2773 /**
2774 Converts an 8-bit value to an 8-bit BCD value.
2775
2776 Converts the 8-bit value specified by Value to BCD. The BCD value is
2777 returned.
2778
2779 If Value >= 100, then ASSERT().
2780
2781 @param Value The 8-bit value to convert to BCD. Range 0..99.
2782
2783 @return The BCD value.
2784
2785 **/
2786 UINT8
2787 EFIAPI
2788 DecimalToBcd8 (
2789 IN UINT8 Value
2790 );
2791
2792
2793 /**
2794 Converts an 8-bit BCD value to an 8-bit value.
2795
2796 Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
2797 value is returned.
2798
2799 If Value >= 0xA0, then ASSERT().
2800 If (Value & 0x0F) >= 0x0A, then ASSERT().
2801
2802 @param Value The 8-bit BCD value to convert to an 8-bit value.
2803
2804 @return The 8-bit value is returned.
2805
2806 **/
2807 UINT8
2808 EFIAPI
2809 BcdToDecimal8 (
2810 IN UINT8 Value
2811 );
2812
2813 //
2814 // File Path Manipulation Functions
2815 //
2816
2817 /**
2818 Removes the last directory or file entry in a path.
2819
2820 @param[in, out] Path The pointer to the path to modify.
2821
2822 @retval FALSE Nothing was found to remove.
2823 @retval TRUE A directory or file was removed.
2824 **/
2825 BOOLEAN
2826 EFIAPI
2827 PathRemoveLastItem(
2828 IN OUT CHAR16 *Path
2829 );
2830
2831 /**
2832 Function to clean up paths.
2833 - Single periods in the path are removed.
2834 - Double periods in the path are removed along with a single parent directory.
2835 - Forward slashes L'/' are converted to backward slashes L'\'.
2836
2837 This will be done inline and the existing buffer may be larger than required
2838 upon completion.
2839
2840 @param[in] Path The pointer to the string containing the path.
2841
2842 @return Returns Path, otherwise returns NULL to indicate that an error has occurred.
2843 **/
2844 CHAR16*
2845 EFIAPI
2846 PathCleanUpDirectories(
2847 IN CHAR16 *Path
2848 );
2849
2850 //
2851 // Linked List Functions and Macros
2852 //
2853
2854 /**
2855 Initializes the head node of a doubly linked list that is declared as a
2856 global variable in a module.
2857
2858 Initializes the forward and backward links of a new linked list. After
2859 initializing a linked list with this macro, the other linked list functions
2860 may be used to add and remove nodes from the linked list. This macro results
2861 in smaller executables by initializing the linked list in the data section,
2862 instead if calling the InitializeListHead() function to perform the
2863 equivalent operation.
2864
2865 @param ListHead The head note of a list to initialize.
2866
2867 **/
2868 #define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&(ListHead), &(ListHead)}
2869
2870
2871 /**
2872 Initializes the head node of a doubly linked list, and returns the pointer to
2873 the head node of the doubly linked list.
2874
2875 Initializes the forward and backward links of a new linked list. After
2876 initializing a linked list with this function, the other linked list
2877 functions may be used to add and remove nodes from the linked list. It is up
2878 to the caller of this function to allocate the memory for ListHead.
2879
2880 If ListHead is NULL, then ASSERT().
2881
2882 @param ListHead A pointer to the head node of a new doubly linked list.
2883
2884 @return ListHead
2885
2886 **/
2887 LIST_ENTRY *
2888 EFIAPI
2889 InitializeListHead (
2890 IN OUT LIST_ENTRY *ListHead
2891 );
2892
2893
2894 /**
2895 Adds a node to the beginning of a doubly linked list, and returns the pointer
2896 to the head node of the doubly linked list.
2897
2898 Adds the node Entry at the beginning of the doubly linked list denoted by
2899 ListHead, and returns ListHead.
2900
2901 If ListHead is NULL, then ASSERT().
2902 If Entry is NULL, then ASSERT().
2903 If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
2904 InitializeListHead(), then ASSERT().
2905 If PcdMaximumLinkedListLength is not zero, and prior to insertion the number
2906 of nodes in ListHead, including the ListHead node, is greater than or
2907 equal to PcdMaximumLinkedListLength, then ASSERT().
2908
2909 @param ListHead A pointer to the head node of a doubly linked list.
2910 @param Entry A pointer to a node that is to be inserted at the beginning
2911 of a doubly linked list.
2912
2913 @return ListHead
2914
2915 **/
2916 LIST_ENTRY *
2917 EFIAPI
2918 InsertHeadList (
2919 IN OUT LIST_ENTRY *ListHead,
2920 IN OUT LIST_ENTRY *Entry
2921 );
2922
2923
2924 /**
2925 Adds a node to the end of a doubly linked list, and returns the pointer to
2926 the head node of the doubly linked list.
2927
2928 Adds the node Entry to the end of the doubly linked list denoted by ListHead,
2929 and returns ListHead.
2930
2931 If ListHead is NULL, then ASSERT().
2932 If Entry is NULL, then ASSERT().
2933 If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
2934 InitializeListHead(), then ASSERT().
2935 If PcdMaximumLinkedListLength is not zero, and prior to insertion the number
2936 of nodes in ListHead, including the ListHead node, is greater than or
2937 equal to PcdMaximumLinkedListLength, then ASSERT().
2938
2939 @param ListHead A pointer to the head node of a doubly linked list.
2940 @param Entry A pointer to a node that is to be added at the end of the
2941 doubly linked list.
2942
2943 @return ListHead
2944
2945 **/
2946 LIST_ENTRY *
2947 EFIAPI
2948 InsertTailList (
2949 IN OUT LIST_ENTRY *ListHead,
2950 IN OUT LIST_ENTRY *Entry
2951 );
2952
2953
2954 /**
2955 Retrieves the first node of a doubly linked list.
2956
2957 Returns the first node of a doubly linked list. List must have been
2958 initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
2959 If List is empty, then List is returned.
2960
2961 If List is NULL, then ASSERT().
2962 If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
2963 InitializeListHead(), then ASSERT().
2964 If PcdMaximumLinkedListLength is not zero, and the number of nodes
2965 in List, including the List node, is greater than or equal to
2966 PcdMaximumLinkedListLength, then ASSERT().
2967
2968 @param List A pointer to the head node of a doubly linked list.
2969
2970 @return The first node of a doubly linked list.
2971 @retval List The list is empty.
2972
2973 **/
2974 LIST_ENTRY *
2975 EFIAPI
2976 GetFirstNode (
2977 IN CONST LIST_ENTRY *List
2978 );
2979
2980
2981 /**
2982 Retrieves the next node of a doubly linked list.
2983
2984 Returns the node of a doubly linked list that follows Node.
2985 List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()
2986 or InitializeListHead(). If List is empty, then List is returned.
2987
2988 If List is NULL, then ASSERT().
2989 If Node is NULL, then ASSERT().
2990 If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
2991 InitializeListHead(), then ASSERT().
2992 If PcdMaximumLinkedListLength is not zero, and List contains more than
2993 PcdMaximumLinkedListLength nodes, then ASSERT().
2994 If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
2995
2996 @param List A pointer to the head node of a doubly linked list.
2997 @param Node A pointer to a node in the doubly linked list.
2998
2999 @return The pointer to the next node if one exists. Otherwise List is returned.
3000
3001 **/
3002 LIST_ENTRY *
3003 EFIAPI
3004 GetNextNode (
3005 IN CONST LIST_ENTRY *List,
3006 IN CONST LIST_ENTRY *Node
3007 );
3008
3009
3010 /**
3011 Retrieves the previous node of a doubly linked list.
3012
3013 Returns the node of a doubly linked list that precedes Node.
3014 List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()
3015 or InitializeListHead(). If List is empty, then List is returned.
3016
3017 If List is NULL, then ASSERT().
3018 If Node is NULL, then ASSERT().
3019 If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
3020 InitializeListHead(), then ASSERT().
3021 If PcdMaximumLinkedListLength is not zero, and List contains more than
3022 PcdMaximumLinkedListLength nodes, then ASSERT().
3023 If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
3024
3025 @param List A pointer to the head node of a doubly linked list.
3026 @param Node A pointer to a node in the doubly linked list.
3027
3028 @return The pointer to the previous node if one exists. Otherwise List is returned.
3029
3030 **/
3031 LIST_ENTRY *
3032 EFIAPI
3033 GetPreviousNode (
3034 IN CONST LIST_ENTRY *List,
3035 IN CONST LIST_ENTRY *Node
3036 );
3037
3038
3039 /**
3040 Checks to see if a doubly linked list is empty or not.
3041
3042 Checks to see if the doubly linked list is empty. If the linked list contains
3043 zero nodes, this function returns TRUE. Otherwise, it returns FALSE.
3044
3045 If ListHead is NULL, then ASSERT().
3046 If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
3047 InitializeListHead(), then ASSERT().
3048 If PcdMaximumLinkedListLength is not zero, and the number of nodes
3049 in List, including the List node, is greater than or equal to
3050 PcdMaximumLinkedListLength, then ASSERT().
3051
3052 @param ListHead A pointer to the head node of a doubly linked list.
3053
3054 @retval TRUE The linked list is empty.
3055 @retval FALSE The linked list is not empty.
3056
3057 **/
3058 BOOLEAN
3059 EFIAPI
3060 IsListEmpty (
3061 IN CONST LIST_ENTRY *ListHead
3062 );
3063
3064
3065 /**
3066 Determines if a node in a doubly linked list is the head node of a the same
3067 doubly linked list. This function is typically used to terminate a loop that
3068 traverses all the nodes in a doubly linked list starting with the head node.
3069
3070 Returns TRUE if Node is equal to List. Returns FALSE if Node is one of the
3071 nodes in the doubly linked list specified by List. List must have been
3072 initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
3073
3074 If List is NULL, then ASSERT().
3075 If Node is NULL, then ASSERT().
3076 If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(),
3077 then ASSERT().
3078 If PcdMaximumLinkedListLength is not zero, and the number of nodes
3079 in List, including the List node, is greater than or equal to
3080 PcdMaximumLinkedListLength, then ASSERT().
3081 If PcdVerifyNodeInList is TRUE and Node is not a node in List the and Node is not equal
3082 to List, then ASSERT().
3083
3084 @param List A pointer to the head node of a doubly linked list.
3085 @param Node A pointer to a node in the doubly linked list.
3086
3087 @retval TRUE Node is the head of the doubly-linked list pointed by List.
3088 @retval FALSE Node is not the head of the doubly-linked list pointed by List.
3089
3090 **/
3091 BOOLEAN
3092 EFIAPI
3093 IsNull (
3094 IN CONST LIST_ENTRY *List,
3095 IN CONST LIST_ENTRY *Node
3096 );
3097
3098
3099 /**
3100 Determines if a node the last node in a doubly linked list.
3101
3102 Returns TRUE if Node is the last node in the doubly linked list specified by
3103 List. Otherwise, FALSE is returned. List must have been initialized with
3104 INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
3105
3106 If List is NULL, then ASSERT().
3107 If Node is NULL, then ASSERT().
3108 If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
3109 InitializeListHead(), then ASSERT().
3110 If PcdMaximumLinkedListLength is not zero, and the number of nodes
3111 in List, including the List node, is greater than or equal to
3112 PcdMaximumLinkedListLength, then ASSERT().
3113 If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
3114
3115 @param List A pointer to the head node of a doubly linked list.
3116 @param Node A pointer to a node in the doubly linked list.
3117
3118 @retval TRUE Node is the last node in the linked list.
3119 @retval FALSE Node is not the last node in the linked list.
3120
3121 **/
3122 BOOLEAN
3123 EFIAPI
3124 IsNodeAtEnd (
3125 IN CONST LIST_ENTRY *List,
3126 IN CONST LIST_ENTRY *Node
3127 );
3128
3129
3130 /**
3131 Swaps the location of two nodes in a doubly linked list, and returns the
3132 first node after the swap.
3133
3134 If FirstEntry is identical to SecondEntry, then SecondEntry is returned.
3135 Otherwise, the location of the FirstEntry node is swapped with the location
3136 of the SecondEntry node in a doubly linked list. SecondEntry must be in the
3137 same double linked list as FirstEntry and that double linked list must have
3138 been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
3139 SecondEntry is returned after the nodes are swapped.
3140
3141 If FirstEntry is NULL, then ASSERT().
3142 If SecondEntry is NULL, then ASSERT().
3143 If PcdVerifyNodeInList is TRUE and SecondEntry and FirstEntry are not in the
3144 same linked list, then ASSERT().
3145 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
3146 linked list containing the FirstEntry and SecondEntry nodes, including
3147 the FirstEntry and SecondEntry nodes, is greater than or equal to
3148 PcdMaximumLinkedListLength, then ASSERT().
3149
3150 @param FirstEntry A pointer to a node in a linked list.
3151 @param SecondEntry A pointer to another node in the same linked list.
3152
3153 @return SecondEntry.
3154
3155 **/
3156 LIST_ENTRY *
3157 EFIAPI
3158 SwapListEntries (
3159 IN OUT LIST_ENTRY *FirstEntry,
3160 IN OUT LIST_ENTRY *SecondEntry
3161 );
3162
3163
3164 /**
3165 Removes a node from a doubly linked list, and returns the node that follows
3166 the removed node.
3167
3168 Removes the node Entry from a doubly linked list. It is up to the caller of
3169 this function to release the memory used by this node if that is required. On
3170 exit, the node following Entry in the doubly linked list is returned. If
3171 Entry is the only node in the linked list, then the head node of the linked
3172 list is returned.
3173
3174 If Entry is NULL, then ASSERT().
3175 If Entry is the head node of an empty list, then ASSERT().
3176 If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
3177 linked list containing Entry, including the Entry node, is greater than
3178 or equal to PcdMaximumLinkedListLength, then ASSERT().
3179
3180 @param Entry A pointer to a node in a linked list.
3181
3182 @return Entry.
3183
3184 **/
3185 LIST_ENTRY *
3186 EFIAPI
3187 RemoveEntryList (
3188 IN CONST LIST_ENTRY *Entry
3189 );
3190
3191 //
3192 // Math Services
3193 //
3194
3195 /**
3196 Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled
3197 with zeros. The shifted value is returned.
3198
3199 This function shifts the 64-bit value Operand to the left by Count bits. The
3200 low Count bits are set to zero. The shifted value is returned.
3201
3202 If Count is greater than 63, then ASSERT().
3203
3204 @param Operand The 64-bit operand to shift left.
3205 @param Count The number of bits to shift left.
3206
3207 @return Operand << Count.
3208
3209 **/
3210 UINT64
3211 EFIAPI
3212 LShiftU64 (
3213 IN UINT64 Operand,
3214 IN UINTN Count
3215 );
3216
3217
3218 /**
3219 Shifts a 64-bit integer right between 0 and 63 bits. This high bits are
3220 filled with zeros. The shifted value is returned.
3221
3222 This function shifts the 64-bit value Operand to the right by Count bits. The
3223 high Count bits are set to zero. The shifted value is returned.
3224
3225 If Count is greater than 63, then ASSERT().
3226
3227 @param Operand The 64-bit operand to shift right.
3228 @param Count The number of bits to shift right.
3229
3230 @return Operand >> Count
3231
3232 **/
3233 UINT64
3234 EFIAPI
3235 RShiftU64 (
3236 IN UINT64 Operand,
3237 IN UINTN Count
3238 );
3239
3240
3241 /**
3242 Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled
3243 with original integer's bit 63. The shifted value is returned.
3244
3245 This function shifts the 64-bit value Operand to the right by Count bits. The
3246 high Count bits are set to bit 63 of Operand. The shifted value is returned.
3247
3248 If Count is greater than 63, then ASSERT().
3249
3250 @param Operand The 64-bit operand to shift right.
3251 @param Count The number of bits to shift right.
3252
3253 @return Operand >> Count
3254
3255 **/
3256 UINT64
3257 EFIAPI
3258 ARShiftU64 (
3259 IN UINT64 Operand,
3260 IN UINTN Count
3261 );
3262
3263
3264 /**
3265 Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits
3266 with the high bits that were rotated.
3267
3268 This function rotates the 32-bit value Operand to the left by Count bits. The
3269 low Count bits are fill with the high Count bits of Operand. The rotated
3270 value is returned.
3271
3272 If Count is greater than 31, then ASSERT().
3273
3274 @param Operand The 32-bit operand to rotate left.
3275 @param Count The number of bits to rotate left.
3276
3277 @return Operand << Count
3278
3279 **/
3280 UINT32
3281 EFIAPI
3282 LRotU32 (
3283 IN UINT32 Operand,
3284 IN UINTN Count
3285 );
3286
3287
3288 /**
3289 Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits
3290 with the low bits that were rotated.
3291
3292 This function rotates the 32-bit value Operand to the right by Count bits.
3293 The high Count bits are fill with the low Count bits of Operand. The rotated
3294 value is returned.
3295
3296 If Count is greater than 31, then ASSERT().
3297
3298 @param Operand The 32-bit operand to rotate right.
3299 @param Count The number of bits to rotate right.
3300
3301 @return Operand >> Count
3302
3303 **/
3304 UINT32
3305 EFIAPI
3306 RRotU32 (
3307 IN UINT32 Operand,
3308 IN UINTN Count
3309 );
3310
3311
3312 /**
3313 Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits
3314 with the high bits that were rotated.
3315
3316 This function rotates the 64-bit value Operand to the left by Count bits. The
3317 low Count bits are fill with the high Count bits of Operand. The rotated
3318 value is returned.
3319
3320 If Count is greater than 63, then ASSERT().
3321
3322 @param Operand The 64-bit operand to rotate left.
3323 @param Count The number of bits to rotate left.
3324
3325 @return Operand << Count
3326
3327 **/
3328 UINT64
3329 EFIAPI
3330 LRotU64 (
3331 IN UINT64 Operand,
3332 IN UINTN Count
3333 );
3334
3335
3336 /**
3337 Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits
3338 with the high low bits that were rotated.
3339
3340 This function rotates the 64-bit value Operand to the right by Count bits.
3341 The high Count bits are fill with the low Count bits of Operand. The rotated
3342 value is returned.
3343
3344 If Count is greater than 63, then ASSERT().
3345
3346 @param Operand The 64-bit operand to rotate right.
3347 @param Count The number of bits to rotate right.
3348
3349 @return Operand >> Count
3350
3351 **/
3352 UINT64
3353 EFIAPI
3354 RRotU64 (
3355 IN UINT64 Operand,
3356 IN UINTN Count
3357 );
3358
3359
3360 /**
3361 Returns the bit position of the lowest bit set in a 32-bit value.
3362
3363 This function computes the bit position of the lowest bit set in the 32-bit
3364 value specified by Operand. If Operand is zero, then -1 is returned.
3365 Otherwise, a value between 0 and 31 is returned.
3366
3367 @param Operand The 32-bit operand to evaluate.
3368
3369 @retval 0..31 The lowest bit set in Operand was found.
3370 @retval -1 Operand is zero.
3371
3372 **/
3373 INTN
3374 EFIAPI
3375 LowBitSet32 (
3376 IN UINT32 Operand
3377 );
3378
3379
3380 /**
3381 Returns the bit position of the lowest bit set in a 64-bit value.
3382
3383 This function computes the bit position of the lowest bit set in the 64-bit
3384 value specified by Operand. If Operand is zero, then -1 is returned.
3385 Otherwise, a value between 0 and 63 is returned.
3386
3387 @param Operand The 64-bit operand to evaluate.
3388
3389 @retval 0..63 The lowest bit set in Operand was found.
3390 @retval -1 Operand is zero.
3391
3392
3393 **/
3394 INTN
3395 EFIAPI
3396 LowBitSet64 (
3397 IN UINT64 Operand
3398 );
3399
3400
3401 /**
3402 Returns the bit position of the highest bit set in a 32-bit value. Equivalent
3403 to log2(x).
3404
3405 This function computes the bit position of the highest bit set in the 32-bit
3406 value specified by Operand. If Operand is zero, then -1 is returned.
3407 Otherwise, a value between 0 and 31 is returned.
3408
3409 @param Operand The 32-bit operand to evaluate.
3410
3411 @retval 0..31 Position of the highest bit set in Operand if found.
3412 @retval -1 Operand is zero.
3413
3414 **/
3415 INTN
3416 EFIAPI
3417 HighBitSet32 (
3418 IN UINT32 Operand
3419 );
3420
3421
3422 /**
3423 Returns the bit position of the highest bit set in a 64-bit value. Equivalent
3424 to log2(x).
3425
3426 This function computes the bit position of the highest bit set in the 64-bit
3427 value specified by Operand. If Operand is zero, then -1 is returned.
3428 Otherwise, a value between 0 and 63 is returned.
3429
3430 @param Operand The 64-bit operand to evaluate.
3431
3432 @retval 0..63 Position of the highest bit set in Operand if found.
3433 @retval -1 Operand is zero.
3434
3435 **/
3436 INTN
3437 EFIAPI
3438 HighBitSet64 (
3439 IN UINT64 Operand
3440 );
3441
3442
3443 /**
3444 Returns the value of the highest bit set in a 32-bit value. Equivalent to
3445 1 << log2(x).
3446
3447 This function computes the value of the highest bit set in the 32-bit value
3448 specified by Operand. If Operand is zero, then zero is returned.
3449
3450 @param Operand The 32-bit operand to evaluate.
3451
3452 @return 1 << HighBitSet32(Operand)
3453 @retval 0 Operand is zero.
3454
3455 **/
3456 UINT32
3457 EFIAPI
3458 GetPowerOfTwo32 (
3459 IN UINT32 Operand
3460 );
3461
3462
3463 /**
3464 Returns the value of the highest bit set in a 64-bit value. Equivalent to
3465 1 << log2(x).
3466
3467 This function computes the value of the highest bit set in the 64-bit value
3468 specified by Operand. If Operand is zero, then zero is returned.
3469
3470 @param Operand The 64-bit operand to evaluate.
3471
3472 @return 1 << HighBitSet64(Operand)
3473 @retval 0 Operand is zero.
3474
3475 **/
3476 UINT64
3477 EFIAPI
3478 GetPowerOfTwo64 (
3479 IN UINT64 Operand
3480 );
3481
3482
3483 /**
3484 Switches the endianness of a 16-bit integer.
3485
3486 This function swaps the bytes in a 16-bit unsigned value to switch the value
3487 from little endian to big endian or vice versa. The byte swapped value is
3488 returned.
3489
3490 @param Value A 16-bit unsigned value.
3491
3492 @return The byte swapped Value.
3493
3494 **/
3495 UINT16
3496 EFIAPI
3497 SwapBytes16 (
3498 IN UINT16 Value
3499 );
3500
3501
3502 /**
3503 Switches the endianness of a 32-bit integer.
3504
3505 This function swaps the bytes in a 32-bit unsigned value to switch the value
3506 from little endian to big endian or vice versa. The byte swapped value is
3507 returned.
3508
3509 @param Value A 32-bit unsigned value.
3510
3511 @return The byte swapped Value.
3512
3513 **/
3514 UINT32
3515 EFIAPI
3516 SwapBytes32 (
3517 IN UINT32 Value
3518 );
3519
3520
3521 /**
3522 Switches the endianness of a 64-bit integer.
3523
3524 This function swaps the bytes in a 64-bit unsigned value to switch the value
3525 from little endian to big endian or vice versa. The byte swapped value is
3526 returned.
3527
3528 @param Value A 64-bit unsigned value.
3529
3530 @return The byte swapped Value.
3531
3532 **/
3533 UINT64
3534 EFIAPI
3535 SwapBytes64 (
3536 IN UINT64 Value
3537 );
3538
3539
3540 /**
3541 Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and
3542 generates a 64-bit unsigned result.
3543
3544 This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
3545 unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
3546 bit unsigned result is returned.
3547
3548 @param Multiplicand A 64-bit unsigned value.
3549 @param Multiplier A 32-bit unsigned value.
3550
3551 @return Multiplicand * Multiplier
3552
3553 **/
3554 UINT64
3555 EFIAPI
3556 MultU64x32 (
3557 IN UINT64 Multiplicand,
3558 IN UINT32 Multiplier
3559 );
3560
3561
3562 /**
3563 Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and
3564 generates a 64-bit unsigned result.
3565
3566 This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
3567 unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
3568 bit unsigned result is returned.
3569
3570 @param Multiplicand A 64-bit unsigned value.
3571 @param Multiplier A 64-bit unsigned value.
3572
3573 @return Multiplicand * Multiplier.
3574
3575 **/
3576 UINT64
3577 EFIAPI
3578 MultU64x64 (
3579 IN UINT64 Multiplicand,
3580 IN UINT64 Multiplier
3581 );
3582
3583
3584 /**
3585 Multiples a 64-bit signed integer by a 64-bit signed integer and generates a
3586 64-bit signed result.
3587
3588 This function multiples the 64-bit signed value Multiplicand by the 64-bit
3589 signed value Multiplier and generates a 64-bit signed result. This 64-bit
3590 signed result is returned.
3591
3592 @param Multiplicand A 64-bit signed value.
3593 @param Multiplier A 64-bit signed value.
3594
3595 @return Multiplicand * Multiplier
3596
3597 **/
3598 INT64
3599 EFIAPI
3600 MultS64x64 (
3601 IN INT64 Multiplicand,
3602 IN INT64 Multiplier
3603 );
3604
3605
3606 /**
3607 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
3608 a 64-bit unsigned result.
3609
3610 This function divides the 64-bit unsigned value Dividend by the 32-bit
3611 unsigned value Divisor and generates a 64-bit unsigned quotient. This
3612 function returns the 64-bit unsigned quotient.
3613
3614 If Divisor is 0, then ASSERT().
3615
3616 @param Dividend A 64-bit unsigned value.
3617 @param Divisor A 32-bit unsigned value.
3618
3619 @return Dividend / Divisor.
3620
3621 **/
3622 UINT64
3623 EFIAPI
3624 DivU64x32 (
3625 IN UINT64 Dividend,
3626 IN UINT32 Divisor
3627 );
3628
3629
3630 /**
3631 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
3632 a 32-bit unsigned remainder.
3633
3634 This function divides the 64-bit unsigned value Dividend by the 32-bit
3635 unsigned value Divisor and generates a 32-bit remainder. This function
3636 returns the 32-bit unsigned remainder.
3637
3638 If Divisor is 0, then ASSERT().
3639
3640 @param Dividend A 64-bit unsigned value.
3641 @param Divisor A 32-bit unsigned value.
3642
3643 @return Dividend % Divisor.
3644
3645 **/
3646 UINT32
3647 EFIAPI
3648 ModU64x32 (
3649 IN UINT64 Dividend,
3650 IN UINT32 Divisor
3651 );
3652
3653
3654 /**
3655 Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
3656 a 64-bit unsigned result and an optional 32-bit unsigned remainder.
3657
3658 This function divides the 64-bit unsigned value Dividend by the 32-bit
3659 unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
3660 is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
3661 This function returns the 64-bit unsigned quotient.
3662
3663 If Divisor is 0, then ASSERT().
3664
3665 @param Dividend A 64-bit unsigned value.
3666 @param Divisor A 32-bit unsigned value.
3667 @param Remainder A pointer to a 32-bit unsigned value. This parameter is
3668 optional and may be NULL.
3669
3670 @return Dividend / Divisor.
3671
3672 **/
3673 UINT64
3674 EFIAPI
3675 DivU64x32Remainder (
3676 IN UINT64 Dividend,
3677 IN UINT32 Divisor,
3678 OUT UINT32 *Remainder OPTIONAL
3679 );
3680
3681
3682 /**
3683 Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates
3684 a 64-bit unsigned result and an optional 64-bit unsigned remainder.
3685
3686 This function divides the 64-bit unsigned value Dividend by the 64-bit
3687 unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
3688 is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
3689 This function returns the 64-bit unsigned quotient.
3690
3691 If Divisor is 0, then ASSERT().
3692
3693 @param Dividend A 64-bit unsigned value.
3694 @param Divisor A 64-bit unsigned value.
3695 @param Remainder A pointer to a 64-bit unsigned value. This parameter is
3696 optional and may be NULL.
3697
3698 @return Dividend / Divisor.
3699
3700 **/
3701 UINT64
3702 EFIAPI
3703 DivU64x64Remainder (
3704 IN UINT64 Dividend,
3705 IN UINT64 Divisor,
3706 OUT UINT64 *Remainder OPTIONAL
3707 );
3708
3709
3710 /**
3711 Divides a 64-bit signed integer by a 64-bit signed integer and generates a
3712 64-bit signed result and a optional 64-bit signed remainder.
3713
3714 This function divides the 64-bit signed value Dividend by the 64-bit signed
3715 value Divisor and generates a 64-bit signed quotient. If Remainder is not
3716 NULL, then the 64-bit signed remainder is returned in Remainder. This
3717 function returns the 64-bit signed quotient.
3718
3719 It is the caller's responsibility to not call this function with a Divisor of 0.
3720 If Divisor is 0, then the quotient and remainder should be assumed to be
3721 the largest negative integer.
3722
3723 If Divisor is 0, then ASSERT().
3724
3725 @param Dividend A 64-bit signed value.
3726 @param Divisor A 64-bit signed value.
3727 @param Remainder A pointer to a 64-bit signed value. This parameter is
3728 optional and may be NULL.
3729
3730 @return Dividend / Divisor.
3731
3732 **/
3733 INT64
3734 EFIAPI
3735 DivS64x64Remainder (
3736 IN INT64 Dividend,
3737 IN INT64 Divisor,
3738 OUT INT64 *Remainder OPTIONAL
3739 );
3740
3741
3742 /**
3743 Reads a 16-bit value from memory that may be unaligned.
3744
3745 This function returns the 16-bit value pointed to by Buffer. The function
3746 guarantees that the read operation does not produce an alignment fault.
3747
3748 If the Buffer is NULL, then ASSERT().
3749
3750 @param Buffer The pointer to a 16-bit value that may be unaligned.
3751
3752 @return The 16-bit value read from Buffer.
3753
3754 **/
3755 UINT16
3756 EFIAPI
3757 ReadUnaligned16 (
3758 IN CONST UINT16 *Buffer
3759 );
3760
3761
3762 /**
3763 Writes a 16-bit value to memory that may be unaligned.
3764
3765 This function writes the 16-bit value specified by Value to Buffer. Value is
3766 returned. The function guarantees that the write operation does not produce
3767 an alignment fault.
3768
3769 If the Buffer is NULL, then ASSERT().
3770
3771 @param Buffer The pointer to a 16-bit value that may be unaligned.
3772 @param Value 16-bit value to write to Buffer.
3773
3774 @return The 16-bit value to write to Buffer.
3775
3776 **/
3777 UINT16
3778 EFIAPI
3779 WriteUnaligned16 (
3780 OUT UINT16 *Buffer,
3781 IN UINT16 Value
3782 );
3783
3784
3785 /**
3786 Reads a 24-bit value from memory that may be unaligned.
3787
3788 This function returns the 24-bit value pointed to by Buffer. The function
3789 guarantees that the read operation does not produce an alignment fault.
3790
3791 If the Buffer is NULL, then ASSERT().
3792
3793 @param Buffer The pointer to a 24-bit value that may be unaligned.
3794
3795 @return The 24-bit value read from Buffer.
3796
3797 **/
3798 UINT32
3799 EFIAPI
3800 ReadUnaligned24 (
3801 IN CONST UINT32 *Buffer
3802 );
3803
3804
3805 /**
3806 Writes a 24-bit value to memory that may be unaligned.
3807
3808 This function writes the 24-bit value specified by Value to Buffer. Value is
3809 returned. The function guarantees that the write operation does not produce
3810 an alignment fault.
3811
3812 If the Buffer is NULL, then ASSERT().
3813
3814 @param Buffer The pointer to a 24-bit value that may be unaligned.
3815 @param Value 24-bit value to write to Buffer.
3816
3817 @return The 24-bit value to write to Buffer.
3818
3819 **/
3820 UINT32
3821 EFIAPI
3822 WriteUnaligned24 (
3823 OUT UINT32 *Buffer,
3824 IN UINT32 Value
3825 );
3826
3827
3828 /**
3829 Reads a 32-bit value from memory that may be unaligned.
3830
3831 This function returns the 32-bit value pointed to by Buffer. The function
3832 guarantees that the read operation does not produce an alignment fault.
3833
3834 If the Buffer is NULL, then ASSERT().
3835
3836 @param Buffer The pointer to a 32-bit value that may be unaligned.
3837
3838 @return The 32-bit value read from Buffer.
3839
3840 **/
3841 UINT32
3842 EFIAPI
3843 ReadUnaligned32 (
3844 IN CONST UINT32 *Buffer
3845 );
3846
3847
3848 /**
3849 Writes a 32-bit value to memory that may be unaligned.
3850
3851 This function writes the 32-bit value specified by Value to Buffer. Value is
3852 returned. The function guarantees that the write operation does not produce
3853 an alignment fault.
3854
3855 If the Buffer is NULL, then ASSERT().
3856
3857 @param Buffer The pointer to a 32-bit value that may be unaligned.
3858 @param Value 32-bit value to write to Buffer.
3859
3860 @return The 32-bit value to write to Buffer.
3861
3862 **/
3863 UINT32
3864 EFIAPI
3865 WriteUnaligned32 (
3866 OUT UINT32 *Buffer,
3867 IN UINT32 Value
3868 );
3869
3870
3871 /**
3872 Reads a 64-bit value from memory that may be unaligned.
3873
3874 This function returns the 64-bit value pointed to by Buffer. The function
3875 guarantees that the read operation does not produce an alignment fault.
3876
3877 If the Buffer is NULL, then ASSERT().
3878
3879 @param Buffer The pointer to a 64-bit value that may be unaligned.
3880
3881 @return The 64-bit value read from Buffer.
3882
3883 **/
3884 UINT64
3885 EFIAPI
3886 ReadUnaligned64 (
3887 IN CONST UINT64 *Buffer
3888 );
3889
3890
3891 /**
3892 Writes a 64-bit value to memory that may be unaligned.
3893
3894 This function writes the 64-bit value specified by Value to Buffer. Value is
3895 returned. The function guarantees that the write operation does not produce
3896 an alignment fault.
3897
3898 If the Buffer is NULL, then ASSERT().
3899
3900 @param Buffer The pointer to a 64-bit value that may be unaligned.
3901 @param Value 64-bit value to write to Buffer.
3902
3903 @return The 64-bit value to write to Buffer.
3904
3905 **/
3906 UINT64
3907 EFIAPI
3908 WriteUnaligned64 (
3909 OUT UINT64 *Buffer,
3910 IN UINT64 Value
3911 );
3912
3913
3914 //
3915 // Bit Field Functions
3916 //
3917
3918 /**
3919 Returns a bit field from an 8-bit value.
3920
3921 Returns the bitfield specified by the StartBit and the EndBit from Operand.
3922
3923 If 8-bit operations are not supported, then ASSERT().
3924 If StartBit is greater than 7, then ASSERT().
3925 If EndBit is greater than 7, then ASSERT().
3926 If EndBit is less than StartBit, then ASSERT().
3927
3928 @param Operand Operand on which to perform the bitfield operation.
3929 @param StartBit The ordinal of the least significant bit in the bit field.
3930 Range 0..7.
3931 @param EndBit The ordinal of the most significant bit in the bit field.
3932 Range 0..7.
3933
3934 @return The bit field read.
3935
3936 **/
3937 UINT8
3938 EFIAPI
3939 BitFieldRead8 (
3940 IN UINT8 Operand,
3941 IN UINTN StartBit,
3942 IN UINTN EndBit
3943 );
3944
3945
3946 /**
3947 Writes a bit field to an 8-bit value, and returns the result.
3948
3949 Writes Value to the bit field specified by the StartBit and the EndBit in
3950 Operand. All other bits in Operand are preserved. The new 8-bit value is
3951 returned.
3952
3953 If 8-bit operations are not supported, then ASSERT().
3954 If StartBit is greater than 7, then ASSERT().
3955 If EndBit is greater than 7, then ASSERT().
3956 If EndBit is less than StartBit, then ASSERT().
3957 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
3958
3959 @param Operand Operand on which to perform the bitfield operation.
3960 @param StartBit The ordinal of the least significant bit in the bit field.
3961 Range 0..7.
3962 @param EndBit The ordinal of the most significant bit in the bit field.
3963 Range 0..7.
3964 @param Value New value of the bit field.
3965
3966 @return The new 8-bit value.
3967
3968 **/
3969 UINT8
3970 EFIAPI
3971 BitFieldWrite8 (
3972 IN UINT8 Operand,
3973 IN UINTN StartBit,
3974 IN UINTN EndBit,
3975 IN UINT8 Value
3976 );
3977
3978
3979 /**
3980 Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the
3981 result.
3982
3983 Performs a bitwise OR between the bit field specified by StartBit
3984 and EndBit in Operand and the value specified by OrData. All other bits in
3985 Operand are preserved. The new 8-bit value is returned.
3986
3987 If 8-bit operations are not supported, then ASSERT().
3988 If StartBit is greater than 7, then ASSERT().
3989 If EndBit is greater than 7, then ASSERT().
3990 If EndBit is less than StartBit, then ASSERT().
3991 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
3992
3993 @param Operand Operand on which to perform the bitfield operation.
3994 @param StartBit The ordinal of the least significant bit in the bit field.
3995 Range 0..7.
3996 @param EndBit The ordinal of the most significant bit in the bit field.
3997 Range 0..7.
3998 @param OrData The value to OR with the read value from the value
3999
4000 @return The new 8-bit value.
4001
4002 **/
4003 UINT8
4004 EFIAPI
4005 BitFieldOr8 (
4006 IN UINT8 Operand,
4007 IN UINTN StartBit,
4008 IN UINTN EndBit,
4009 IN UINT8 OrData
4010 );
4011
4012
4013 /**
4014 Reads a bit field from an 8-bit value, performs a bitwise AND, and returns
4015 the result.
4016
4017 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4018 in Operand and the value specified by AndData. All other bits in Operand are
4019 preserved. The new 8-bit value is returned.
4020
4021 If 8-bit operations are not supported, then ASSERT().
4022 If StartBit is greater than 7, then ASSERT().
4023 If EndBit is greater than 7, then ASSERT().
4024 If EndBit is less than StartBit, then ASSERT().
4025 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4026
4027 @param Operand Operand on which to perform the bitfield operation.
4028 @param StartBit The ordinal of the least significant bit in the bit field.
4029 Range 0..7.
4030 @param EndBit The ordinal of the most significant bit in the bit field.
4031 Range 0..7.
4032 @param AndData The value to AND with the read value from the value.
4033
4034 @return The new 8-bit value.
4035
4036 **/
4037 UINT8
4038 EFIAPI
4039 BitFieldAnd8 (
4040 IN UINT8 Operand,
4041 IN UINTN StartBit,
4042 IN UINTN EndBit,
4043 IN UINT8 AndData
4044 );
4045
4046
4047 /**
4048 Reads a bit field from an 8-bit value, performs a bitwise AND followed by a
4049 bitwise OR, and returns the result.
4050
4051 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4052 in Operand and the value specified by AndData, followed by a bitwise
4053 OR with value specified by OrData. All other bits in Operand are
4054 preserved. The new 8-bit value is returned.
4055
4056 If 8-bit operations are not supported, then ASSERT().
4057 If StartBit is greater than 7, then ASSERT().
4058 If EndBit is greater than 7, then ASSERT().
4059 If EndBit is less than StartBit, then ASSERT().
4060 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4061 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4062
4063 @param Operand Operand on which to perform the bitfield operation.
4064 @param StartBit The ordinal of the least significant bit in the bit field.
4065 Range 0..7.
4066 @param EndBit The ordinal of the most significant bit in the bit field.
4067 Range 0..7.
4068 @param AndData The value to AND with the read value from the value.
4069 @param OrData The value to OR with the result of the AND operation.
4070
4071 @return The new 8-bit value.
4072
4073 **/
4074 UINT8
4075 EFIAPI
4076 BitFieldAndThenOr8 (
4077 IN UINT8 Operand,
4078 IN UINTN StartBit,
4079 IN UINTN EndBit,
4080 IN UINT8 AndData,
4081 IN UINT8 OrData
4082 );
4083
4084
4085 /**
4086 Returns a bit field from a 16-bit value.
4087
4088 Returns the bitfield specified by the StartBit and the EndBit from Operand.
4089
4090 If 16-bit operations are not supported, then ASSERT().
4091 If StartBit is greater than 15, then ASSERT().
4092 If EndBit is greater than 15, then ASSERT().
4093 If EndBit is less than StartBit, then ASSERT().
4094
4095 @param Operand Operand on which to perform the bitfield operation.
4096 @param StartBit The ordinal of the least significant bit in the bit field.
4097 Range 0..15.
4098 @param EndBit The ordinal of the most significant bit in the bit field.
4099 Range 0..15.
4100
4101 @return The bit field read.
4102
4103 **/
4104 UINT16
4105 EFIAPI
4106 BitFieldRead16 (
4107 IN UINT16 Operand,
4108 IN UINTN StartBit,
4109 IN UINTN EndBit
4110 );
4111
4112
4113 /**
4114 Writes a bit field to a 16-bit value, and returns the result.
4115
4116 Writes Value to the bit field specified by the StartBit and the EndBit in
4117 Operand. All other bits in Operand are preserved. The new 16-bit value is
4118 returned.
4119
4120 If 16-bit operations are not supported, then ASSERT().
4121 If StartBit is greater than 15, then ASSERT().
4122 If EndBit is greater than 15, then ASSERT().
4123 If EndBit is less than StartBit, then ASSERT().
4124 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4125
4126 @param Operand Operand on which to perform the bitfield operation.
4127 @param StartBit The ordinal of the least significant bit in the bit field.
4128 Range 0..15.
4129 @param EndBit The ordinal of the most significant bit in the bit field.
4130 Range 0..15.
4131 @param Value New value of the bit field.
4132
4133 @return The new 16-bit value.
4134
4135 **/
4136 UINT16
4137 EFIAPI
4138 BitFieldWrite16 (
4139 IN UINT16 Operand,
4140 IN UINTN StartBit,
4141 IN UINTN EndBit,
4142 IN UINT16 Value
4143 );
4144
4145
4146 /**
4147 Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the
4148 result.
4149
4150 Performs a bitwise OR between the bit field specified by StartBit
4151 and EndBit in Operand and the value specified by OrData. All other bits in
4152 Operand are preserved. The new 16-bit value is returned.
4153
4154 If 16-bit operations are not supported, then ASSERT().
4155 If StartBit is greater than 15, then ASSERT().
4156 If EndBit is greater than 15, then ASSERT().
4157 If EndBit is less than StartBit, then ASSERT().
4158 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4159
4160 @param Operand Operand on which to perform the bitfield operation.
4161 @param StartBit The ordinal of the least significant bit in the bit field.
4162 Range 0..15.
4163 @param EndBit The ordinal of the most significant bit in the bit field.
4164 Range 0..15.
4165 @param OrData The value to OR with the read value from the value
4166
4167 @return The new 16-bit value.
4168
4169 **/
4170 UINT16
4171 EFIAPI
4172 BitFieldOr16 (
4173 IN UINT16 Operand,
4174 IN UINTN StartBit,
4175 IN UINTN EndBit,
4176 IN UINT16 OrData
4177 );
4178
4179
4180 /**
4181 Reads a bit field from a 16-bit value, performs a bitwise AND, and returns
4182 the result.
4183
4184 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4185 in Operand and the value specified by AndData. All other bits in Operand are
4186 preserved. The new 16-bit value is returned.
4187
4188 If 16-bit operations are not supported, then ASSERT().
4189 If StartBit is greater than 15, then ASSERT().
4190 If EndBit is greater than 15, then ASSERT().
4191 If EndBit is less than StartBit, then ASSERT().
4192 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4193
4194 @param Operand Operand on which to perform the bitfield operation.
4195 @param StartBit The ordinal of the least significant bit in the bit field.
4196 Range 0..15.
4197 @param EndBit The ordinal of the most significant bit in the bit field.
4198 Range 0..15.
4199 @param AndData The value to AND with the read value from the value
4200
4201 @return The new 16-bit value.
4202
4203 **/
4204 UINT16
4205 EFIAPI
4206 BitFieldAnd16 (
4207 IN UINT16 Operand,
4208 IN UINTN StartBit,
4209 IN UINTN EndBit,
4210 IN UINT16 AndData
4211 );
4212
4213
4214 /**
4215 Reads a bit field from a 16-bit value, performs a bitwise AND followed by a
4216 bitwise OR, and returns the result.
4217
4218 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4219 in Operand and the value specified by AndData, followed by a bitwise
4220 OR with value specified by OrData. All other bits in Operand are
4221 preserved. The new 16-bit value is returned.
4222
4223 If 16-bit operations are not supported, then ASSERT().
4224 If StartBit is greater than 15, then ASSERT().
4225 If EndBit is greater than 15, then ASSERT().
4226 If EndBit is less than StartBit, then ASSERT().
4227 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4228 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4229
4230 @param Operand Operand on which to perform the bitfield operation.
4231 @param StartBit The ordinal of the least significant bit in the bit field.
4232 Range 0..15.
4233 @param EndBit The ordinal of the most significant bit in the bit field.
4234 Range 0..15.
4235 @param AndData The value to AND with the read value from the value.
4236 @param OrData The value to OR with the result of the AND operation.
4237
4238 @return The new 16-bit value.
4239
4240 **/
4241 UINT16
4242 EFIAPI
4243 BitFieldAndThenOr16 (
4244 IN UINT16 Operand,
4245 IN UINTN StartBit,
4246 IN UINTN EndBit,
4247 IN UINT16 AndData,
4248 IN UINT16 OrData
4249 );
4250
4251
4252 /**
4253 Returns a bit field from a 32-bit value.
4254
4255 Returns the bitfield specified by the StartBit and the EndBit from Operand.
4256
4257 If 32-bit operations are not supported, then ASSERT().
4258 If StartBit is greater than 31, then ASSERT().
4259 If EndBit is greater than 31, then ASSERT().
4260 If EndBit is less than StartBit, then ASSERT().
4261
4262 @param Operand Operand on which to perform the bitfield operation.
4263 @param StartBit The ordinal of the least significant bit in the bit field.
4264 Range 0..31.
4265 @param EndBit The ordinal of the most significant bit in the bit field.
4266 Range 0..31.
4267
4268 @return The bit field read.
4269
4270 **/
4271 UINT32
4272 EFIAPI
4273 BitFieldRead32 (
4274 IN UINT32 Operand,
4275 IN UINTN StartBit,
4276 IN UINTN EndBit
4277 );
4278
4279
4280 /**
4281 Writes a bit field to a 32-bit value, and returns the result.
4282
4283 Writes Value to the bit field specified by the StartBit and the EndBit in
4284 Operand. All other bits in Operand are preserved. The new 32-bit value is
4285 returned.
4286
4287 If 32-bit operations are not supported, then ASSERT().
4288 If StartBit is greater than 31, then ASSERT().
4289 If EndBit is greater than 31, then ASSERT().
4290 If EndBit is less than StartBit, then ASSERT().
4291 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4292
4293 @param Operand Operand on which to perform the bitfield operation.
4294 @param StartBit The ordinal of the least significant bit in the bit field.
4295 Range 0..31.
4296 @param EndBit The ordinal of the most significant bit in the bit field.
4297 Range 0..31.
4298 @param Value New value of the bit field.
4299
4300 @return The new 32-bit value.
4301
4302 **/
4303 UINT32
4304 EFIAPI
4305 BitFieldWrite32 (
4306 IN UINT32 Operand,
4307 IN UINTN StartBit,
4308 IN UINTN EndBit,
4309 IN UINT32 Value
4310 );
4311
4312
4313 /**
4314 Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the
4315 result.
4316
4317 Performs a bitwise OR between the bit field specified by StartBit
4318 and EndBit in Operand and the value specified by OrData. All other bits in
4319 Operand are preserved. The new 32-bit value is returned.
4320
4321 If 32-bit operations are not supported, then ASSERT().
4322 If StartBit is greater than 31, then ASSERT().
4323 If EndBit is greater than 31, then ASSERT().
4324 If EndBit is less than StartBit, then ASSERT().
4325 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4326
4327 @param Operand Operand on which to perform the bitfield operation.
4328 @param StartBit The ordinal of the least significant bit in the bit field.
4329 Range 0..31.
4330 @param EndBit The ordinal of the most significant bit in the bit field.
4331 Range 0..31.
4332 @param OrData The value to OR with the read value from the value.
4333
4334 @return The new 32-bit value.
4335
4336 **/
4337 UINT32
4338 EFIAPI
4339 BitFieldOr32 (
4340 IN UINT32 Operand,
4341 IN UINTN StartBit,
4342 IN UINTN EndBit,
4343 IN UINT32 OrData
4344 );
4345
4346
4347 /**
4348 Reads a bit field from a 32-bit value, performs a bitwise AND, and returns
4349 the result.
4350
4351 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4352 in Operand and the value specified by AndData. All other bits in Operand are
4353 preserved. The new 32-bit value is returned.
4354
4355 If 32-bit operations are not supported, then ASSERT().
4356 If StartBit is greater than 31, then ASSERT().
4357 If EndBit is greater than 31, then ASSERT().
4358 If EndBit is less than StartBit, then ASSERT().
4359 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4360
4361 @param Operand Operand on which to perform the bitfield operation.
4362 @param StartBit The ordinal of the least significant bit in the bit field.
4363 Range 0..31.
4364 @param EndBit The ordinal of the most significant bit in the bit field.
4365 Range 0..31.
4366 @param AndData The value to AND with the read value from the value
4367
4368 @return The new 32-bit value.
4369
4370 **/
4371 UINT32
4372 EFIAPI
4373 BitFieldAnd32 (
4374 IN UINT32 Operand,
4375 IN UINTN StartBit,
4376 IN UINTN EndBit,
4377 IN UINT32 AndData
4378 );
4379
4380
4381 /**
4382 Reads a bit field from a 32-bit value, performs a bitwise AND followed by a
4383 bitwise OR, and returns the result.
4384
4385 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4386 in Operand and the value specified by AndData, followed by a bitwise
4387 OR with value specified by OrData. All other bits in Operand are
4388 preserved. The new 32-bit value is returned.
4389
4390 If 32-bit operations are not supported, then ASSERT().
4391 If StartBit is greater than 31, then ASSERT().
4392 If EndBit is greater than 31, then ASSERT().
4393 If EndBit is less than StartBit, then ASSERT().
4394 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4395 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4396
4397 @param Operand Operand on which to perform the bitfield operation.
4398 @param StartBit The ordinal of the least significant bit in the bit field.
4399 Range 0..31.
4400 @param EndBit The ordinal of the most significant bit in the bit field.
4401 Range 0..31.
4402 @param AndData The value to AND with the read value from the value.
4403 @param OrData The value to OR with the result of the AND operation.
4404
4405 @return The new 32-bit value.
4406
4407 **/
4408 UINT32
4409 EFIAPI
4410 BitFieldAndThenOr32 (
4411 IN UINT32 Operand,
4412 IN UINTN StartBit,
4413 IN UINTN EndBit,
4414 IN UINT32 AndData,
4415 IN UINT32 OrData
4416 );
4417
4418
4419 /**
4420 Returns a bit field from a 64-bit value.
4421
4422 Returns the bitfield specified by the StartBit and the EndBit from Operand.
4423
4424 If 64-bit operations are not supported, then ASSERT().
4425 If StartBit is greater than 63, then ASSERT().
4426 If EndBit is greater than 63, then ASSERT().
4427 If EndBit is less than StartBit, then ASSERT().
4428
4429 @param Operand Operand on which to perform the bitfield operation.
4430 @param StartBit The ordinal of the least significant bit in the bit field.
4431 Range 0..63.
4432 @param EndBit The ordinal of the most significant bit in the bit field.
4433 Range 0..63.
4434
4435 @return The bit field read.
4436
4437 **/
4438 UINT64
4439 EFIAPI
4440 BitFieldRead64 (
4441 IN UINT64 Operand,
4442 IN UINTN StartBit,
4443 IN UINTN EndBit
4444 );
4445
4446
4447 /**
4448 Writes a bit field to a 64-bit value, and returns the result.
4449
4450 Writes Value to the bit field specified by the StartBit and the EndBit in
4451 Operand. All other bits in Operand are preserved. The new 64-bit value is
4452 returned.
4453
4454 If 64-bit operations are not supported, then ASSERT().
4455 If StartBit is greater than 63, then ASSERT().
4456 If EndBit is greater than 63, then ASSERT().
4457 If EndBit is less than StartBit, then ASSERT().
4458 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4459
4460 @param Operand Operand on which to perform the bitfield operation.
4461 @param StartBit The ordinal of the least significant bit in the bit field.
4462 Range 0..63.
4463 @param EndBit The ordinal of the most significant bit in the bit field.
4464 Range 0..63.
4465 @param Value New value of the bit field.
4466
4467 @return The new 64-bit value.
4468
4469 **/
4470 UINT64
4471 EFIAPI
4472 BitFieldWrite64 (
4473 IN UINT64 Operand,
4474 IN UINTN StartBit,
4475 IN UINTN EndBit,
4476 IN UINT64 Value
4477 );
4478
4479
4480 /**
4481 Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the
4482 result.
4483
4484 Performs a bitwise OR between the bit field specified by StartBit
4485 and EndBit in Operand and the value specified by OrData. All other bits in
4486 Operand are preserved. The new 64-bit value is returned.
4487
4488 If 64-bit operations are not supported, then ASSERT().
4489 If StartBit is greater than 63, then ASSERT().
4490 If EndBit is greater than 63, then ASSERT().
4491 If EndBit is less than StartBit, then ASSERT().
4492 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4493
4494 @param Operand Operand on which to perform the bitfield operation.
4495 @param StartBit The ordinal of the least significant bit in the bit field.
4496 Range 0..63.
4497 @param EndBit The ordinal of the most significant bit in the bit field.
4498 Range 0..63.
4499 @param OrData The value to OR with the read value from the value
4500
4501 @return The new 64-bit value.
4502
4503 **/
4504 UINT64
4505 EFIAPI
4506 BitFieldOr64 (
4507 IN UINT64 Operand,
4508 IN UINTN StartBit,
4509 IN UINTN EndBit,
4510 IN UINT64 OrData
4511 );
4512
4513
4514 /**
4515 Reads a bit field from a 64-bit value, performs a bitwise AND, and returns
4516 the result.
4517
4518 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4519 in Operand and the value specified by AndData. All other bits in Operand are
4520 preserved. The new 64-bit value is returned.
4521
4522 If 64-bit operations are not supported, then ASSERT().
4523 If StartBit is greater than 63, then ASSERT().
4524 If EndBit is greater than 63, then ASSERT().
4525 If EndBit is less than StartBit, then ASSERT().
4526 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4527
4528 @param Operand Operand on which to perform the bitfield operation.
4529 @param StartBit The ordinal of the least significant bit in the bit field.
4530 Range 0..63.
4531 @param EndBit The ordinal of the most significant bit in the bit field.
4532 Range 0..63.
4533 @param AndData The value to AND with the read value from the value
4534
4535 @return The new 64-bit value.
4536
4537 **/
4538 UINT64
4539 EFIAPI
4540 BitFieldAnd64 (
4541 IN UINT64 Operand,
4542 IN UINTN StartBit,
4543 IN UINTN EndBit,
4544 IN UINT64 AndData
4545 );
4546
4547
4548 /**
4549 Reads a bit field from a 64-bit value, performs a bitwise AND followed by a
4550 bitwise OR, and returns the result.
4551
4552 Performs a bitwise AND between the bit field specified by StartBit and EndBit
4553 in Operand and the value specified by AndData, followed by a bitwise
4554 OR with value specified by OrData. All other bits in Operand are
4555 preserved. The new 64-bit value is returned.
4556
4557 If 64-bit operations are not supported, then ASSERT().
4558 If StartBit is greater than 63, then ASSERT().
4559 If EndBit is greater than 63, then ASSERT().
4560 If EndBit is less than StartBit, then ASSERT().
4561 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4562 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
4563
4564 @param Operand Operand on which to perform the bitfield operation.
4565 @param StartBit The ordinal of the least significant bit in the bit field.
4566 Range 0..63.
4567 @param EndBit The ordinal of the most significant bit in the bit field.
4568 Range 0..63.
4569 @param AndData The value to AND with the read value from the value.
4570 @param OrData The value to OR with the result of the AND operation.
4571
4572 @return The new 64-bit value.
4573
4574 **/
4575 UINT64
4576 EFIAPI
4577 BitFieldAndThenOr64 (
4578 IN UINT64 Operand,
4579 IN UINTN StartBit,
4580 IN UINTN EndBit,
4581 IN UINT64 AndData,
4582 IN UINT64 OrData
4583 );
4584
4585 //
4586 // Base Library Checksum Functions
4587 //
4588
4589 /**
4590 Returns the sum of all elements in a buffer in unit of UINT8.
4591 During calculation, the carry bits are dropped.
4592
4593 This function calculates the sum of all elements in a buffer
4594 in unit of UINT8. The carry bits in result of addition are dropped.
4595 The result is returned as UINT8. If Length is Zero, then Zero is
4596 returned.
4597
4598 If Buffer is NULL, then ASSERT().
4599 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4600
4601 @param Buffer The pointer to the buffer to carry out the sum operation.
4602 @param Length The size, in bytes, of Buffer.
4603
4604 @return Sum The sum of Buffer with carry bits dropped during additions.
4605
4606 **/
4607 UINT8
4608 EFIAPI
4609 CalculateSum8 (
4610 IN CONST UINT8 *Buffer,
4611 IN UINTN Length
4612 );
4613
4614
4615 /**
4616 Returns the two's complement checksum of all elements in a buffer
4617 of 8-bit values.
4618
4619 This function first calculates the sum of the 8-bit values in the
4620 buffer specified by Buffer and Length. The carry bits in the result
4621 of addition are dropped. Then, the two's complement of the sum is
4622 returned. If Length is 0, then 0 is returned.
4623
4624 If Buffer is NULL, then ASSERT().
4625 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4626
4627 @param Buffer The pointer to the buffer to carry out the checksum operation.
4628 @param Length The size, in bytes, of Buffer.
4629
4630 @return Checksum The two's complement checksum of Buffer.
4631
4632 **/
4633 UINT8
4634 EFIAPI
4635 CalculateCheckSum8 (
4636 IN CONST UINT8 *Buffer,
4637 IN UINTN Length
4638 );
4639
4640
4641 /**
4642 Returns the sum of all elements in a buffer of 16-bit values. During
4643 calculation, the carry bits are dropped.
4644
4645 This function calculates the sum of the 16-bit values in the buffer
4646 specified by Buffer and Length. The carry bits in result of addition are dropped.
4647 The 16-bit result is returned. If Length is 0, then 0 is returned.
4648
4649 If Buffer is NULL, then ASSERT().
4650 If Buffer is not aligned on a 16-bit boundary, then ASSERT().
4651 If Length is not aligned on a 16-bit boundary, then ASSERT().
4652 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4653
4654 @param Buffer The pointer to the buffer to carry out the sum operation.
4655 @param Length The size, in bytes, of Buffer.
4656
4657 @return Sum The sum of Buffer with carry bits dropped during additions.
4658
4659 **/
4660 UINT16
4661 EFIAPI
4662 CalculateSum16 (
4663 IN CONST UINT16 *Buffer,
4664 IN UINTN Length
4665 );
4666
4667
4668 /**
4669 Returns the two's complement checksum of all elements in a buffer of
4670 16-bit values.
4671
4672 This function first calculates the sum of the 16-bit values in the buffer
4673 specified by Buffer and Length. The carry bits in the result of addition
4674 are dropped. Then, the two's complement of the sum is returned. If Length
4675 is 0, then 0 is returned.
4676
4677 If Buffer is NULL, then ASSERT().
4678 If Buffer is not aligned on a 16-bit boundary, then ASSERT().
4679 If Length is not aligned on a 16-bit boundary, then ASSERT().
4680 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4681
4682 @param Buffer The pointer to the buffer to carry out the checksum operation.
4683 @param Length The size, in bytes, of Buffer.
4684
4685 @return Checksum The two's complement checksum of Buffer.
4686
4687 **/
4688 UINT16
4689 EFIAPI
4690 CalculateCheckSum16 (
4691 IN CONST UINT16 *Buffer,
4692 IN UINTN Length
4693 );
4694
4695
4696 /**
4697 Returns the sum of all elements in a buffer of 32-bit values. During
4698 calculation, the carry bits are dropped.
4699
4700 This function calculates the sum of the 32-bit values in the buffer
4701 specified by Buffer and Length. The carry bits in result of addition are dropped.
4702 The 32-bit result is returned. If Length is 0, then 0 is returned.
4703
4704 If Buffer is NULL, then ASSERT().
4705 If Buffer is not aligned on a 32-bit boundary, then ASSERT().
4706 If Length is not aligned on a 32-bit boundary, then ASSERT().
4707 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4708
4709 @param Buffer The pointer to the buffer to carry out the sum operation.
4710 @param Length The size, in bytes, of Buffer.
4711
4712 @return Sum The sum of Buffer with carry bits dropped during additions.
4713
4714 **/
4715 UINT32
4716 EFIAPI
4717 CalculateSum32 (
4718 IN CONST UINT32 *Buffer,
4719 IN UINTN Length
4720 );
4721
4722
4723 /**
4724 Returns the two's complement checksum of all elements in a buffer of
4725 32-bit values.
4726
4727 This function first calculates the sum of the 32-bit values in the buffer
4728 specified by Buffer and Length. The carry bits in the result of addition
4729 are dropped. Then, the two's complement of the sum is returned. If Length
4730 is 0, then 0 is returned.
4731
4732 If Buffer is NULL, then ASSERT().
4733 If Buffer is not aligned on a 32-bit boundary, then ASSERT().
4734 If Length is not aligned on a 32-bit boundary, then ASSERT().
4735 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4736
4737 @param Buffer The pointer to the buffer to carry out the checksum operation.
4738 @param Length The size, in bytes, of Buffer.
4739
4740 @return Checksum The two's complement checksum of Buffer.
4741
4742 **/
4743 UINT32
4744 EFIAPI
4745 CalculateCheckSum32 (
4746 IN CONST UINT32 *Buffer,
4747 IN UINTN Length
4748 );
4749
4750
4751 /**
4752 Returns the sum of all elements in a buffer of 64-bit values. During
4753 calculation, the carry bits are dropped.
4754
4755 This function calculates the sum of the 64-bit values in the buffer
4756 specified by Buffer and Length. The carry bits in result of addition are dropped.
4757 The 64-bit result is returned. If Length is 0, then 0 is returned.
4758
4759 If Buffer is NULL, then ASSERT().
4760 If Buffer is not aligned on a 64-bit boundary, then ASSERT().
4761 If Length is not aligned on a 64-bit boundary, then ASSERT().
4762 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4763
4764 @param Buffer The pointer to the buffer to carry out the sum operation.
4765 @param Length The size, in bytes, of Buffer.
4766
4767 @return Sum The sum of Buffer with carry bits dropped during additions.
4768
4769 **/
4770 UINT64
4771 EFIAPI
4772 CalculateSum64 (
4773 IN CONST UINT64 *Buffer,
4774 IN UINTN Length
4775 );
4776
4777
4778 /**
4779 Returns the two's complement checksum of all elements in a buffer of
4780 64-bit values.
4781
4782 This function first calculates the sum of the 64-bit values in the buffer
4783 specified by Buffer and Length. The carry bits in the result of addition
4784 are dropped. Then, the two's complement of the sum is returned. If Length
4785 is 0, then 0 is returned.
4786
4787 If Buffer is NULL, then ASSERT().
4788 If Buffer is not aligned on a 64-bit boundary, then ASSERT().
4789 If Length is not aligned on a 64-bit boundary, then ASSERT().
4790 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
4791
4792 @param Buffer The pointer to the buffer to carry out the checksum operation.
4793 @param Length The size, in bytes, of Buffer.
4794
4795 @return Checksum The two's complement checksum of Buffer.
4796
4797 **/
4798 UINT64
4799 EFIAPI
4800 CalculateCheckSum64 (
4801 IN CONST UINT64 *Buffer,
4802 IN UINTN Length
4803 );
4804
4805
4806 //
4807 // Base Library CPU Functions
4808 //
4809
4810 /**
4811 Function entry point used when a stack switch is requested with SwitchStack()
4812
4813 @param Context1 Context1 parameter passed into SwitchStack().
4814 @param Context2 Context2 parameter passed into SwitchStack().
4815
4816 **/
4817 typedef
4818 VOID
4819 (EFIAPI *SWITCH_STACK_ENTRY_POINT)(
4820 IN VOID *Context1, OPTIONAL
4821 IN VOID *Context2 OPTIONAL
4822 );
4823
4824
4825 /**
4826 Used to serialize load and store operations.
4827
4828 All loads and stores that proceed calls to this function are guaranteed to be
4829 globally visible when this function returns.
4830
4831 **/
4832 VOID
4833 EFIAPI
4834 MemoryFence (
4835 VOID
4836 );
4837
4838
4839 /**
4840 Saves the current CPU context that can be restored with a call to LongJump()
4841 and returns 0.
4842
4843 Saves the current CPU context in the buffer specified by JumpBuffer and
4844 returns 0. The initial call to SetJump() must always return 0. Subsequent
4845 calls to LongJump() cause a non-zero value to be returned by SetJump().
4846
4847 If JumpBuffer is NULL, then ASSERT().
4848 For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
4849
4850 NOTE: The structure BASE_LIBRARY_JUMP_BUFFER is CPU architecture specific.
4851 The same structure must never be used for more than one CPU architecture context.
4852 For example, a BASE_LIBRARY_JUMP_BUFFER allocated by an IA-32 module must never be used from an x64 module.
4853 SetJump()/LongJump() is not currently supported for the EBC processor type.
4854
4855 @param JumpBuffer A pointer to CPU context buffer.
4856
4857 @retval 0 Indicates a return from SetJump().
4858
4859 **/
4860 UINTN
4861 EFIAPI
4862 SetJump (
4863 OUT BASE_LIBRARY_JUMP_BUFFER *JumpBuffer
4864 );
4865
4866
4867 /**
4868 Restores the CPU context that was saved with SetJump().
4869
4870 Restores the CPU context from the buffer specified by JumpBuffer. This
4871 function never returns to the caller. Instead is resumes execution based on
4872 the state of JumpBuffer.
4873
4874 If JumpBuffer is NULL, then ASSERT().
4875 For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
4876 If Value is 0, then ASSERT().
4877
4878 @param JumpBuffer A pointer to CPU context buffer.
4879 @param Value The value to return when the SetJump() context is
4880 restored and must be non-zero.
4881
4882 **/
4883 VOID
4884 EFIAPI
4885 LongJump (
4886 IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
4887 IN UINTN Value
4888 );
4889
4890
4891 /**
4892 Enables CPU interrupts.
4893
4894 **/
4895 VOID
4896 EFIAPI
4897 EnableInterrupts (
4898 VOID
4899 );
4900
4901
4902 /**
4903 Disables CPU interrupts.
4904
4905 **/
4906 VOID
4907 EFIAPI
4908 DisableInterrupts (
4909 VOID
4910 );
4911
4912
4913 /**
4914 Disables CPU interrupts and returns the interrupt state prior to the disable
4915 operation.
4916
4917 @retval TRUE CPU interrupts were enabled on entry to this call.
4918 @retval FALSE CPU interrupts were disabled on entry to this call.
4919
4920 **/
4921 BOOLEAN
4922 EFIAPI
4923 SaveAndDisableInterrupts (
4924 VOID
4925 );
4926
4927
4928 /**
4929 Enables CPU interrupts for the smallest window required to capture any
4930 pending interrupts.
4931
4932 **/
4933 VOID
4934 EFIAPI
4935 EnableDisableInterrupts (
4936 VOID
4937 );
4938
4939
4940 /**
4941 Retrieves the current CPU interrupt state.
4942
4943 Returns TRUE if interrupts are currently enabled. Otherwise
4944 returns FALSE.
4945
4946 @retval TRUE CPU interrupts are enabled.
4947 @retval FALSE CPU interrupts are disabled.
4948
4949 **/
4950 BOOLEAN
4951 EFIAPI
4952 GetInterruptState (
4953 VOID
4954 );
4955
4956
4957 /**
4958 Set the current CPU interrupt state.
4959
4960 Sets the current CPU interrupt state to the state specified by
4961 InterruptState. If InterruptState is TRUE, then interrupts are enabled. If
4962 InterruptState is FALSE, then interrupts are disabled. InterruptState is
4963 returned.
4964
4965 @param InterruptState TRUE if interrupts should enabled. FALSE if
4966 interrupts should be disabled.
4967
4968 @return InterruptState
4969
4970 **/
4971 BOOLEAN
4972 EFIAPI
4973 SetInterruptState (
4974 IN BOOLEAN InterruptState
4975 );
4976
4977
4978 /**
4979 Requests CPU to pause for a short period of time.
4980
4981 Requests CPU to pause for a short period of time. Typically used in MP
4982 systems to prevent memory starvation while waiting for a spin lock.
4983
4984 **/
4985 VOID
4986 EFIAPI
4987 CpuPause (
4988 VOID
4989 );
4990
4991
4992 /**
4993 Transfers control to a function starting with a new stack.
4994
4995 Transfers control to the function specified by EntryPoint using the
4996 new stack specified by NewStack and passing in the parameters specified
4997 by Context1 and Context2. Context1 and Context2 are optional and may
4998 be NULL. The function EntryPoint must never return. This function
4999 supports a variable number of arguments following the NewStack parameter.
5000 These additional arguments are ignored on IA-32, x64, and EBC architectures.
5001 Itanium processors expect one additional parameter of type VOID * that specifies
5002 the new backing store pointer.
5003
5004 If EntryPoint is NULL, then ASSERT().
5005 If NewStack is NULL, then ASSERT().
5006
5007 @param EntryPoint A pointer to function to call with the new stack.
5008 @param Context1 A pointer to the context to pass into the EntryPoint
5009 function.
5010 @param Context2 A pointer to the context to pass into the EntryPoint
5011 function.
5012 @param NewStack A pointer to the new stack to use for the EntryPoint
5013 function.
5014 @param ... This variable argument list is ignored for IA-32, x64, and
5015 EBC architectures. For Itanium processors, this variable
5016 argument list is expected to contain a single parameter of
5017 type VOID * that specifies the new backing store pointer.
5018
5019
5020 **/
5021 VOID
5022 EFIAPI
5023 SwitchStack (
5024 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
5025 IN VOID *Context1, OPTIONAL
5026 IN VOID *Context2, OPTIONAL
5027 IN VOID *NewStack,
5028 ...
5029 );
5030
5031
5032 /**
5033 Generates a breakpoint on the CPU.
5034
5035 Generates a breakpoint on the CPU. The breakpoint must be implemented such
5036 that code can resume normal execution after the breakpoint.
5037
5038 **/
5039 VOID
5040 EFIAPI
5041 CpuBreakpoint (
5042 VOID
5043 );
5044
5045
5046 /**
5047 Executes an infinite loop.
5048
5049 Forces the CPU to execute an infinite loop. A debugger may be used to skip
5050 past the loop and the code that follows the loop must execute properly. This
5051 implies that the infinite loop must not cause the code that follow it to be
5052 optimized away.
5053
5054 **/
5055 VOID
5056 EFIAPI
5057 CpuDeadLoop (
5058 VOID
5059 );
5060
5061 #if defined (MDE_CPU_IPF)
5062
5063 /**
5064 Flush a range of cache lines in the cache coherency domain of the calling
5065 CPU.
5066
5067 Flushes the cache lines specified by Address and Length. If Address is not aligned
5068 on a cache line boundary, then entire cache line containing Address is flushed.
5069 If Address + Length is not aligned on a cache line boundary, then the entire cache
5070 line containing Address + Length - 1 is flushed. This function may choose to flush
5071 the entire cache if that is more efficient than flushing the specified range. If
5072 Length is 0, the no cache lines are flushed. Address is returned.
5073 This function is only available on Itanium processors.
5074
5075 If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().
5076
5077 @param Address The base address of the instruction lines to invalidate. If
5078 the CPU is in a physical addressing mode, then Address is a
5079 physical address. If the CPU is in a virtual addressing mode,
5080 then Address is a virtual address.
5081
5082 @param Length The number of bytes to invalidate from the instruction cache.
5083
5084 @return Address.
5085
5086 **/
5087 VOID *
5088 EFIAPI
5089 AsmFlushCacheRange (
5090 IN VOID *Address,
5091 IN UINTN Length
5092 );
5093
5094
5095 /**
5096 Executes an FC instruction.
5097 Executes an FC instruction on the cache line specified by Address.
5098 The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
5099 An implementation may flush a larger region. This function is only available on Itanium processors.
5100
5101 @param Address The Address of cache line to be flushed.
5102
5103 @return The address of FC instruction executed.
5104
5105 **/
5106 UINT64
5107 EFIAPI
5108 AsmFc (
5109 IN UINT64 Address
5110 );
5111
5112
5113 /**
5114 Executes an FC.I instruction.
5115 Executes an FC.I instruction on the cache line specified by Address.
5116 The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
5117 An implementation may flush a larger region. This function is only available on Itanium processors.
5118
5119 @param Address The Address of cache line to be flushed.
5120
5121 @return The address of the FC.I instruction executed.
5122
5123 **/
5124 UINT64
5125 EFIAPI
5126 AsmFci (
5127 IN UINT64 Address
5128 );
5129
5130
5131 /**
5132 Reads the current value of a Processor Identifier Register (CPUID).
5133
5134 Reads and returns the current value of Processor Identifier Register specified by Index.
5135 The Index of largest implemented CPUID (One less than the number of implemented CPUID
5136 registers) is determined by CPUID [3] bits {7:0}.
5137 No parameter checking is performed on Index. If the Index value is beyond the
5138 implemented CPUID register range, a Reserved Register/Field fault may occur. The caller
5139 must either guarantee that Index is valid, or the caller must set up fault handlers to
5140 catch the faults. This function is only available on Itanium processors.
5141
5142 @param Index The 8-bit Processor Identifier Register index to read.
5143
5144 @return The current value of Processor Identifier Register specified by Index.
5145
5146 **/
5147 UINT64
5148 EFIAPI
5149 AsmReadCpuid (
5150 IN UINT8 Index
5151 );
5152
5153
5154 /**
5155 Reads the current value of 64-bit Processor Status Register (PSR).
5156 This function is only available on Itanium processors.
5157
5158 @return The current value of PSR.
5159
5160 **/
5161 UINT64
5162 EFIAPI
5163 AsmReadPsr (
5164 VOID
5165 );
5166
5167
5168 /**
5169 Writes the current value of 64-bit Processor Status Register (PSR).
5170
5171 No parameter checking is performed on Value. All bits of Value corresponding to
5172 reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.
5173 The caller must either guarantee that Value is valid, or the caller must set up
5174 fault handlers to catch the faults. This function is only available on Itanium processors.
5175
5176 @param Value The 64-bit value to write to PSR.
5177
5178 @return The 64-bit value written to the PSR.
5179
5180 **/
5181 UINT64
5182 EFIAPI
5183 AsmWritePsr (
5184 IN UINT64 Value
5185 );
5186
5187
5188 /**
5189 Reads the current value of 64-bit Kernel Register #0 (KR0).
5190
5191 Reads and returns the current value of KR0.
5192 This function is only available on Itanium processors.
5193
5194 @return The current value of KR0.
5195
5196 **/
5197 UINT64
5198 EFIAPI
5199 AsmReadKr0 (
5200 VOID
5201 );
5202
5203
5204 /**
5205 Reads the current value of 64-bit Kernel Register #1 (KR1).
5206
5207 Reads and returns the current value of KR1.
5208 This function is only available on Itanium processors.
5209
5210 @return The current value of KR1.
5211
5212 **/
5213 UINT64
5214 EFIAPI
5215 AsmReadKr1 (
5216 VOID
5217 );
5218
5219
5220 /**
5221 Reads the current value of 64-bit Kernel Register #2 (KR2).
5222
5223 Reads and returns the current value of KR2.
5224 This function is only available on Itanium processors.
5225
5226 @return The current value of KR2.
5227
5228 **/
5229 UINT64
5230 EFIAPI
5231 AsmReadKr2 (
5232 VOID
5233 );
5234
5235
5236 /**
5237 Reads the current value of 64-bit Kernel Register #3 (KR3).
5238
5239 Reads and returns the current value of KR3.
5240 This function is only available on Itanium processors.
5241
5242 @return The current value of KR3.
5243
5244 **/
5245 UINT64
5246 EFIAPI
5247 AsmReadKr3 (
5248 VOID
5249 );
5250
5251
5252 /**
5253 Reads the current value of 64-bit Kernel Register #4 (KR4).
5254
5255 Reads and returns the current value of KR4.
5256 This function is only available on Itanium processors.
5257
5258 @return The current value of KR4.
5259
5260 **/
5261 UINT64
5262 EFIAPI
5263 AsmReadKr4 (
5264 VOID
5265 );
5266
5267
5268 /**
5269 Reads the current value of 64-bit Kernel Register #5 (KR5).
5270
5271 Reads and returns the current value of KR5.
5272 This function is only available on Itanium processors.
5273
5274 @return The current value of KR5.
5275
5276 **/
5277 UINT64
5278 EFIAPI
5279 AsmReadKr5 (
5280 VOID
5281 );
5282
5283
5284 /**
5285 Reads the current value of 64-bit Kernel Register #6 (KR6).
5286
5287 Reads and returns the current value of KR6.
5288 This function is only available on Itanium processors.
5289
5290 @return The current value of KR6.
5291
5292 **/
5293 UINT64
5294 EFIAPI
5295 AsmReadKr6 (
5296 VOID
5297 );
5298
5299
5300 /**
5301 Reads the current value of 64-bit Kernel Register #7 (KR7).
5302
5303 Reads and returns the current value of KR7.
5304 This function is only available on Itanium processors.
5305
5306 @return The current value of KR7.
5307
5308 **/
5309 UINT64
5310 EFIAPI
5311 AsmReadKr7 (
5312 VOID
5313 );
5314
5315
5316 /**
5317 Write the current value of 64-bit Kernel Register #0 (KR0).
5318
5319 Writes the current value of KR0. The 64-bit value written to
5320 the KR0 is returned. This function is only available on Itanium processors.
5321
5322 @param Value The 64-bit value to write to KR0.
5323
5324 @return The 64-bit value written to the KR0.
5325
5326 **/
5327 UINT64
5328 EFIAPI
5329 AsmWriteKr0 (
5330 IN UINT64 Value
5331 );
5332
5333
5334 /**
5335 Write the current value of 64-bit Kernel Register #1 (KR1).
5336
5337 Writes the current value of KR1. The 64-bit value written to
5338 the KR1 is returned. This function is only available on Itanium processors.
5339
5340 @param Value The 64-bit value to write to KR1.
5341
5342 @return The 64-bit value written to the KR1.
5343
5344 **/
5345 UINT64
5346 EFIAPI
5347 AsmWriteKr1 (
5348 IN UINT64 Value
5349 );
5350
5351
5352 /**
5353 Write the current value of 64-bit Kernel Register #2 (KR2).
5354
5355 Writes the current value of KR2. The 64-bit value written to
5356 the KR2 is returned. This function is only available on Itanium processors.
5357
5358 @param Value The 64-bit value to write to KR2.
5359
5360 @return The 64-bit value written to the KR2.
5361
5362 **/
5363 UINT64
5364 EFIAPI
5365 AsmWriteKr2 (
5366 IN UINT64 Value
5367 );
5368
5369
5370 /**
5371 Write the current value of 64-bit Kernel Register #3 (KR3).
5372
5373 Writes the current value of KR3. The 64-bit value written to
5374 the KR3 is returned. This function is only available on Itanium processors.
5375
5376 @param Value The 64-bit value to write to KR3.
5377
5378 @return The 64-bit value written to the KR3.
5379
5380 **/
5381 UINT64
5382 EFIAPI
5383 AsmWriteKr3 (
5384 IN UINT64 Value
5385 );
5386
5387
5388 /**
5389 Write the current value of 64-bit Kernel Register #4 (KR4).
5390
5391 Writes the current value of KR4. The 64-bit value written to
5392 the KR4 is returned. This function is only available on Itanium processors.
5393
5394 @param Value The 64-bit value to write to KR4.
5395
5396 @return The 64-bit value written to the KR4.
5397
5398 **/
5399 UINT64
5400 EFIAPI
5401 AsmWriteKr4 (
5402 IN UINT64 Value
5403 );
5404
5405
5406 /**
5407 Write the current value of 64-bit Kernel Register #5 (KR5).
5408
5409 Writes the current value of KR5. The 64-bit value written to
5410 the KR5 is returned. This function is only available on Itanium processors.
5411
5412 @param Value The 64-bit value to write to KR5.
5413
5414 @return The 64-bit value written to the KR5.
5415
5416 **/
5417 UINT64
5418 EFIAPI
5419 AsmWriteKr5 (
5420 IN UINT64 Value
5421 );
5422
5423
5424 /**
5425 Write the current value of 64-bit Kernel Register #6 (KR6).
5426
5427 Writes the current value of KR6. The 64-bit value written to
5428 the KR6 is returned. This function is only available on Itanium processors.
5429
5430 @param Value The 64-bit value to write to KR6.
5431
5432 @return The 64-bit value written to the KR6.
5433
5434 **/
5435 UINT64
5436 EFIAPI
5437 AsmWriteKr6 (
5438 IN UINT64 Value
5439 );
5440
5441
5442 /**
5443 Write the current value of 64-bit Kernel Register #7 (KR7).
5444
5445 Writes the current value of KR7. The 64-bit value written to
5446 the KR7 is returned. This function is only available on Itanium processors.
5447
5448 @param Value The 64-bit value to write to KR7.
5449
5450 @return The 64-bit value written to the KR7.
5451
5452 **/
5453 UINT64
5454 EFIAPI
5455 AsmWriteKr7 (
5456 IN UINT64 Value
5457 );
5458
5459
5460 /**
5461 Reads the current value of Interval Timer Counter Register (ITC).
5462
5463 Reads and returns the current value of ITC.
5464 This function is only available on Itanium processors.
5465
5466 @return The current value of ITC.
5467
5468 **/
5469 UINT64
5470 EFIAPI
5471 AsmReadItc (
5472 VOID
5473 );
5474
5475
5476 /**
5477 Reads the current value of Interval Timer Vector Register (ITV).
5478
5479 Reads and returns the current value of ITV.
5480 This function is only available on Itanium processors.
5481
5482 @return The current value of ITV.
5483
5484 **/
5485 UINT64
5486 EFIAPI
5487 AsmReadItv (
5488 VOID
5489 );
5490
5491
5492 /**
5493 Reads the current value of Interval Timer Match Register (ITM).
5494
5495 Reads and returns the current value of ITM.
5496 This function is only available on Itanium processors.
5497
5498 @return The current value of ITM.
5499 **/
5500 UINT64
5501 EFIAPI
5502 AsmReadItm (
5503 VOID
5504 );
5505
5506
5507 /**
5508 Writes the current value of 64-bit Interval Timer Counter Register (ITC).
5509
5510 Writes the current value of ITC. The 64-bit value written to the ITC is returned.
5511 This function is only available on Itanium processors.
5512
5513 @param Value The 64-bit value to write to ITC.
5514
5515 @return The 64-bit value written to the ITC.
5516
5517 **/
5518 UINT64
5519 EFIAPI
5520 AsmWriteItc (
5521 IN UINT64 Value
5522 );
5523
5524
5525 /**
5526 Writes the current value of 64-bit Interval Timer Match Register (ITM).
5527
5528 Writes the current value of ITM. The 64-bit value written to the ITM is returned.
5529 This function is only available on Itanium processors.
5530
5531 @param Value The 64-bit value to write to ITM.
5532
5533 @return The 64-bit value written to the ITM.
5534
5535 **/
5536 UINT64
5537 EFIAPI
5538 AsmWriteItm (
5539 IN UINT64 Value
5540 );
5541
5542
5543 /**
5544 Writes the current value of 64-bit Interval Timer Vector Register (ITV).
5545
5546 Writes the current value of ITV. The 64-bit value written to the ITV is returned.
5547 No parameter checking is performed on Value. All bits of Value corresponding to
5548 reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.
5549 The caller must either guarantee that Value is valid, or the caller must set up
5550 fault handlers to catch the faults.
5551 This function is only available on Itanium processors.
5552
5553 @param Value The 64-bit value to write to ITV.
5554
5555 @return The 64-bit value written to the ITV.
5556
5557 **/
5558 UINT64
5559 EFIAPI
5560 AsmWriteItv (
5561 IN UINT64 Value
5562 );
5563
5564
5565 /**
5566 Reads the current value of Default Control Register (DCR).
5567
5568 Reads and returns the current value of DCR. This function is only available on Itanium processors.
5569
5570 @return The current value of DCR.
5571
5572 **/
5573 UINT64
5574 EFIAPI
5575 AsmReadDcr (
5576 VOID
5577 );
5578
5579
5580 /**
5581 Reads the current value of Interruption Vector Address Register (IVA).
5582
5583 Reads and returns the current value of IVA. This function is only available on Itanium processors.
5584
5585 @return The current value of IVA.
5586 **/
5587 UINT64
5588 EFIAPI
5589 AsmReadIva (
5590 VOID
5591 );
5592
5593
5594 /**
5595 Reads the current value of Page Table Address Register (PTA).
5596
5597 Reads and returns the current value of PTA. This function is only available on Itanium processors.
5598
5599 @return The current value of PTA.
5600
5601 **/
5602 UINT64
5603 EFIAPI
5604 AsmReadPta (
5605 VOID
5606 );
5607
5608
5609 /**
5610 Writes the current value of 64-bit Default Control Register (DCR).
5611
5612 Writes the current value of DCR. The 64-bit value written to the DCR is returned.
5613 No parameter checking is performed on Value. All bits of Value corresponding to
5614 reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
5615 The caller must either guarantee that Value is valid, or the caller must set up
5616 fault handlers to catch the faults.
5617 This function is only available on Itanium processors.
5618
5619 @param Value The 64-bit value to write to DCR.
5620
5621 @return The 64-bit value written to the DCR.
5622
5623 **/
5624 UINT64
5625 EFIAPI
5626 AsmWriteDcr (
5627 IN UINT64 Value
5628 );
5629
5630
5631 /**
5632 Writes the current value of 64-bit Interruption Vector Address Register (IVA).
5633
5634 Writes the current value of IVA. The 64-bit value written to the IVA is returned.
5635 The size of vector table is 32 K bytes and is 32 K bytes aligned
5636 the low 15 bits of Value is ignored when written.
5637 This function is only available on Itanium processors.
5638
5639 @param Value The 64-bit value to write to IVA.
5640
5641 @return The 64-bit value written to the IVA.
5642
5643 **/
5644 UINT64
5645 EFIAPI
5646 AsmWriteIva (
5647 IN UINT64 Value
5648 );
5649
5650
5651 /**
5652 Writes the current value of 64-bit Page Table Address Register (PTA).
5653
5654 Writes the current value of PTA. The 64-bit value written to the PTA is returned.
5655 No parameter checking is performed on Value. All bits of Value corresponding to
5656 reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
5657 The caller must either guarantee that Value is valid, or the caller must set up
5658 fault handlers to catch the faults.
5659 This function is only available on Itanium processors.
5660
5661 @param Value The 64-bit value to write to PTA.
5662
5663 @return The 64-bit value written to the PTA.
5664 **/
5665 UINT64
5666 EFIAPI
5667 AsmWritePta (
5668 IN UINT64 Value
5669 );
5670
5671
5672 /**
5673 Reads the current value of Local Interrupt ID Register (LID).
5674
5675 Reads and returns the current value of LID. This function is only available on Itanium processors.
5676
5677 @return The current value of LID.
5678
5679 **/
5680 UINT64
5681 EFIAPI
5682 AsmReadLid (
5683 VOID
5684 );
5685
5686
5687 /**
5688 Reads the current value of External Interrupt Vector Register (IVR).
5689
5690 Reads and returns the current value of IVR. This function is only available on Itanium processors.
5691
5692 @return The current value of IVR.
5693
5694 **/
5695 UINT64
5696 EFIAPI
5697 AsmReadIvr (
5698 VOID
5699 );
5700
5701
5702 /**
5703 Reads the current value of Task Priority Register (TPR).
5704
5705 Reads and returns the current value of TPR. This function is only available on Itanium processors.
5706
5707 @return The current value of TPR.
5708
5709 **/
5710 UINT64
5711 EFIAPI
5712 AsmReadTpr (
5713 VOID
5714 );
5715
5716
5717 /**
5718 Reads the current value of External Interrupt Request Register #0 (IRR0).
5719
5720 Reads and returns the current value of IRR0. This function is only available on Itanium processors.
5721
5722 @return The current value of IRR0.
5723
5724 **/
5725 UINT64
5726 EFIAPI
5727 AsmReadIrr0 (
5728 VOID
5729 );
5730
5731
5732 /**
5733 Reads the current value of External Interrupt Request Register #1 (IRR1).
5734
5735 Reads and returns the current value of IRR1. This function is only available on Itanium processors.
5736
5737 @return The current value of IRR1.
5738
5739 **/
5740 UINT64
5741 EFIAPI
5742 AsmReadIrr1 (
5743 VOID
5744 );
5745
5746
5747 /**
5748 Reads the current value of External Interrupt Request Register #2 (IRR2).
5749
5750 Reads and returns the current value of IRR2. This function is only available on Itanium processors.
5751
5752 @return The current value of IRR2.
5753
5754 **/
5755 UINT64
5756 EFIAPI
5757 AsmReadIrr2 (
5758 VOID
5759 );
5760
5761
5762 /**
5763 Reads the current value of External Interrupt Request Register #3 (IRR3).
5764
5765 Reads and returns the current value of IRR3. This function is only available on Itanium processors.
5766
5767 @return The current value of IRR3.
5768
5769 **/
5770 UINT64
5771 EFIAPI
5772 AsmReadIrr3 (
5773 VOID
5774 );
5775
5776
5777 /**
5778 Reads the current value of Performance Monitor Vector Register (PMV).
5779
5780 Reads and returns the current value of PMV. This function is only available on Itanium processors.
5781
5782 @return The current value of PMV.
5783
5784 **/
5785 UINT64
5786 EFIAPI
5787 AsmReadPmv (
5788 VOID
5789 );
5790
5791
5792 /**
5793 Reads the current value of Corrected Machine Check Vector Register (CMCV).
5794
5795 Reads and returns the current value of CMCV. This function is only available on Itanium processors.
5796
5797 @return The current value of CMCV.
5798
5799 **/
5800 UINT64
5801 EFIAPI
5802 AsmReadCmcv (
5803 VOID
5804 );
5805
5806
5807 /**
5808 Reads the current value of Local Redirection Register #0 (LRR0).
5809
5810 Reads and returns the current value of LRR0. This function is only available on Itanium processors.
5811
5812 @return The current value of LRR0.
5813
5814 **/
5815 UINT64
5816 EFIAPI
5817 AsmReadLrr0 (
5818 VOID
5819 );
5820
5821
5822 /**
5823 Reads the current value of Local Redirection Register #1 (LRR1).
5824
5825 Reads and returns the current value of LRR1. This function is only available on Itanium processors.
5826
5827 @return The current value of LRR1.
5828
5829 **/
5830 UINT64
5831 EFIAPI
5832 AsmReadLrr1 (
5833 VOID
5834 );
5835
5836
5837 /**
5838 Writes the current value of 64-bit Page Local Interrupt ID Register (LID).
5839
5840 Writes the current value of LID. The 64-bit value written to the LID is returned.
5841 No parameter checking is performed on Value. All bits of Value corresponding to
5842 reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.
5843 The caller must either guarantee that Value is valid, or the caller must set up
5844 fault handlers to catch the faults.
5845 This function is only available on Itanium processors.
5846
5847 @param Value The 64-bit value to write to LID.
5848
5849 @return The 64-bit value written to the LID.
5850
5851 **/
5852 UINT64
5853 EFIAPI
5854 AsmWriteLid (
5855 IN UINT64 Value
5856 );
5857
5858
5859 /**
5860 Writes the current value of 64-bit Task Priority Register (TPR).
5861
5862 Writes the current value of TPR. The 64-bit value written to the TPR is returned.
5863 No parameter checking is performed on Value. All bits of Value corresponding to
5864 reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.
5865 The caller must either guarantee that Value is valid, or the caller must set up
5866 fault handlers to catch the faults.
5867 This function is only available on Itanium processors.
5868
5869 @param Value The 64-bit value to write to TPR.
5870
5871 @return The 64-bit value written to the TPR.
5872
5873 **/
5874 UINT64
5875 EFIAPI
5876 AsmWriteTpr (
5877 IN UINT64 Value
5878 );
5879
5880
5881 /**
5882 Performs a write operation on End OF External Interrupt Register (EOI).
5883
5884 Writes a value of 0 to the EOI Register. This function is only available on Itanium processors.
5885
5886 **/
5887 VOID
5888 EFIAPI
5889 AsmWriteEoi (
5890 VOID
5891 );
5892
5893
5894 /**
5895 Writes the current value of 64-bit Performance Monitor Vector Register (PMV).
5896
5897 Writes the current value of PMV. The 64-bit value written to the PMV is returned.
5898 No parameter checking is performed on Value. All bits of Value corresponding
5899 to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.
5900 The caller must either guarantee that Value is valid, or the caller must set up
5901 fault handlers to catch the faults.
5902 This function is only available on Itanium processors.
5903
5904 @param Value The 64-bit value to write to PMV.
5905
5906 @return The 64-bit value written to the PMV.
5907
5908 **/
5909 UINT64
5910 EFIAPI
5911 AsmWritePmv (
5912 IN UINT64 Value
5913 );
5914
5915
5916 /**
5917 Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).
5918
5919 Writes the current value of CMCV. The 64-bit value written to the CMCV is returned.
5920 No parameter checking is performed on Value. All bits of Value corresponding
5921 to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.
5922 The caller must either guarantee that Value is valid, or the caller must set up
5923 fault handlers to catch the faults.
5924 This function is only available on Itanium processors.
5925
5926 @param Value The 64-bit value to write to CMCV.
5927
5928 @return The 64-bit value written to the CMCV.
5929
5930 **/
5931 UINT64
5932 EFIAPI
5933 AsmWriteCmcv (
5934 IN UINT64 Value
5935 );
5936
5937
5938 /**
5939 Writes the current value of 64-bit Local Redirection Register #0 (LRR0).
5940
5941 Writes the current value of LRR0. The 64-bit value written to the LRR0 is returned.
5942 No parameter checking is performed on Value. All bits of Value corresponding
5943 to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.
5944 The caller must either guarantee that Value is valid, or the caller must set up
5945 fault handlers to catch the faults.
5946 This function is only available on Itanium processors.
5947
5948 @param Value The 64-bit value to write to LRR0.
5949
5950 @return The 64-bit value written to the LRR0.
5951
5952 **/
5953 UINT64
5954 EFIAPI
5955 AsmWriteLrr0 (
5956 IN UINT64 Value
5957 );
5958
5959
5960 /**
5961 Writes the current value of 64-bit Local Redirection Register #1 (LRR1).
5962
5963 Writes the current value of LRR1. The 64-bit value written to the LRR1 is returned.
5964 No parameter checking is performed on Value. All bits of Value corresponding
5965 to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.
5966 The caller must either guarantee that Value is valid, or the caller must
5967 set up fault handlers to catch the faults.
5968 This function is only available on Itanium processors.
5969
5970 @param Value The 64-bit value to write to LRR1.
5971
5972 @return The 64-bit value written to the LRR1.
5973
5974 **/
5975 UINT64
5976 EFIAPI
5977 AsmWriteLrr1 (
5978 IN UINT64 Value
5979 );
5980
5981
5982 /**
5983 Reads the current value of Instruction Breakpoint Register (IBR).
5984
5985 The Instruction Breakpoint Registers are used in pairs. The even numbered
5986 registers contain breakpoint addresses, and the odd numbered registers contain
5987 breakpoint mask conditions. At least four instruction registers pairs are implemented
5988 on all processor models. Implemented registers are contiguous starting with
5989 register 0. No parameter checking is performed on Index, and if the Index value
5990 is beyond the implemented IBR register range, a Reserved Register/Field fault may
5991 occur. The caller must either guarantee that Index is valid, or the caller must
5992 set up fault handlers to catch the faults.
5993 This function is only available on Itanium processors.
5994
5995 @param Index The 8-bit Instruction Breakpoint Register index to read.
5996
5997 @return The current value of Instruction Breakpoint Register specified by Index.
5998
5999 **/
6000 UINT64
6001 EFIAPI
6002 AsmReadIbr (
6003 IN UINT8 Index
6004 );
6005
6006
6007 /**
6008 Reads the current value of Data Breakpoint Register (DBR).
6009
6010 The Data Breakpoint Registers are used in pairs. The even numbered registers
6011 contain breakpoint addresses, and odd numbered registers contain breakpoint
6012 mask conditions. At least four data registers pairs are implemented on all processor
6013 models. Implemented registers are contiguous starting with register 0.
6014 No parameter checking is performed on Index. If the Index value is beyond
6015 the implemented DBR register range, a Reserved Register/Field fault may occur.
6016 The caller must either guarantee that Index is valid, or the caller must set up
6017 fault handlers to catch the faults.
6018 This function is only available on Itanium processors.
6019
6020 @param Index The 8-bit Data Breakpoint Register index to read.
6021
6022 @return The current value of Data Breakpoint Register specified by Index.
6023
6024 **/
6025 UINT64
6026 EFIAPI
6027 AsmReadDbr (
6028 IN UINT8 Index
6029 );
6030
6031
6032 /**
6033 Reads the current value of Performance Monitor Configuration Register (PMC).
6034
6035 All processor implementations provide at least four performance counters
6036 (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow
6037 status registers (PMC [0]... PMC [3]). Processor implementations may provide
6038 additional implementation-dependent PMC and PMD to increase the number of
6039 'generic' performance counters (PMC/PMD pairs). The remainder of PMC and PMD
6040 register set is implementation dependent. No parameter checking is performed
6041 on Index. If the Index value is beyond the implemented PMC register range,
6042 zero value will be returned.
6043 This function is only available on Itanium processors.
6044
6045 @param Index The 8-bit Performance Monitor Configuration Register index to read.
6046
6047 @return The current value of Performance Monitor Configuration Register
6048 specified by Index.
6049
6050 **/
6051 UINT64
6052 EFIAPI
6053 AsmReadPmc (
6054 IN UINT8 Index
6055 );
6056
6057
6058 /**
6059 Reads the current value of Performance Monitor Data Register (PMD).
6060
6061 All processor implementations provide at least 4 performance counters
6062 (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter
6063 overflow status registers (PMC [0]... PMC [3]). Processor implementations may
6064 provide additional implementation-dependent PMC and PMD to increase the number
6065 of 'generic' performance counters (PMC/PMD pairs). The remainder of PMC and PMD
6066 register set is implementation dependent. No parameter checking is performed
6067 on Index. If the Index value is beyond the implemented PMD register range,
6068 zero value will be returned.
6069 This function is only available on Itanium processors.
6070
6071 @param Index The 8-bit Performance Monitor Data Register index to read.
6072
6073 @return The current value of Performance Monitor Data Register specified by Index.
6074
6075 **/
6076 UINT64
6077 EFIAPI
6078 AsmReadPmd (
6079 IN UINT8 Index
6080 );
6081
6082
6083 /**
6084 Writes the current value of 64-bit Instruction Breakpoint Register (IBR).
6085
6086 Writes current value of Instruction Breakpoint Register specified by Index.
6087 The Instruction Breakpoint Registers are used in pairs. The even numbered
6088 registers contain breakpoint addresses, and odd numbered registers contain
6089 breakpoint mask conditions. At least four instruction registers pairs are implemented
6090 on all processor models. Implemented registers are contiguous starting with
6091 register 0. No parameter checking is performed on Index. If the Index value
6092 is beyond the implemented IBR register range, a Reserved Register/Field fault may
6093 occur. The caller must either guarantee that Index is valid, or the caller must
6094 set up fault handlers to catch the faults.
6095 This function is only available on Itanium processors.
6096
6097 @param Index The 8-bit Instruction Breakpoint Register index to write.
6098 @param Value The 64-bit value to write to IBR.
6099
6100 @return The 64-bit value written to the IBR.
6101
6102 **/
6103 UINT64
6104 EFIAPI
6105 AsmWriteIbr (
6106 IN UINT8 Index,
6107 IN UINT64 Value
6108 );
6109
6110
6111 /**
6112 Writes the current value of 64-bit Data Breakpoint Register (DBR).
6113
6114 Writes current value of Data Breakpoint Register specified by Index.
6115 The Data Breakpoint Registers are used in pairs. The even numbered registers
6116 contain breakpoint addresses, and odd numbered registers contain breakpoint
6117 mask conditions. At least four data registers pairs are implemented on all processor
6118 models. Implemented registers are contiguous starting with register 0. No parameter
6119 checking is performed on Index. If the Index value is beyond the implemented
6120 DBR register range, a Reserved Register/Field fault may occur. The caller must
6121 either guarantee that Index is valid, or the caller must set up fault handlers to
6122 catch the faults.
6123 This function is only available on Itanium processors.
6124
6125 @param Index The 8-bit Data Breakpoint Register index to write.
6126 @param Value The 64-bit value to write to DBR.
6127
6128 @return The 64-bit value written to the DBR.
6129
6130 **/
6131 UINT64
6132 EFIAPI
6133 AsmWriteDbr (
6134 IN UINT8 Index,
6135 IN UINT64 Value
6136 );
6137
6138
6139 /**
6140 Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).
6141
6142 Writes current value of Performance Monitor Configuration Register specified by Index.
6143 All processor implementations provide at least four performance counters
6144 (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow status
6145 registers (PMC [0]... PMC [3]). Processor implementations may provide additional
6146 implementation-dependent PMC and PMD to increase the number of 'generic' performance
6147 counters (PMC/PMD pairs). The remainder of PMC and PMD register set is implementation
6148 dependent. No parameter checking is performed on Index. If the Index value is
6149 beyond the implemented PMC register range, the write is ignored.
6150 This function is only available on Itanium processors.
6151
6152 @param Index The 8-bit Performance Monitor Configuration Register index to write.
6153 @param Value The 64-bit value to write to PMC.
6154
6155 @return The 64-bit value written to the PMC.
6156
6157 **/
6158 UINT64
6159 EFIAPI
6160 AsmWritePmc (
6161 IN UINT8 Index,
6162 IN UINT64 Value
6163 );
6164
6165
6166 /**
6167 Writes the current value of 64-bit Performance Monitor Data Register (PMD).
6168
6169 Writes current value of Performance Monitor Data Register specified by Index.
6170 All processor implementations provide at least four performance counters
6171 (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow
6172 status registers (PMC [0]... PMC [3]). Processor implementations may provide
6173 additional implementation-dependent PMC and PMD to increase the number of 'generic'
6174 performance counters (PMC/PMD pairs). The remainder of PMC and PMD register set
6175 is implementation dependent. No parameter checking is performed on Index. If the
6176 Index value is beyond the implemented PMD register range, the write is ignored.
6177 This function is only available on Itanium processors.
6178
6179 @param Index The 8-bit Performance Monitor Data Register index to write.
6180 @param Value The 64-bit value to write to PMD.
6181
6182 @return The 64-bit value written to the PMD.
6183
6184 **/
6185 UINT64
6186 EFIAPI
6187 AsmWritePmd (
6188 IN UINT8 Index,
6189 IN UINT64 Value
6190 );
6191
6192
6193 /**
6194 Reads the current value of 64-bit Global Pointer (GP).
6195
6196 Reads and returns the current value of GP.
6197 This function is only available on Itanium processors.
6198
6199 @return The current value of GP.
6200
6201 **/
6202 UINT64
6203 EFIAPI
6204 AsmReadGp (
6205 VOID
6206 );
6207
6208
6209 /**
6210 Write the current value of 64-bit Global Pointer (GP).
6211
6212 Writes the current value of GP. The 64-bit value written to the GP is returned.
6213 No parameter checking is performed on Value.
6214 This function is only available on Itanium processors.
6215
6216 @param Value The 64-bit value to write to GP.
6217
6218 @return The 64-bit value written to the GP.
6219
6220 **/
6221 UINT64
6222 EFIAPI
6223 AsmWriteGp (
6224 IN UINT64 Value
6225 );
6226
6227
6228 /**
6229 Reads the current value of 64-bit Stack Pointer (SP).
6230
6231 Reads and returns the current value of SP.
6232 This function is only available on Itanium processors.
6233
6234 @return The current value of SP.
6235
6236 **/
6237 UINT64
6238 EFIAPI
6239 AsmReadSp (
6240 VOID
6241 );
6242
6243
6244 ///
6245 /// Valid Index value for AsmReadControlRegister().
6246 ///
6247 #define IPF_CONTROL_REGISTER_DCR 0
6248 #define IPF_CONTROL_REGISTER_ITM 1
6249 #define IPF_CONTROL_REGISTER_IVA 2
6250 #define IPF_CONTROL_REGISTER_PTA 8
6251 #define IPF_CONTROL_REGISTER_IPSR 16
6252 #define IPF_CONTROL_REGISTER_ISR 17
6253 #define IPF_CONTROL_REGISTER_IIP 19
6254 #define IPF_CONTROL_REGISTER_IFA 20
6255 #define IPF_CONTROL_REGISTER_ITIR 21
6256 #define IPF_CONTROL_REGISTER_IIPA 22
6257 #define IPF_CONTROL_REGISTER_IFS 23
6258 #define IPF_CONTROL_REGISTER_IIM 24
6259 #define IPF_CONTROL_REGISTER_IHA 25
6260 #define IPF_CONTROL_REGISTER_LID 64
6261 #define IPF_CONTROL_REGISTER_IVR 65
6262 #define IPF_CONTROL_REGISTER_TPR 66
6263 #define IPF_CONTROL_REGISTER_EOI 67
6264 #define IPF_CONTROL_REGISTER_IRR0 68
6265 #define IPF_CONTROL_REGISTER_IRR1 69
6266 #define IPF_CONTROL_REGISTER_IRR2 70
6267 #define IPF_CONTROL_REGISTER_IRR3 71
6268 #define IPF_CONTROL_REGISTER_ITV 72
6269 #define IPF_CONTROL_REGISTER_PMV 73
6270 #define IPF_CONTROL_REGISTER_CMCV 74
6271 #define IPF_CONTROL_REGISTER_LRR0 80
6272 #define IPF_CONTROL_REGISTER_LRR1 81
6273
6274 /**
6275 Reads a 64-bit control register.
6276
6277 Reads and returns the control register specified by Index. The valid Index valued
6278 are defined above in "Related Definitions".
6279 If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only
6280 available on Itanium processors.
6281
6282 @param Index The index of the control register to read.
6283
6284 @return The control register specified by Index.
6285
6286 **/
6287 UINT64
6288 EFIAPI
6289 AsmReadControlRegister (
6290 IN UINT64 Index
6291 );
6292
6293
6294 ///
6295 /// Valid Index value for AsmReadApplicationRegister().
6296 ///
6297 #define IPF_APPLICATION_REGISTER_K0 0
6298 #define IPF_APPLICATION_REGISTER_K1 1
6299 #define IPF_APPLICATION_REGISTER_K2 2
6300 #define IPF_APPLICATION_REGISTER_K3 3
6301 #define IPF_APPLICATION_REGISTER_K4 4
6302 #define IPF_APPLICATION_REGISTER_K5 5
6303 #define IPF_APPLICATION_REGISTER_K6 6
6304 #define IPF_APPLICATION_REGISTER_K7 7
6305 #define IPF_APPLICATION_REGISTER_RSC 16
6306 #define IPF_APPLICATION_REGISTER_BSP 17
6307 #define IPF_APPLICATION_REGISTER_BSPSTORE 18
6308 #define IPF_APPLICATION_REGISTER_RNAT 19
6309 #define IPF_APPLICATION_REGISTER_FCR 21
6310 #define IPF_APPLICATION_REGISTER_EFLAG 24
6311 #define IPF_APPLICATION_REGISTER_CSD 25
6312 #define IPF_APPLICATION_REGISTER_SSD 26
6313 #define IPF_APPLICATION_REGISTER_CFLG 27
6314 #define IPF_APPLICATION_REGISTER_FSR 28
6315 #define IPF_APPLICATION_REGISTER_FIR 29
6316 #define IPF_APPLICATION_REGISTER_FDR 30
6317 #define IPF_APPLICATION_REGISTER_CCV 32
6318 #define IPF_APPLICATION_REGISTER_UNAT 36
6319 #define IPF_APPLICATION_REGISTER_FPSR 40
6320 #define IPF_APPLICATION_REGISTER_ITC 44
6321 #define IPF_APPLICATION_REGISTER_PFS 64
6322 #define IPF_APPLICATION_REGISTER_LC 65
6323 #define IPF_APPLICATION_REGISTER_EC 66
6324
6325 /**
6326 Reads a 64-bit application register.
6327
6328 Reads and returns the application register specified by Index. The valid Index
6329 valued are defined above in "Related Definitions".
6330 If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only
6331 available on Itanium processors.
6332
6333 @param Index The index of the application register to read.
6334
6335 @return The application register specified by Index.
6336
6337 **/
6338 UINT64
6339 EFIAPI
6340 AsmReadApplicationRegister (
6341 IN UINT64 Index
6342 );
6343
6344
6345 /**
6346 Reads the current value of a Machine Specific Register (MSR).
6347
6348 Reads and returns the current value of the Machine Specific Register specified by Index. No
6349 parameter checking is performed on Index, and if the Index value is beyond the implemented MSR
6350 register range, a Reserved Register/Field fault may occur. The caller must either guarantee that
6351 Index is valid, or the caller must set up fault handlers to catch the faults. This function is
6352 only available on Itanium processors.
6353
6354 @param Index The 8-bit Machine Specific Register index to read.
6355
6356 @return The current value of the Machine Specific Register specified by Index.
6357
6358 **/
6359 UINT64
6360 EFIAPI
6361 AsmReadMsr (
6362 IN UINT8 Index
6363 );
6364
6365
6366 /**
6367 Writes the current value of a Machine Specific Register (MSR).
6368
6369 Writes Value to the Machine Specific Register specified by Index. Value is returned. No
6370 parameter checking is performed on Index, and if the Index value is beyond the implemented MSR
6371 register range, a Reserved Register/Field fault may occur. The caller must either guarantee that
6372 Index is valid, or the caller must set up fault handlers to catch the faults. This function is
6373 only available on Itanium processors.
6374
6375 @param Index The 8-bit Machine Specific Register index to write.
6376 @param Value The 64-bit value to write to the Machine Specific Register.
6377
6378 @return The 64-bit value to write to the Machine Specific Register.
6379
6380 **/
6381 UINT64
6382 EFIAPI
6383 AsmWriteMsr (
6384 IN UINT8 Index,
6385 IN UINT64 Value
6386 );
6387
6388
6389 /**
6390 Determines if the CPU is currently executing in virtual, physical, or mixed mode.
6391
6392 Determines the current execution mode of the CPU.
6393 If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
6394 If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
6395 If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
6396 and -1 is returned.
6397 This function is only available on Itanium processors.
6398
6399 @retval 1 The CPU is in virtual mode.
6400 @retval 0 The CPU is in physical mode.
6401 @retval -1 The CPU is in mixed mode.
6402
6403 **/
6404 INT64
6405 EFIAPI
6406 AsmCpuVirtual (
6407 VOID
6408 );
6409
6410
6411 /**
6412 Makes a PAL procedure call.
6413
6414 This is a wrapper function to make a PAL procedure call. Based on the Index
6415 value this API will make static or stacked PAL call. The following table
6416 describes the usage of PAL Procedure Index Assignment. Architected procedures
6417 may be designated as required or optional. If a PAL procedure is specified
6418 as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
6419 Status field of the PAL_CALL_RETURN structure.
6420 This indicates that the procedure is not present in this PAL implementation.
6421 It is the caller's responsibility to check for this return code after calling
6422 any optional PAL procedure.
6423 No parameter checking is performed on the 5 input parameters, but there are
6424 some common rules that the caller should follow when making a PAL call. Any
6425 address passed to PAL as buffers for return parameters must be 8-byte aligned.
6426 Unaligned addresses may cause undefined results. For those parameters defined
6427 as reserved or some fields defined as reserved must be zero filled or the invalid
6428 argument return value may be returned or undefined result may occur during the
6429 execution of the procedure. If the PalEntryPoint does not point to a valid
6430 PAL entry point then the system behavior is undefined. This function is only
6431 available on Itanium processors.
6432
6433 @param PalEntryPoint The PAL procedure calls entry point.
6434 @param Index The PAL procedure Index number.
6435 @param Arg2 The 2nd parameter for PAL procedure calls.
6436 @param Arg3 The 3rd parameter for PAL procedure calls.
6437 @param Arg4 The 4th parameter for PAL procedure calls.
6438
6439 @return structure returned from the PAL Call procedure, including the status and return value.
6440
6441 **/
6442 PAL_CALL_RETURN
6443 EFIAPI
6444 AsmPalCall (
6445 IN UINT64 PalEntryPoint,
6446 IN UINT64 Index,
6447 IN UINT64 Arg2,
6448 IN UINT64 Arg3,
6449 IN UINT64 Arg4
6450 );
6451 #endif
6452
6453 #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
6454 ///
6455 /// IA32 and x64 Specific Functions.
6456 /// Byte packed structure for 16-bit Real Mode EFLAGS.
6457 ///
6458 typedef union {
6459 struct {
6460 UINT32 CF:1; ///< Carry Flag.
6461 UINT32 Reserved_0:1; ///< Reserved.
6462 UINT32 PF:1; ///< Parity Flag.
6463 UINT32 Reserved_1:1; ///< Reserved.
6464 UINT32 AF:1; ///< Auxiliary Carry Flag.
6465 UINT32 Reserved_2:1; ///< Reserved.
6466 UINT32 ZF:1; ///< Zero Flag.
6467 UINT32 SF:1; ///< Sign Flag.
6468 UINT32 TF:1; ///< Trap Flag.
6469 UINT32 IF:1; ///< Interrupt Enable Flag.
6470 UINT32 DF:1; ///< Direction Flag.
6471 UINT32 OF:1; ///< Overflow Flag.
6472 UINT32 IOPL:2; ///< I/O Privilege Level.
6473 UINT32 NT:1; ///< Nested Task.
6474 UINT32 Reserved_3:1; ///< Reserved.
6475 } Bits;
6476 UINT16 Uint16;
6477 } IA32_FLAGS16;
6478
6479 ///
6480 /// Byte packed structure for EFLAGS/RFLAGS.
6481 /// 32-bits on IA-32.
6482 /// 64-bits on x64. The upper 32-bits on x64 are reserved.
6483 ///
6484 typedef union {
6485 struct {
6486 UINT32 CF:1; ///< Carry Flag.
6487 UINT32 Reserved_0:1; ///< Reserved.
6488 UINT32 PF:1; ///< Parity Flag.
6489 UINT32 Reserved_1:1; ///< Reserved.
6490 UINT32 AF:1; ///< Auxiliary Carry Flag.
6491 UINT32 Reserved_2:1; ///< Reserved.
6492 UINT32 ZF:1; ///< Zero Flag.
6493 UINT32 SF:1; ///< Sign Flag.
6494 UINT32 TF:1; ///< Trap Flag.
6495 UINT32 IF:1; ///< Interrupt Enable Flag.
6496 UINT32 DF:1; ///< Direction Flag.
6497 UINT32 OF:1; ///< Overflow Flag.
6498 UINT32 IOPL:2; ///< I/O Privilege Level.
6499 UINT32 NT:1; ///< Nested Task.
6500 UINT32 Reserved_3:1; ///< Reserved.
6501 UINT32 RF:1; ///< Resume Flag.
6502 UINT32 VM:1; ///< Virtual 8086 Mode.
6503 UINT32 AC:1; ///< Alignment Check.
6504 UINT32 VIF:1; ///< Virtual Interrupt Flag.
6505 UINT32 VIP:1; ///< Virtual Interrupt Pending.
6506 UINT32 ID:1; ///< ID Flag.
6507 UINT32 Reserved_4:10; ///< Reserved.
6508 } Bits;
6509 UINTN UintN;
6510 } IA32_EFLAGS32;
6511
6512 ///
6513 /// Byte packed structure for Control Register 0 (CR0).
6514 /// 32-bits on IA-32.
6515 /// 64-bits on x64. The upper 32-bits on x64 are reserved.
6516 ///
6517 typedef union {
6518 struct {
6519 UINT32 PE:1; ///< Protection Enable.
6520 UINT32 MP:1; ///< Monitor Coprocessor.
6521 UINT32 EM:1; ///< Emulation.
6522 UINT32 TS:1; ///< Task Switched.
6523 UINT32 ET:1; ///< Extension Type.
6524 UINT32 NE:1; ///< Numeric Error.
6525 UINT32 Reserved_0:10; ///< Reserved.
6526 UINT32 WP:1; ///< Write Protect.
6527 UINT32 Reserved_1:1; ///< Reserved.
6528 UINT32 AM:1; ///< Alignment Mask.
6529 UINT32 Reserved_2:10; ///< Reserved.
6530 UINT32 NW:1; ///< Mot Write-through.
6531 UINT32 CD:1; ///< Cache Disable.
6532 UINT32 PG:1; ///< Paging.
6533 } Bits;
6534 UINTN UintN;
6535 } IA32_CR0;
6536
6537 ///
6538 /// Byte packed structure for Control Register 4 (CR4).
6539 /// 32-bits on IA-32.
6540 /// 64-bits on x64. The upper 32-bits on x64 are reserved.
6541 ///
6542 typedef union {
6543 struct {
6544 UINT32 VME:1; ///< Virtual-8086 Mode Extensions.
6545 UINT32 PVI:1; ///< Protected-Mode Virtual Interrupts.
6546 UINT32 TSD:1; ///< Time Stamp Disable.
6547 UINT32 DE:1; ///< Debugging Extensions.
6548 UINT32 PSE:1; ///< Page Size Extensions.
6549 UINT32 PAE:1; ///< Physical Address Extension.
6550 UINT32 MCE:1; ///< Machine Check Enable.
6551 UINT32 PGE:1; ///< Page Global Enable.
6552 UINT32 PCE:1; ///< Performance Monitoring Counter
6553 ///< Enable.
6554 UINT32 OSFXSR:1; ///< Operating System Support for
6555 ///< FXSAVE and FXRSTOR instructions
6556 UINT32 OSXMMEXCPT:1; ///< Operating System Support for
6557 ///< Unmasked SIMD Floating Point
6558 ///< Exceptions.
6559 UINT32 Reserved_0:2; ///< Reserved.
6560 UINT32 VMXE:1; ///< VMX Enable
6561 UINT32 Reserved_1:18; ///< Reserved.
6562 } Bits;
6563 UINTN UintN;
6564 } IA32_CR4;
6565
6566 ///
6567 /// Byte packed structure for a segment descriptor in a GDT/LDT.
6568 ///
6569 typedef union {
6570 struct {
6571 UINT32 LimitLow:16;
6572 UINT32 BaseLow:16;
6573 UINT32 BaseMid:8;
6574 UINT32 Type:4;
6575 UINT32 S:1;
6576 UINT32 DPL:2;
6577 UINT32 P:1;
6578 UINT32 LimitHigh:4;
6579 UINT32 AVL:1;
6580 UINT32 L:1;
6581 UINT32 DB:1;
6582 UINT32 G:1;
6583 UINT32 BaseHigh:8;
6584 } Bits;
6585 UINT64 Uint64;
6586 } IA32_SEGMENT_DESCRIPTOR;
6587
6588 ///
6589 /// Byte packed structure for an IDTR, GDTR, LDTR descriptor.
6590 ///
6591 #pragma pack (1)
6592 typedef struct {
6593 UINT16 Limit;
6594 UINTN Base;
6595 } IA32_DESCRIPTOR;
6596 #pragma pack ()
6597
6598 #define IA32_IDT_GATE_TYPE_TASK 0x85
6599 #define IA32_IDT_GATE_TYPE_INTERRUPT_16 0x86
6600 #define IA32_IDT_GATE_TYPE_TRAP_16 0x87
6601 #define IA32_IDT_GATE_TYPE_INTERRUPT_32 0x8E
6602 #define IA32_IDT_GATE_TYPE_TRAP_32 0x8F
6603
6604
6605 #if defined (MDE_CPU_IA32)
6606 ///
6607 /// Byte packed structure for an IA-32 Interrupt Gate Descriptor.
6608 ///
6609 typedef union {
6610 struct {
6611 UINT32 OffsetLow:16; ///< Offset bits 15..0.
6612 UINT32 Selector:16; ///< Selector.
6613 UINT32 Reserved_0:8; ///< Reserved.
6614 UINT32 GateType:8; ///< Gate Type. See #defines above.
6615 UINT32 OffsetHigh:16; ///< Offset bits 31..16.
6616 } Bits;
6617 UINT64 Uint64;
6618 } IA32_IDT_GATE_DESCRIPTOR;
6619
6620 #endif
6621
6622 #if defined (MDE_CPU_X64)
6623 ///
6624 /// Byte packed structure for an x64 Interrupt Gate Descriptor.
6625 ///
6626 typedef union {
6627 struct {
6628 UINT32 OffsetLow:16; ///< Offset bits 15..0.
6629 UINT32 Selector:16; ///< Selector.
6630 UINT32 Reserved_0:8; ///< Reserved.
6631 UINT32 GateType:8; ///< Gate Type. See #defines above.
6632 UINT32 OffsetHigh:16; ///< Offset bits 31..16.
6633 UINT32 OffsetUpper:32; ///< Offset bits 63..32.
6634 UINT32 Reserved_1:32; ///< Reserved.
6635 } Bits;
6636 struct {
6637 UINT64 Uint64;
6638 UINT64 Uint64_1;
6639 } Uint128;
6640 } IA32_IDT_GATE_DESCRIPTOR;
6641
6642 #endif
6643
6644 ///
6645 /// Byte packed structure for an FP/SSE/SSE2 context.
6646 ///
6647 typedef struct {
6648 UINT8 Buffer[512];
6649 } IA32_FX_BUFFER;
6650
6651 ///
6652 /// Structures for the 16-bit real mode thunks.
6653 ///
6654 typedef struct {
6655 UINT32 Reserved1;
6656 UINT32 Reserved2;
6657 UINT32 Reserved3;
6658 UINT32 Reserved4;
6659 UINT8 BL;
6660 UINT8 BH;
6661 UINT16 Reserved5;
6662 UINT8 DL;
6663 UINT8 DH;
6664 UINT16 Reserved6;
6665 UINT8 CL;
6666 UINT8 CH;
6667 UINT16 Reserved7;
6668 UINT8 AL;
6669 UINT8 AH;
6670 UINT16 Reserved8;
6671 } IA32_BYTE_REGS;
6672
6673 typedef struct {
6674 UINT16 DI;
6675 UINT16 Reserved1;
6676 UINT16 SI;
6677 UINT16 Reserved2;
6678 UINT16 BP;
6679 UINT16 Reserved3;
6680 UINT16 SP;
6681 UINT16 Reserved4;
6682 UINT16 BX;
6683 UINT16 Reserved5;
6684 UINT16 DX;
6685 UINT16 Reserved6;
6686 UINT16 CX;
6687 UINT16 Reserved7;
6688 UINT16 AX;
6689 UINT16 Reserved8;
6690 } IA32_WORD_REGS;
6691
6692 typedef struct {
6693 UINT32 EDI;
6694 UINT32 ESI;
6695 UINT32 EBP;
6696 UINT32 ESP;
6697 UINT32 EBX;
6698 UINT32 EDX;
6699 UINT32 ECX;
6700 UINT32 EAX;
6701 UINT16 DS;
6702 UINT16 ES;
6703 UINT16 FS;
6704 UINT16 GS;
6705 IA32_EFLAGS32 EFLAGS;
6706 UINT32 Eip;
6707 UINT16 CS;
6708 UINT16 SS;
6709 } IA32_DWORD_REGS;
6710
6711 typedef union {
6712 IA32_DWORD_REGS E;
6713 IA32_WORD_REGS X;
6714 IA32_BYTE_REGS H;
6715 } IA32_REGISTER_SET;
6716
6717 ///
6718 /// Byte packed structure for an 16-bit real mode thunks.
6719 ///
6720 typedef struct {
6721 IA32_REGISTER_SET *RealModeState;
6722 VOID *RealModeBuffer;
6723 UINT32 RealModeBufferSize;
6724 UINT32 ThunkAttributes;
6725 } THUNK_CONTEXT;
6726
6727 #define THUNK_ATTRIBUTE_BIG_REAL_MODE 0x00000001
6728 #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 0x00000002
6729 #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004
6730
6731 /**
6732 Retrieves CPUID information.
6733
6734 Executes the CPUID instruction with EAX set to the value specified by Index.
6735 This function always returns Index.
6736 If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
6737 If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
6738 If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
6739 If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
6740 This function is only available on IA-32 and x64.
6741
6742 @param Index The 32-bit value to load into EAX prior to invoking the CPUID
6743 instruction.
6744 @param Eax The pointer to the 32-bit EAX value returned by the CPUID
6745 instruction. This is an optional parameter that may be NULL.
6746 @param Ebx The pointer to the 32-bit EBX value returned by the CPUID
6747 instruction. This is an optional parameter that may be NULL.
6748 @param Ecx The pointer to the 32-bit ECX value returned by the CPUID
6749 instruction. This is an optional parameter that may be NULL.
6750 @param Edx The pointer to the 32-bit EDX value returned by the CPUID
6751 instruction. This is an optional parameter that may be NULL.
6752
6753 @return Index.
6754
6755 **/
6756 UINT32
6757 EFIAPI
6758 AsmCpuid (
6759 IN UINT32 Index,
6760 OUT UINT32 *Eax, OPTIONAL
6761 OUT UINT32 *Ebx, OPTIONAL
6762 OUT UINT32 *Ecx, OPTIONAL
6763 OUT UINT32 *Edx OPTIONAL
6764 );
6765
6766
6767 /**
6768 Retrieves CPUID information using an extended leaf identifier.
6769
6770 Executes the CPUID instruction with EAX set to the value specified by Index
6771 and ECX set to the value specified by SubIndex. This function always returns
6772 Index. This function is only available on IA-32 and x64.
6773
6774 If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
6775 If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
6776 If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
6777 If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
6778
6779 @param Index The 32-bit value to load into EAX prior to invoking the
6780 CPUID instruction.
6781 @param SubIndex The 32-bit value to load into ECX prior to invoking the
6782 CPUID instruction.
6783 @param Eax The pointer to the 32-bit EAX value returned by the CPUID
6784 instruction. This is an optional parameter that may be
6785 NULL.
6786 @param Ebx The pointer to the 32-bit EBX value returned by the CPUID
6787 instruction. This is an optional parameter that may be
6788 NULL.
6789 @param Ecx The pointer to the 32-bit ECX value returned by the CPUID
6790 instruction. This is an optional parameter that may be
6791 NULL.
6792 @param Edx The pointer to the 32-bit EDX value returned by the CPUID
6793 instruction. This is an optional parameter that may be
6794 NULL.
6795
6796 @return Index.
6797
6798 **/
6799 UINT32
6800 EFIAPI
6801 AsmCpuidEx (
6802 IN UINT32 Index,
6803 IN UINT32 SubIndex,
6804 OUT UINT32 *Eax, OPTIONAL
6805 OUT UINT32 *Ebx, OPTIONAL
6806 OUT UINT32 *Ecx, OPTIONAL
6807 OUT UINT32 *Edx OPTIONAL
6808 );
6809
6810
6811 /**
6812 Set CD bit and clear NW bit of CR0 followed by a WBINVD.
6813
6814 Disables the caches by setting the CD bit of CR0 to 1, clearing the NW bit of CR0 to 0,
6815 and executing a WBINVD instruction. This function is only available on IA-32 and x64.
6816
6817 **/
6818 VOID
6819 EFIAPI
6820 AsmDisableCache (
6821 VOID
6822 );
6823
6824
6825 /**
6826 Perform a WBINVD and clear both the CD and NW bits of CR0.
6827
6828 Enables the caches by executing a WBINVD instruction and then clear both the CD and NW
6829 bits of CR0 to 0. This function is only available on IA-32 and x64.
6830
6831 **/
6832 VOID
6833 EFIAPI
6834 AsmEnableCache (
6835 VOID
6836 );
6837
6838
6839 /**
6840 Returns the lower 32-bits of a Machine Specific Register(MSR).
6841
6842 Reads and returns the lower 32-bits of the MSR specified by Index.
6843 No parameter checking is performed on Index, and some Index values may cause
6844 CPU exceptions. The caller must either guarantee that Index is valid, or the
6845 caller must set up exception handlers to catch the exceptions. This function
6846 is only available on IA-32 and x64.
6847
6848 @param Index The 32-bit MSR index to read.
6849
6850 @return The lower 32 bits of the MSR identified by Index.
6851
6852 **/
6853 UINT32
6854 EFIAPI
6855 AsmReadMsr32 (
6856 IN UINT32 Index
6857 );
6858
6859
6860 /**
6861 Writes a 32-bit value to a Machine Specific Register(MSR), and returns the value.
6862 The upper 32-bits of the MSR are set to zero.
6863
6864 Writes the 32-bit value specified by Value to the MSR specified by Index. The
6865 upper 32-bits of the MSR write are set to zero. The 32-bit value written to
6866 the MSR is returned. No parameter checking is performed on Index or Value,
6867 and some of these may cause CPU exceptions. The caller must either guarantee
6868 that Index and Value are valid, or the caller must establish proper exception
6869 handlers. This function is only available on IA-32 and x64.
6870
6871 @param Index The 32-bit MSR index to write.
6872 @param Value The 32-bit value to write to the MSR.
6873
6874 @return Value
6875
6876 **/
6877 UINT32
6878 EFIAPI
6879 AsmWriteMsr32 (
6880 IN UINT32 Index,
6881 IN UINT32 Value
6882 );
6883
6884
6885 /**
6886 Reads a 64-bit MSR, performs a bitwise OR on the lower 32-bits, and
6887 writes the result back to the 64-bit MSR.
6888
6889 Reads the 64-bit MSR specified by Index, performs a bitwise OR
6890 between the lower 32-bits of the read result and the value specified by
6891 OrData, and writes the result to the 64-bit MSR specified by Index. The lower
6892 32-bits of the value written to the MSR is returned. No parameter checking is
6893 performed on Index or OrData, and some of these may cause CPU exceptions. The
6894 caller must either guarantee that Index and OrData are valid, or the caller
6895 must establish proper exception handlers. This function is only available on
6896 IA-32 and x64.
6897
6898 @param Index The 32-bit MSR index to write.
6899 @param OrData The value to OR with the read value from the MSR.
6900
6901 @return The lower 32-bit value written to the MSR.
6902
6903 **/
6904 UINT32
6905 EFIAPI
6906 AsmMsrOr32 (
6907 IN UINT32 Index,
6908 IN UINT32 OrData
6909 );
6910
6911
6912 /**
6913 Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
6914 the result back to the 64-bit MSR.
6915
6916 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
6917 lower 32-bits of the read result and the value specified by AndData, and
6918 writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
6919 the value written to the MSR is returned. No parameter checking is performed
6920 on Index or AndData, and some of these may cause CPU exceptions. The caller
6921 must either guarantee that Index and AndData are valid, or the caller must
6922 establish proper exception handlers. This function is only available on IA-32
6923 and x64.
6924
6925 @param Index The 32-bit MSR index to write.
6926 @param AndData The value to AND with the read value from the MSR.
6927
6928 @return The lower 32-bit value written to the MSR.
6929
6930 **/
6931 UINT32
6932 EFIAPI
6933 AsmMsrAnd32 (
6934 IN UINT32 Index,
6935 IN UINT32 AndData
6936 );
6937
6938
6939 /**
6940 Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise OR
6941 on the lower 32-bits, and writes the result back to the 64-bit MSR.
6942
6943 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
6944 lower 32-bits of the read result and the value specified by AndData
6945 preserving the upper 32-bits, performs a bitwise OR between the
6946 result of the AND operation and the value specified by OrData, and writes the
6947 result to the 64-bit MSR specified by Address. The lower 32-bits of the value
6948 written to the MSR is returned. No parameter checking is performed on Index,
6949 AndData, or OrData, and some of these may cause CPU exceptions. The caller
6950 must either guarantee that Index, AndData, and OrData are valid, or the
6951 caller must establish proper exception handlers. This function is only
6952 available on IA-32 and x64.
6953
6954 @param Index The 32-bit MSR index to write.
6955 @param AndData The value to AND with the read value from the MSR.
6956 @param OrData The value to OR with the result of the AND operation.
6957
6958 @return The lower 32-bit value written to the MSR.
6959
6960 **/
6961 UINT32
6962 EFIAPI
6963 AsmMsrAndThenOr32 (
6964 IN UINT32 Index,
6965 IN UINT32 AndData,
6966 IN UINT32 OrData
6967 );
6968
6969
6970 /**
6971 Reads a bit field of an MSR.
6972
6973 Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
6974 specified by the StartBit and the EndBit. The value of the bit field is
6975 returned. The caller must either guarantee that Index is valid, or the caller
6976 must set up exception handlers to catch the exceptions. This function is only
6977 available on IA-32 and x64.
6978
6979 If StartBit is greater than 31, then ASSERT().
6980 If EndBit is greater than 31, then ASSERT().
6981 If EndBit is less than StartBit, then ASSERT().
6982
6983 @param Index The 32-bit MSR index to read.
6984 @param StartBit The ordinal of the least significant bit in the bit field.
6985 Range 0..31.
6986 @param EndBit The ordinal of the most significant bit in the bit field.
6987 Range 0..31.
6988
6989 @return The bit field read from the MSR.
6990
6991 **/
6992 UINT32
6993 EFIAPI
6994 AsmMsrBitFieldRead32 (
6995 IN UINT32 Index,
6996 IN UINTN StartBit,
6997 IN UINTN EndBit
6998 );
6999
7000
7001 /**
7002 Writes a bit field to an MSR.
7003
7004 Writes Value to a bit field in the lower 32-bits of a 64-bit MSR. The bit
7005 field is specified by the StartBit and the EndBit. All other bits in the
7006 destination MSR are preserved. The lower 32-bits of the MSR written is
7007 returned. The caller must either guarantee that Index and the data written
7008 is valid, or the caller must set up exception handlers to catch the exceptions.
7009 This function is only available on IA-32 and x64.
7010
7011 If StartBit is greater than 31, then ASSERT().
7012 If EndBit is greater than 31, then ASSERT().
7013 If EndBit is less than StartBit, then ASSERT().
7014 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7015
7016 @param Index The 32-bit MSR index to write.
7017 @param StartBit The ordinal of the least significant bit in the bit field.
7018 Range 0..31.
7019 @param EndBit The ordinal of the most significant bit in the bit field.
7020 Range 0..31.
7021 @param Value New value of the bit field.
7022
7023 @return The lower 32-bit of the value written to the MSR.
7024
7025 **/
7026 UINT32
7027 EFIAPI
7028 AsmMsrBitFieldWrite32 (
7029 IN UINT32 Index,
7030 IN UINTN StartBit,
7031 IN UINTN EndBit,
7032 IN UINT32 Value
7033 );
7034
7035
7036 /**
7037 Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
7038 result back to the bit field in the 64-bit MSR.
7039
7040 Reads the 64-bit MSR specified by Index, performs a bitwise OR
7041 between the read result and the value specified by OrData, and writes the
7042 result to the 64-bit MSR specified by Index. The lower 32-bits of the value
7043 written to the MSR are returned. Extra left bits in OrData are stripped. The
7044 caller must either guarantee that Index and the data written is valid, or
7045 the caller must set up exception handlers to catch the exceptions. This
7046 function is only available on IA-32 and x64.
7047
7048 If StartBit is greater than 31, then ASSERT().
7049 If EndBit is greater than 31, then ASSERT().
7050 If EndBit is less than StartBit, then ASSERT().
7051 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7052
7053 @param Index The 32-bit MSR index to write.
7054 @param StartBit The ordinal of the least significant bit in the bit field.
7055 Range 0..31.
7056 @param EndBit The ordinal of the most significant bit in the bit field.
7057 Range 0..31.
7058 @param OrData The value to OR with the read value from the MSR.
7059
7060 @return The lower 32-bit of the value written to the MSR.
7061
7062 **/
7063 UINT32
7064 EFIAPI
7065 AsmMsrBitFieldOr32 (
7066 IN UINT32 Index,
7067 IN UINTN StartBit,
7068 IN UINTN EndBit,
7069 IN UINT32 OrData
7070 );
7071
7072
7073 /**
7074 Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
7075 result back to the bit field in the 64-bit MSR.
7076
7077 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
7078 read result and the value specified by AndData, and writes the result to the
7079 64-bit MSR specified by Index. The lower 32-bits of the value written to the
7080 MSR are returned. Extra left bits in AndData are stripped. The caller must
7081 either guarantee that Index and the data written is valid, or the caller must
7082 set up exception handlers to catch the exceptions. This function is only
7083 available on IA-32 and x64.
7084
7085 If StartBit is greater than 31, then ASSERT().
7086 If EndBit is greater than 31, then ASSERT().
7087 If EndBit is less than StartBit, then ASSERT().
7088 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7089
7090 @param Index The 32-bit MSR index to write.
7091 @param StartBit The ordinal of the least significant bit in the bit field.
7092 Range 0..31.
7093 @param EndBit The ordinal of the most significant bit in the bit field.
7094 Range 0..31.
7095 @param AndData The value to AND with the read value from the MSR.
7096
7097 @return The lower 32-bit of the value written to the MSR.
7098
7099 **/
7100 UINT32
7101 EFIAPI
7102 AsmMsrBitFieldAnd32 (
7103 IN UINT32 Index,
7104 IN UINTN StartBit,
7105 IN UINTN EndBit,
7106 IN UINT32 AndData
7107 );
7108
7109
7110 /**
7111 Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
7112 bitwise OR, and writes the result back to the bit field in the
7113 64-bit MSR.
7114
7115 Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
7116 bitwise OR between the read result and the value specified by
7117 AndData, and writes the result to the 64-bit MSR specified by Index. The
7118 lower 32-bits of the value written to the MSR are returned. Extra left bits
7119 in both AndData and OrData are stripped. The caller must either guarantee
7120 that Index and the data written is valid, or the caller must set up exception
7121 handlers to catch the exceptions. This function is only available on IA-32
7122 and x64.
7123
7124 If StartBit is greater than 31, then ASSERT().
7125 If EndBit is greater than 31, then ASSERT().
7126 If EndBit is less than StartBit, then ASSERT().
7127 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7128 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7129
7130 @param Index The 32-bit MSR index to write.
7131 @param StartBit The ordinal of the least significant bit in the bit field.
7132 Range 0..31.
7133 @param EndBit The ordinal of the most significant bit in the bit field.
7134 Range 0..31.
7135 @param AndData The value to AND with the read value from the MSR.
7136 @param OrData The value to OR with the result of the AND operation.
7137
7138 @return The lower 32-bit of the value written to the MSR.
7139
7140 **/
7141 UINT32
7142 EFIAPI
7143 AsmMsrBitFieldAndThenOr32 (
7144 IN UINT32 Index,
7145 IN UINTN StartBit,
7146 IN UINTN EndBit,
7147 IN UINT32 AndData,
7148 IN UINT32 OrData
7149 );
7150
7151
7152 /**
7153 Returns a 64-bit Machine Specific Register(MSR).
7154
7155 Reads and returns the 64-bit MSR specified by Index. No parameter checking is
7156 performed on Index, and some Index values may cause CPU exceptions. The
7157 caller must either guarantee that Index is valid, or the caller must set up
7158 exception handlers to catch the exceptions. This function is only available
7159 on IA-32 and x64.
7160
7161 @param Index The 32-bit MSR index to read.
7162
7163 @return The value of the MSR identified by Index.
7164
7165 **/
7166 UINT64
7167 EFIAPI
7168 AsmReadMsr64 (
7169 IN UINT32 Index
7170 );
7171
7172
7173 /**
7174 Writes a 64-bit value to a Machine Specific Register(MSR), and returns the
7175 value.
7176
7177 Writes the 64-bit value specified by Value to the MSR specified by Index. The
7178 64-bit value written to the MSR is returned. No parameter checking is
7179 performed on Index or Value, and some of these may cause CPU exceptions. The
7180 caller must either guarantee that Index and Value are valid, or the caller
7181 must establish proper exception handlers. This function is only available on
7182 IA-32 and x64.
7183
7184 @param Index The 32-bit MSR index to write.
7185 @param Value The 64-bit value to write to the MSR.
7186
7187 @return Value
7188
7189 **/
7190 UINT64
7191 EFIAPI
7192 AsmWriteMsr64 (
7193 IN UINT32 Index,
7194 IN UINT64 Value
7195 );
7196
7197
7198 /**
7199 Reads a 64-bit MSR, performs a bitwise OR, and writes the result
7200 back to the 64-bit MSR.
7201
7202 Reads the 64-bit MSR specified by Index, performs a bitwise OR
7203 between the read result and the value specified by OrData, and writes the
7204 result to the 64-bit MSR specified by Index. The value written to the MSR is
7205 returned. No parameter checking is performed on Index or OrData, and some of
7206 these may cause CPU exceptions. The caller must either guarantee that Index
7207 and OrData are valid, or the caller must establish proper exception handlers.
7208 This function is only available on IA-32 and x64.
7209
7210 @param Index The 32-bit MSR index to write.
7211 @param OrData The value to OR with the read value from the MSR.
7212
7213 @return The value written back to the MSR.
7214
7215 **/
7216 UINT64
7217 EFIAPI
7218 AsmMsrOr64 (
7219 IN UINT32 Index,
7220 IN UINT64 OrData
7221 );
7222
7223
7224 /**
7225 Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
7226 64-bit MSR.
7227
7228 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
7229 read result and the value specified by OrData, and writes the result to the
7230 64-bit MSR specified by Index. The value written to the MSR is returned. No
7231 parameter checking is performed on Index or OrData, and some of these may
7232 cause CPU exceptions. The caller must either guarantee that Index and OrData
7233 are valid, or the caller must establish proper exception handlers. This
7234 function is only available on IA-32 and x64.
7235
7236 @param Index The 32-bit MSR index to write.
7237 @param AndData The value to AND with the read value from the MSR.
7238
7239 @return The value written back to the MSR.
7240
7241 **/
7242 UINT64
7243 EFIAPI
7244 AsmMsrAnd64 (
7245 IN UINT32 Index,
7246 IN UINT64 AndData
7247 );
7248
7249
7250 /**
7251 Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise
7252 OR, and writes the result back to the 64-bit MSR.
7253
7254 Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
7255 result and the value specified by AndData, performs a bitwise OR
7256 between the result of the AND operation and the value specified by OrData,
7257 and writes the result to the 64-bit MSR specified by Index. The value written
7258 to the MSR is returned. No parameter checking is performed on Index, AndData,
7259 or OrData, and some of these may cause CPU exceptions. The caller must either
7260 guarantee that Index, AndData, and OrData are valid, or the caller must
7261 establish proper exception handlers. This function is only available on IA-32
7262 and x64.
7263
7264 @param Index The 32-bit MSR index to write.
7265 @param AndData The value to AND with the read value from the MSR.
7266 @param OrData The value to OR with the result of the AND operation.
7267
7268 @return The value written back to the MSR.
7269
7270 **/
7271 UINT64
7272 EFIAPI
7273 AsmMsrAndThenOr64 (
7274 IN UINT32 Index,
7275 IN UINT64 AndData,
7276 IN UINT64 OrData
7277 );
7278
7279
7280 /**
7281 Reads a bit field of an MSR.
7282
7283 Reads the bit field in the 64-bit MSR. The bit field is specified by the
7284 StartBit and the EndBit. The value of the bit field is returned. The caller
7285 must either guarantee that Index is valid, or the caller must set up
7286 exception handlers to catch the exceptions. This function is only available
7287 on IA-32 and x64.
7288
7289 If StartBit is greater than 63, then ASSERT().
7290 If EndBit is greater than 63, then ASSERT().
7291 If EndBit is less than StartBit, then ASSERT().
7292
7293 @param Index The 32-bit MSR index to read.
7294 @param StartBit The ordinal of the least significant bit in the bit field.
7295 Range 0..63.
7296 @param EndBit The ordinal of the most significant bit in the bit field.
7297 Range 0..63.
7298
7299 @return The value read from the MSR.
7300
7301 **/
7302 UINT64
7303 EFIAPI
7304 AsmMsrBitFieldRead64 (
7305 IN UINT32 Index,
7306 IN UINTN StartBit,
7307 IN UINTN EndBit
7308 );
7309
7310
7311 /**
7312 Writes a bit field to an MSR.
7313
7314 Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
7315 the StartBit and the EndBit. All other bits in the destination MSR are
7316 preserved. The MSR written is returned. The caller must either guarantee
7317 that Index and the data written is valid, or the caller must set up exception
7318 handlers to catch the exceptions. This function is only available on IA-32 and x64.
7319
7320 If StartBit is greater than 63, then ASSERT().
7321 If EndBit is greater than 63, then ASSERT().
7322 If EndBit is less than StartBit, then ASSERT().
7323 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7324
7325 @param Index The 32-bit MSR index to write.
7326 @param StartBit The ordinal of the least significant bit in the bit field.
7327 Range 0..63.
7328 @param EndBit The ordinal of the most significant bit in the bit field.
7329 Range 0..63.
7330 @param Value New value of the bit field.
7331
7332 @return The value written back to the MSR.
7333
7334 **/
7335 UINT64
7336 EFIAPI
7337 AsmMsrBitFieldWrite64 (
7338 IN UINT32 Index,
7339 IN UINTN StartBit,
7340 IN UINTN EndBit,
7341 IN UINT64 Value
7342 );
7343
7344
7345 /**
7346 Reads a bit field in a 64-bit MSR, performs a bitwise OR, and
7347 writes the result back to the bit field in the 64-bit MSR.
7348
7349 Reads the 64-bit MSR specified by Index, performs a bitwise OR
7350 between the read result and the value specified by OrData, and writes the
7351 result to the 64-bit MSR specified by Index. The value written to the MSR is
7352 returned. Extra left bits in OrData are stripped. The caller must either
7353 guarantee that Index and the data written is valid, or the caller must set up
7354 exception handlers to catch the exceptions. This function is only available
7355 on IA-32 and x64.
7356
7357 If StartBit is greater than 63, then ASSERT().
7358 If EndBit is greater than 63, then ASSERT().
7359 If EndBit is less than StartBit, then ASSERT().
7360 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7361
7362 @param Index The 32-bit MSR index to write.
7363 @param StartBit The ordinal of the least significant bit in the bit field.
7364 Range 0..63.
7365 @param EndBit The ordinal of the most significant bit in the bit field.
7366 Range 0..63.
7367 @param OrData The value to OR with the read value from the bit field.
7368
7369 @return The value written back to the MSR.
7370
7371 **/
7372 UINT64
7373 EFIAPI
7374 AsmMsrBitFieldOr64 (
7375 IN UINT32 Index,
7376 IN UINTN StartBit,
7377 IN UINTN EndBit,
7378 IN UINT64 OrData
7379 );
7380
7381
7382 /**
7383 Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
7384 result back to the bit field in the 64-bit MSR.
7385
7386 Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
7387 read result and the value specified by AndData, and writes the result to the
7388 64-bit MSR specified by Index. The value written to the MSR is returned.
7389 Extra left bits in AndData are stripped. The caller must either guarantee
7390 that Index and the data written is valid, or the caller must set up exception
7391 handlers to catch the exceptions. This function is only available on IA-32
7392 and x64.
7393
7394 If StartBit is greater than 63, then ASSERT().
7395 If EndBit is greater than 63, then ASSERT().
7396 If EndBit is less than StartBit, then ASSERT().
7397 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7398
7399 @param Index The 32-bit MSR index to write.
7400 @param StartBit The ordinal of the least significant bit in the bit field.
7401 Range 0..63.
7402 @param EndBit The ordinal of the most significant bit in the bit field.
7403 Range 0..63.
7404 @param AndData The value to AND with the read value from the bit field.
7405
7406 @return The value written back to the MSR.
7407
7408 **/
7409 UINT64
7410 EFIAPI
7411 AsmMsrBitFieldAnd64 (
7412 IN UINT32 Index,
7413 IN UINTN StartBit,
7414 IN UINTN EndBit,
7415 IN UINT64 AndData
7416 );
7417
7418
7419 /**
7420 Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
7421 bitwise OR, and writes the result back to the bit field in the
7422 64-bit MSR.
7423
7424 Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
7425 a bitwise OR between the read result and the value specified by
7426 AndData, and writes the result to the 64-bit MSR specified by Index. The
7427 value written to the MSR is returned. Extra left bits in both AndData and
7428 OrData are stripped. The caller must either guarantee that Index and the data
7429 written is valid, or the caller must set up exception handlers to catch the
7430 exceptions. This function is only available on IA-32 and x64.
7431
7432 If StartBit is greater than 63, then ASSERT().
7433 If EndBit is greater than 63, then ASSERT().
7434 If EndBit is less than StartBit, then ASSERT().
7435 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7436 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
7437
7438 @param Index The 32-bit MSR index to write.
7439 @param StartBit The ordinal of the least significant bit in the bit field.
7440 Range 0..63.
7441 @param EndBit The ordinal of the most significant bit in the bit field.
7442 Range 0..63.
7443 @param AndData The value to AND with the read value from the bit field.
7444 @param OrData The value to OR with the result of the AND operation.
7445
7446 @return The value written back to the MSR.
7447
7448 **/
7449 UINT64
7450 EFIAPI
7451 AsmMsrBitFieldAndThenOr64 (
7452 IN UINT32 Index,
7453 IN UINTN StartBit,
7454 IN UINTN EndBit,
7455 IN UINT64 AndData,
7456 IN UINT64 OrData
7457 );
7458
7459
7460 /**
7461 Reads the current value of the EFLAGS register.
7462
7463 Reads and returns the current value of the EFLAGS register. This function is
7464 only available on IA-32 and x64. This returns a 32-bit value on IA-32 and a
7465 64-bit value on x64.
7466
7467 @return EFLAGS on IA-32 or RFLAGS on x64.
7468
7469 **/
7470 UINTN
7471 EFIAPI
7472 AsmReadEflags (
7473 VOID
7474 );
7475
7476
7477 /**
7478 Reads the current value of the Control Register 0 (CR0).
7479
7480 Reads and returns the current value of CR0. This function is only available
7481 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7482 x64.
7483
7484 @return The value of the Control Register 0 (CR0).
7485
7486 **/
7487 UINTN
7488 EFIAPI
7489 AsmReadCr0 (
7490 VOID
7491 );
7492
7493
7494 /**
7495 Reads the current value of the Control Register 2 (CR2).
7496
7497 Reads and returns the current value of CR2. This function is only available
7498 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7499 x64.
7500
7501 @return The value of the Control Register 2 (CR2).
7502
7503 **/
7504 UINTN
7505 EFIAPI
7506 AsmReadCr2 (
7507 VOID
7508 );
7509
7510
7511 /**
7512 Reads the current value of the Control Register 3 (CR3).
7513
7514 Reads and returns the current value of CR3. This function is only available
7515 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7516 x64.
7517
7518 @return The value of the Control Register 3 (CR3).
7519
7520 **/
7521 UINTN
7522 EFIAPI
7523 AsmReadCr3 (
7524 VOID
7525 );
7526
7527
7528 /**
7529 Reads the current value of the Control Register 4 (CR4).
7530
7531 Reads and returns the current value of CR4. This function is only available
7532 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7533 x64.
7534
7535 @return The value of the Control Register 4 (CR4).
7536
7537 **/
7538 UINTN
7539 EFIAPI
7540 AsmReadCr4 (
7541 VOID
7542 );
7543
7544
7545 /**
7546 Writes a value to Control Register 0 (CR0).
7547
7548 Writes and returns a new value to CR0. This function is only available on
7549 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7550
7551 @param Cr0 The value to write to CR0.
7552
7553 @return The value written to CR0.
7554
7555 **/
7556 UINTN
7557 EFIAPI
7558 AsmWriteCr0 (
7559 UINTN Cr0
7560 );
7561
7562
7563 /**
7564 Writes a value to Control Register 2 (CR2).
7565
7566 Writes and returns a new value to CR2. This function is only available on
7567 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7568
7569 @param Cr2 The value to write to CR2.
7570
7571 @return The value written to CR2.
7572
7573 **/
7574 UINTN
7575 EFIAPI
7576 AsmWriteCr2 (
7577 UINTN Cr2
7578 );
7579
7580
7581 /**
7582 Writes a value to Control Register 3 (CR3).
7583
7584 Writes and returns a new value to CR3. This function is only available on
7585 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7586
7587 @param Cr3 The value to write to CR3.
7588
7589 @return The value written to CR3.
7590
7591 **/
7592 UINTN
7593 EFIAPI
7594 AsmWriteCr3 (
7595 UINTN Cr3
7596 );
7597
7598
7599 /**
7600 Writes a value to Control Register 4 (CR4).
7601
7602 Writes and returns a new value to CR4. This function is only available on
7603 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7604
7605 @param Cr4 The value to write to CR4.
7606
7607 @return The value written to CR4.
7608
7609 **/
7610 UINTN
7611 EFIAPI
7612 AsmWriteCr4 (
7613 UINTN Cr4
7614 );
7615
7616
7617 /**
7618 Reads the current value of Debug Register 0 (DR0).
7619
7620 Reads and returns the current value of DR0. This function is only available
7621 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7622 x64.
7623
7624 @return The value of Debug Register 0 (DR0).
7625
7626 **/
7627 UINTN
7628 EFIAPI
7629 AsmReadDr0 (
7630 VOID
7631 );
7632
7633
7634 /**
7635 Reads the current value of Debug Register 1 (DR1).
7636
7637 Reads and returns the current value of DR1. This function is only available
7638 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7639 x64.
7640
7641 @return The value of Debug Register 1 (DR1).
7642
7643 **/
7644 UINTN
7645 EFIAPI
7646 AsmReadDr1 (
7647 VOID
7648 );
7649
7650
7651 /**
7652 Reads the current value of Debug Register 2 (DR2).
7653
7654 Reads and returns the current value of DR2. This function is only available
7655 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7656 x64.
7657
7658 @return The value of Debug Register 2 (DR2).
7659
7660 **/
7661 UINTN
7662 EFIAPI
7663 AsmReadDr2 (
7664 VOID
7665 );
7666
7667
7668 /**
7669 Reads the current value of Debug Register 3 (DR3).
7670
7671 Reads and returns the current value of DR3. This function is only available
7672 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7673 x64.
7674
7675 @return The value of Debug Register 3 (DR3).
7676
7677 **/
7678 UINTN
7679 EFIAPI
7680 AsmReadDr3 (
7681 VOID
7682 );
7683
7684
7685 /**
7686 Reads the current value of Debug Register 4 (DR4).
7687
7688 Reads and returns the current value of DR4. This function is only available
7689 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7690 x64.
7691
7692 @return The value of Debug Register 4 (DR4).
7693
7694 **/
7695 UINTN
7696 EFIAPI
7697 AsmReadDr4 (
7698 VOID
7699 );
7700
7701
7702 /**
7703 Reads the current value of Debug Register 5 (DR5).
7704
7705 Reads and returns the current value of DR5. This function is only available
7706 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7707 x64.
7708
7709 @return The value of Debug Register 5 (DR5).
7710
7711 **/
7712 UINTN
7713 EFIAPI
7714 AsmReadDr5 (
7715 VOID
7716 );
7717
7718
7719 /**
7720 Reads the current value of Debug Register 6 (DR6).
7721
7722 Reads and returns the current value of DR6. This function is only available
7723 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7724 x64.
7725
7726 @return The value of Debug Register 6 (DR6).
7727
7728 **/
7729 UINTN
7730 EFIAPI
7731 AsmReadDr6 (
7732 VOID
7733 );
7734
7735
7736 /**
7737 Reads the current value of Debug Register 7 (DR7).
7738
7739 Reads and returns the current value of DR7. This function is only available
7740 on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
7741 x64.
7742
7743 @return The value of Debug Register 7 (DR7).
7744
7745 **/
7746 UINTN
7747 EFIAPI
7748 AsmReadDr7 (
7749 VOID
7750 );
7751
7752
7753 /**
7754 Writes a value to Debug Register 0 (DR0).
7755
7756 Writes and returns a new value to DR0. This function is only available on
7757 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7758
7759 @param Dr0 The value to write to Dr0.
7760
7761 @return The value written to Debug Register 0 (DR0).
7762
7763 **/
7764 UINTN
7765 EFIAPI
7766 AsmWriteDr0 (
7767 UINTN Dr0
7768 );
7769
7770
7771 /**
7772 Writes a value to Debug Register 1 (DR1).
7773
7774 Writes and returns a new value to DR1. This function is only available on
7775 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7776
7777 @param Dr1 The value to write to Dr1.
7778
7779 @return The value written to Debug Register 1 (DR1).
7780
7781 **/
7782 UINTN
7783 EFIAPI
7784 AsmWriteDr1 (
7785 UINTN Dr1
7786 );
7787
7788
7789 /**
7790 Writes a value to Debug Register 2 (DR2).
7791
7792 Writes and returns a new value to DR2. This function is only available on
7793 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7794
7795 @param Dr2 The value to write to Dr2.
7796
7797 @return The value written to Debug Register 2 (DR2).
7798
7799 **/
7800 UINTN
7801 EFIAPI
7802 AsmWriteDr2 (
7803 UINTN Dr2
7804 );
7805
7806
7807 /**
7808 Writes a value to Debug Register 3 (DR3).
7809
7810 Writes and returns a new value to DR3. This function is only available on
7811 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7812
7813 @param Dr3 The value to write to Dr3.
7814
7815 @return The value written to Debug Register 3 (DR3).
7816
7817 **/
7818 UINTN
7819 EFIAPI
7820 AsmWriteDr3 (
7821 UINTN Dr3
7822 );
7823
7824
7825 /**
7826 Writes a value to Debug Register 4 (DR4).
7827
7828 Writes and returns a new value to DR4. This function is only available on
7829 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7830
7831 @param Dr4 The value to write to Dr4.
7832
7833 @return The value written to Debug Register 4 (DR4).
7834
7835 **/
7836 UINTN
7837 EFIAPI
7838 AsmWriteDr4 (
7839 UINTN Dr4
7840 );
7841
7842
7843 /**
7844 Writes a value to Debug Register 5 (DR5).
7845
7846 Writes and returns a new value to DR5. This function is only available on
7847 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7848
7849 @param Dr5 The value to write to Dr5.
7850
7851 @return The value written to Debug Register 5 (DR5).
7852
7853 **/
7854 UINTN
7855 EFIAPI
7856 AsmWriteDr5 (
7857 UINTN Dr5
7858 );
7859
7860
7861 /**
7862 Writes a value to Debug Register 6 (DR6).
7863
7864 Writes and returns a new value to DR6. This function is only available on
7865 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7866
7867 @param Dr6 The value to write to Dr6.
7868
7869 @return The value written to Debug Register 6 (DR6).
7870
7871 **/
7872 UINTN
7873 EFIAPI
7874 AsmWriteDr6 (
7875 UINTN Dr6
7876 );
7877
7878
7879 /**
7880 Writes a value to Debug Register 7 (DR7).
7881
7882 Writes and returns a new value to DR7. This function is only available on
7883 IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
7884
7885 @param Dr7 The value to write to Dr7.
7886
7887 @return The value written to Debug Register 7 (DR7).
7888
7889 **/
7890 UINTN
7891 EFIAPI
7892 AsmWriteDr7 (
7893 UINTN Dr7
7894 );
7895
7896
7897 /**
7898 Reads the current value of Code Segment Register (CS).
7899
7900 Reads and returns the current value of CS. This function is only available on
7901 IA-32 and x64.
7902
7903 @return The current value of CS.
7904
7905 **/
7906 UINT16
7907 EFIAPI
7908 AsmReadCs (
7909 VOID
7910 );
7911
7912
7913 /**
7914 Reads the current value of Data Segment Register (DS).
7915
7916 Reads and returns the current value of DS. This function is only available on
7917 IA-32 and x64.
7918
7919 @return The current value of DS.
7920
7921 **/
7922 UINT16
7923 EFIAPI
7924 AsmReadDs (
7925 VOID
7926 );
7927
7928
7929 /**
7930 Reads the current value of Extra Segment Register (ES).
7931
7932 Reads and returns the current value of ES. This function is only available on
7933 IA-32 and x64.
7934
7935 @return The current value of ES.
7936
7937 **/
7938 UINT16
7939 EFIAPI
7940 AsmReadEs (
7941 VOID
7942 );
7943
7944
7945 /**
7946 Reads the current value of FS Data Segment Register (FS).
7947
7948 Reads and returns the current value of FS. This function is only available on
7949 IA-32 and x64.
7950
7951 @return The current value of FS.
7952
7953 **/
7954 UINT16
7955 EFIAPI
7956 AsmReadFs (
7957 VOID
7958 );
7959
7960
7961 /**
7962 Reads the current value of GS Data Segment Register (GS).
7963
7964 Reads and returns the current value of GS. This function is only available on
7965 IA-32 and x64.
7966
7967 @return The current value of GS.
7968
7969 **/
7970 UINT16
7971 EFIAPI
7972 AsmReadGs (
7973 VOID
7974 );
7975
7976
7977 /**
7978 Reads the current value of Stack Segment Register (SS).
7979
7980 Reads and returns the current value of SS. This function is only available on
7981 IA-32 and x64.
7982
7983 @return The current value of SS.
7984
7985 **/
7986 UINT16
7987 EFIAPI
7988 AsmReadSs (
7989 VOID
7990 );
7991
7992
7993 /**
7994 Reads the current value of Task Register (TR).
7995
7996 Reads and returns the current value of TR. This function is only available on
7997 IA-32 and x64.
7998
7999 @return The current value of TR.
8000
8001 **/
8002 UINT16
8003 EFIAPI
8004 AsmReadTr (
8005 VOID
8006 );
8007
8008
8009 /**
8010 Reads the current Global Descriptor Table Register(GDTR) descriptor.
8011
8012 Reads and returns the current GDTR descriptor and returns it in Gdtr. This
8013 function is only available on IA-32 and x64.
8014
8015 If Gdtr is NULL, then ASSERT().
8016
8017 @param Gdtr The pointer to a GDTR descriptor.
8018
8019 **/
8020 VOID
8021 EFIAPI
8022 AsmReadGdtr (
8023 OUT IA32_DESCRIPTOR *Gdtr
8024 );
8025
8026
8027 /**
8028 Writes the current Global Descriptor Table Register (GDTR) descriptor.
8029
8030 Writes and the current GDTR descriptor specified by Gdtr. This function is
8031 only available on IA-32 and x64.
8032
8033 If Gdtr is NULL, then ASSERT().
8034
8035 @param Gdtr The pointer to a GDTR descriptor.
8036
8037 **/
8038 VOID
8039 EFIAPI
8040 AsmWriteGdtr (
8041 IN CONST IA32_DESCRIPTOR *Gdtr
8042 );
8043
8044
8045 /**
8046 Reads the current Interrupt Descriptor Table Register(IDTR) descriptor.
8047
8048 Reads and returns the current IDTR descriptor and returns it in Idtr. This
8049 function is only available on IA-32 and x64.
8050
8051 If Idtr is NULL, then ASSERT().
8052
8053 @param Idtr The pointer to a IDTR descriptor.
8054
8055 **/
8056 VOID
8057 EFIAPI
8058 AsmReadIdtr (
8059 OUT IA32_DESCRIPTOR *Idtr
8060 );
8061
8062
8063 /**
8064 Writes the current Interrupt Descriptor Table Register(IDTR) descriptor.
8065
8066 Writes the current IDTR descriptor and returns it in Idtr. This function is
8067 only available on IA-32 and x64.
8068
8069 If Idtr is NULL, then ASSERT().
8070
8071 @param Idtr The pointer to a IDTR descriptor.
8072
8073 **/
8074 VOID
8075 EFIAPI
8076 AsmWriteIdtr (
8077 IN CONST IA32_DESCRIPTOR *Idtr
8078 );
8079
8080
8081 /**
8082 Reads the current Local Descriptor Table Register(LDTR) selector.
8083
8084 Reads and returns the current 16-bit LDTR descriptor value. This function is
8085 only available on IA-32 and x64.
8086
8087 @return The current selector of LDT.
8088
8089 **/
8090 UINT16
8091 EFIAPI
8092 AsmReadLdtr (
8093 VOID
8094 );
8095
8096
8097 /**
8098 Writes the current Local Descriptor Table Register (LDTR) selector.
8099
8100 Writes and the current LDTR descriptor specified by Ldtr. This function is
8101 only available on IA-32 and x64.
8102
8103 @param Ldtr 16-bit LDTR selector value.
8104
8105 **/
8106 VOID
8107 EFIAPI
8108 AsmWriteLdtr (
8109 IN UINT16 Ldtr
8110 );
8111
8112
8113 /**
8114 Save the current floating point/SSE/SSE2 context to a buffer.
8115
8116 Saves the current floating point/SSE/SSE2 state to the buffer specified by
8117 Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
8118 available on IA-32 and x64.
8119
8120 If Buffer is NULL, then ASSERT().
8121 If Buffer is not aligned on a 16-byte boundary, then ASSERT().
8122
8123 @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.
8124
8125 **/
8126 VOID
8127 EFIAPI
8128 AsmFxSave (
8129 OUT IA32_FX_BUFFER *Buffer
8130 );
8131
8132
8133 /**
8134 Restores the current floating point/SSE/SSE2 context from a buffer.
8135
8136 Restores the current floating point/SSE/SSE2 state from the buffer specified
8137 by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
8138 only available on IA-32 and x64.
8139
8140 If Buffer is NULL, then ASSERT().
8141 If Buffer is not aligned on a 16-byte boundary, then ASSERT().
8142 If Buffer was not saved with AsmFxSave(), then ASSERT().
8143
8144 @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.
8145
8146 **/
8147 VOID
8148 EFIAPI
8149 AsmFxRestore (
8150 IN CONST IA32_FX_BUFFER *Buffer
8151 );
8152
8153
8154 /**
8155 Reads the current value of 64-bit MMX Register #0 (MM0).
8156
8157 Reads and returns the current value of MM0. This function is only available
8158 on IA-32 and x64.
8159
8160 @return The current value of MM0.
8161
8162 **/
8163 UINT64
8164 EFIAPI
8165 AsmReadMm0 (
8166 VOID
8167 );
8168
8169
8170 /**
8171 Reads the current value of 64-bit MMX Register #1 (MM1).
8172
8173 Reads and returns the current value of MM1. This function is only available
8174 on IA-32 and x64.
8175
8176 @return The current value of MM1.
8177
8178 **/
8179 UINT64
8180 EFIAPI
8181 AsmReadMm1 (
8182 VOID
8183 );
8184
8185
8186 /**
8187 Reads the current value of 64-bit MMX Register #2 (MM2).
8188
8189 Reads and returns the current value of MM2. This function is only available
8190 on IA-32 and x64.
8191
8192 @return The current value of MM2.
8193
8194 **/
8195 UINT64
8196 EFIAPI
8197 AsmReadMm2 (
8198 VOID
8199 );
8200
8201
8202 /**
8203 Reads the current value of 64-bit MMX Register #3 (MM3).
8204
8205 Reads and returns the current value of MM3. This function is only available
8206 on IA-32 and x64.
8207
8208 @return The current value of MM3.
8209
8210 **/
8211 UINT64
8212 EFIAPI
8213 AsmReadMm3 (
8214 VOID
8215 );
8216
8217
8218 /**
8219 Reads the current value of 64-bit MMX Register #4 (MM4).
8220
8221 Reads and returns the current value of MM4. This function is only available
8222 on IA-32 and x64.
8223
8224 @return The current value of MM4.
8225
8226 **/
8227 UINT64
8228 EFIAPI
8229 AsmReadMm4 (
8230 VOID
8231 );
8232
8233
8234 /**
8235 Reads the current value of 64-bit MMX Register #5 (MM5).
8236
8237 Reads and returns the current value of MM5. This function is only available
8238 on IA-32 and x64.
8239
8240 @return The current value of MM5.
8241
8242 **/
8243 UINT64
8244 EFIAPI
8245 AsmReadMm5 (
8246 VOID
8247 );
8248
8249
8250 /**
8251 Reads the current value of 64-bit MMX Register #6 (MM6).
8252
8253 Reads and returns the current value of MM6. This function is only available
8254 on IA-32 and x64.
8255
8256 @return The current value of MM6.
8257
8258 **/
8259 UINT64
8260 EFIAPI
8261 AsmReadMm6 (
8262 VOID
8263 );
8264
8265
8266 /**
8267 Reads the current value of 64-bit MMX Register #7 (MM7).
8268
8269 Reads and returns the current value of MM7. This function is only available
8270 on IA-32 and x64.
8271
8272 @return The current value of MM7.
8273
8274 **/
8275 UINT64
8276 EFIAPI
8277 AsmReadMm7 (
8278 VOID
8279 );
8280
8281
8282 /**
8283 Writes the current value of 64-bit MMX Register #0 (MM0).
8284
8285 Writes the current value of MM0. This function is only available on IA32 and
8286 x64.
8287
8288 @param Value The 64-bit value to write to MM0.
8289
8290 **/
8291 VOID
8292 EFIAPI
8293 AsmWriteMm0 (
8294 IN UINT64 Value
8295 );
8296
8297
8298 /**
8299 Writes the current value of 64-bit MMX Register #1 (MM1).
8300
8301 Writes the current value of MM1. This function is only available on IA32 and
8302 x64.
8303
8304 @param Value The 64-bit value to write to MM1.
8305
8306 **/
8307 VOID
8308 EFIAPI
8309 AsmWriteMm1 (
8310 IN UINT64 Value
8311 );
8312
8313
8314 /**
8315 Writes the current value of 64-bit MMX Register #2 (MM2).
8316
8317 Writes the current value of MM2. This function is only available on IA32 and
8318 x64.
8319
8320 @param Value The 64-bit value to write to MM2.
8321
8322 **/
8323 VOID
8324 EFIAPI
8325 AsmWriteMm2 (
8326 IN UINT64 Value
8327 );
8328
8329
8330 /**
8331 Writes the current value of 64-bit MMX Register #3 (MM3).
8332
8333 Writes the current value of MM3. This function is only available on IA32 and
8334 x64.
8335
8336 @param Value The 64-bit value to write to MM3.
8337
8338 **/
8339 VOID
8340 EFIAPI
8341 AsmWriteMm3 (
8342 IN UINT64 Value
8343 );
8344
8345
8346 /**
8347 Writes the current value of 64-bit MMX Register #4 (MM4).
8348
8349 Writes the current value of MM4. This function is only available on IA32 and
8350 x64.
8351
8352 @param Value The 64-bit value to write to MM4.
8353
8354 **/
8355 VOID
8356 EFIAPI
8357 AsmWriteMm4 (
8358 IN UINT64 Value
8359 );
8360
8361
8362 /**
8363 Writes the current value of 64-bit MMX Register #5 (MM5).
8364
8365 Writes the current value of MM5. This function is only available on IA32 and
8366 x64.
8367
8368 @param Value The 64-bit value to write to MM5.
8369
8370 **/
8371 VOID
8372 EFIAPI
8373 AsmWriteMm5 (
8374 IN UINT64 Value
8375 );
8376
8377
8378 /**
8379 Writes the current value of 64-bit MMX Register #6 (MM6).
8380
8381 Writes the current value of MM6. This function is only available on IA32 and
8382 x64.
8383
8384 @param Value The 64-bit value to write to MM6.
8385
8386 **/
8387 VOID
8388 EFIAPI
8389 AsmWriteMm6 (
8390 IN UINT64 Value
8391 );
8392
8393
8394 /**
8395 Writes the current value of 64-bit MMX Register #7 (MM7).
8396
8397 Writes the current value of MM7. This function is only available on IA32 and
8398 x64.
8399
8400 @param Value The 64-bit value to write to MM7.
8401
8402 **/
8403 VOID
8404 EFIAPI
8405 AsmWriteMm7 (
8406 IN UINT64 Value
8407 );
8408
8409
8410 /**
8411 Reads the current value of Time Stamp Counter (TSC).
8412
8413 Reads and returns the current value of TSC. This function is only available
8414 on IA-32 and x64.
8415
8416 @return The current value of TSC
8417
8418 **/
8419 UINT64
8420 EFIAPI
8421 AsmReadTsc (
8422 VOID
8423 );
8424
8425
8426 /**
8427 Reads the current value of a Performance Counter (PMC).
8428
8429 Reads and returns the current value of performance counter specified by
8430 Index. This function is only available on IA-32 and x64.
8431
8432 @param Index The 32-bit Performance Counter index to read.
8433
8434 @return The value of the PMC specified by Index.
8435
8436 **/
8437 UINT64
8438 EFIAPI
8439 AsmReadPmc (
8440 IN UINT32 Index
8441 );
8442
8443
8444 /**
8445 Sets up a monitor buffer that is used by AsmMwait().
8446
8447 Executes a MONITOR instruction with the register state specified by Eax, Ecx
8448 and Edx. Returns Eax. This function is only available on IA-32 and x64.
8449
8450 @param Eax The value to load into EAX or RAX before executing the MONITOR
8451 instruction.
8452 @param Ecx The value to load into ECX or RCX before executing the MONITOR
8453 instruction.
8454 @param Edx The value to load into EDX or RDX before executing the MONITOR
8455 instruction.
8456
8457 @return Eax
8458
8459 **/
8460 UINTN
8461 EFIAPI
8462 AsmMonitor (
8463 IN UINTN Eax,
8464 IN UINTN Ecx,
8465 IN UINTN Edx
8466 );
8467
8468
8469 /**
8470 Executes an MWAIT instruction.
8471
8472 Executes an MWAIT instruction with the register state specified by Eax and
8473 Ecx. Returns Eax. This function is only available on IA-32 and x64.
8474
8475 @param Eax The value to load into EAX or RAX before executing the MONITOR
8476 instruction.
8477 @param Ecx The value to load into ECX or RCX before executing the MONITOR
8478 instruction.
8479
8480 @return Eax
8481
8482 **/
8483 UINTN
8484 EFIAPI
8485 AsmMwait (
8486 IN UINTN Eax,
8487 IN UINTN Ecx
8488 );
8489
8490
8491 /**
8492 Executes a WBINVD instruction.
8493
8494 Executes a WBINVD instruction. This function is only available on IA-32 and
8495 x64.
8496
8497 **/
8498 VOID
8499 EFIAPI
8500 AsmWbinvd (
8501 VOID
8502 );
8503
8504
8505 /**
8506 Executes a INVD instruction.
8507
8508 Executes a INVD instruction. This function is only available on IA-32 and
8509 x64.
8510
8511 **/
8512 VOID
8513 EFIAPI
8514 AsmInvd (
8515 VOID
8516 );
8517
8518
8519 /**
8520 Flushes a cache line from all the instruction and data caches within the
8521 coherency domain of the CPU.
8522
8523 Flushed the cache line specified by LinearAddress, and returns LinearAddress.
8524 This function is only available on IA-32 and x64.
8525
8526 @param LinearAddress The address of the cache line to flush. If the CPU is
8527 in a physical addressing mode, then LinearAddress is a
8528 physical address. If the CPU is in a virtual
8529 addressing mode, then LinearAddress is a virtual
8530 address.
8531
8532 @return LinearAddress.
8533 **/
8534 VOID *
8535 EFIAPI
8536 AsmFlushCacheLine (
8537 IN VOID *LinearAddress
8538 );
8539
8540
8541 /**
8542 Enables the 32-bit paging mode on the CPU.
8543
8544 Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
8545 must be properly initialized prior to calling this service. This function
8546 assumes the current execution mode is 32-bit protected mode. This function is
8547 only available on IA-32. After the 32-bit paging mode is enabled, control is
8548 transferred to the function specified by EntryPoint using the new stack
8549 specified by NewStack and passing in the parameters specified by Context1 and
8550 Context2. Context1 and Context2 are optional and may be NULL. The function
8551 EntryPoint must never return.
8552
8553 If the current execution mode is not 32-bit protected mode, then ASSERT().
8554 If EntryPoint is NULL, then ASSERT().
8555 If NewStack is NULL, then ASSERT().
8556
8557 There are a number of constraints that must be followed before calling this
8558 function:
8559 1) Interrupts must be disabled.
8560 2) The caller must be in 32-bit protected mode with flat descriptors. This
8561 means all descriptors must have a base of 0 and a limit of 4GB.
8562 3) CR0 and CR4 must be compatible with 32-bit protected mode with flat
8563 descriptors.
8564 4) CR3 must point to valid page tables that will be used once the transition
8565 is complete, and those page tables must guarantee that the pages for this
8566 function and the stack are identity mapped.
8567
8568 @param EntryPoint A pointer to function to call with the new stack after
8569 paging is enabled.
8570 @param Context1 A pointer to the context to pass into the EntryPoint
8571 function as the first parameter after paging is enabled.
8572 @param Context2 A pointer to the context to pass into the EntryPoint
8573 function as the second parameter after paging is enabled.
8574 @param NewStack A pointer to the new stack to use for the EntryPoint
8575 function after paging is enabled.
8576
8577 **/
8578 VOID
8579 EFIAPI
8580 AsmEnablePaging32 (
8581 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
8582 IN VOID *Context1, OPTIONAL
8583 IN VOID *Context2, OPTIONAL
8584 IN VOID *NewStack
8585 );
8586
8587
8588 /**
8589 Disables the 32-bit paging mode on the CPU.
8590
8591 Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
8592 mode. This function assumes the current execution mode is 32-paged protected
8593 mode. This function is only available on IA-32. After the 32-bit paging mode
8594 is disabled, control is transferred to the function specified by EntryPoint
8595 using the new stack specified by NewStack and passing in the parameters
8596 specified by Context1 and Context2. Context1 and Context2 are optional and
8597 may be NULL. The function EntryPoint must never return.
8598
8599 If the current execution mode is not 32-bit paged mode, then ASSERT().
8600 If EntryPoint is NULL, then ASSERT().
8601 If NewStack is NULL, then ASSERT().
8602
8603 There are a number of constraints that must be followed before calling this
8604 function:
8605 1) Interrupts must be disabled.
8606 2) The caller must be in 32-bit paged mode.
8607 3) CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
8608 4) CR3 must point to valid page tables that guarantee that the pages for
8609 this function and the stack are identity mapped.
8610
8611 @param EntryPoint A pointer to function to call with the new stack after
8612 paging is disabled.
8613 @param Context1 A pointer to the context to pass into the EntryPoint
8614 function as the first parameter after paging is disabled.
8615 @param Context2 A pointer to the context to pass into the EntryPoint
8616 function as the second parameter after paging is
8617 disabled.
8618 @param NewStack A pointer to the new stack to use for the EntryPoint
8619 function after paging is disabled.
8620
8621 **/
8622 VOID
8623 EFIAPI
8624 AsmDisablePaging32 (
8625 IN SWITCH_STACK_ENTRY_POINT EntryPoint,
8626 IN VOID *Context1, OPTIONAL
8627 IN VOID *Context2, OPTIONAL
8628 IN VOID *NewStack
8629 );
8630
8631
8632 /**
8633 Enables the 64-bit paging mode on the CPU.
8634
8635 Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
8636 must be properly initialized prior to calling this service. This function
8637 assumes the current execution mode is 32-bit protected mode with flat
8638 descriptors. This function is only available on IA-32. After the 64-bit
8639 paging mode is enabled, control is transferred to the function specified by
8640 EntryPoint using the new stack specified by NewStack and passing in the
8641 parameters specified by Context1 and Context2. Context1 and Context2 are
8642 optional and may be 0. The function EntryPoint must never return.
8643
8644 If the current execution mode is not 32-bit protected mode with flat
8645 descriptors, then ASSERT().
8646 If EntryPoint is 0, then ASSERT().
8647 If NewStack is 0, then ASSERT().
8648
8649 @param Cs The 16-bit selector to load in the CS before EntryPoint
8650 is called. The descriptor in the GDT that this selector
8651 references must be setup for long mode.
8652 @param EntryPoint The 64-bit virtual address of the function to call with
8653 the new stack after paging is enabled.
8654 @param Context1 The 64-bit virtual address of the context to pass into
8655 the EntryPoint function as the first parameter after
8656 paging is enabled.
8657 @param Context2 The 64-bit virtual address of the context to pass into
8658 the EntryPoint function as the second parameter after
8659 paging is enabled.
8660 @param NewStack The 64-bit virtual address of the new stack to use for
8661 the EntryPoint function after paging is enabled.
8662
8663 **/
8664 VOID
8665 EFIAPI
8666 AsmEnablePaging64 (
8667 IN UINT16 Cs,
8668 IN UINT64 EntryPoint,
8669 IN UINT64 Context1, OPTIONAL
8670 IN UINT64 Context2, OPTIONAL
8671 IN UINT64 NewStack
8672 );
8673
8674
8675 /**
8676 Disables the 64-bit paging mode on the CPU.
8677
8678 Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
8679 mode. This function assumes the current execution mode is 64-paging mode.
8680 This function is only available on x64. After the 64-bit paging mode is
8681 disabled, control is transferred to the function specified by EntryPoint
8682 using the new stack specified by NewStack and passing in the parameters
8683 specified by Context1 and Context2. Context1 and Context2 are optional and
8684 may be 0. The function EntryPoint must never return.
8685
8686 If the current execution mode is not 64-bit paged mode, then ASSERT().
8687 If EntryPoint is 0, then ASSERT().
8688 If NewStack is 0, then ASSERT().
8689
8690 @param Cs The 16-bit selector to load in the CS before EntryPoint
8691 is called. The descriptor in the GDT that this selector
8692 references must be setup for 32-bit protected mode.
8693 @param EntryPoint The 64-bit virtual address of the function to call with
8694 the new stack after paging is disabled.
8695 @param Context1 The 64-bit virtual address of the context to pass into
8696 the EntryPoint function as the first parameter after
8697 paging is disabled.
8698 @param Context2 The 64-bit virtual address of the context to pass into
8699 the EntryPoint function as the second parameter after
8700 paging is disabled.
8701 @param NewStack The 64-bit virtual address of the new stack to use for
8702 the EntryPoint function after paging is disabled.
8703
8704 **/
8705 VOID
8706 EFIAPI
8707 AsmDisablePaging64 (
8708 IN UINT16 Cs,
8709 IN UINT32 EntryPoint,
8710 IN UINT32 Context1, OPTIONAL
8711 IN UINT32 Context2, OPTIONAL
8712 IN UINT32 NewStack
8713 );
8714
8715
8716 //
8717 // 16-bit thunking services
8718 //
8719
8720 /**
8721 Retrieves the properties for 16-bit thunk functions.
8722
8723 Computes the size of the buffer and stack below 1MB required to use the
8724 AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This
8725 buffer size is returned in RealModeBufferSize, and the stack size is returned
8726 in ExtraStackSize. If parameters are passed to the 16-bit real mode code,
8727 then the actual minimum stack size is ExtraStackSize plus the maximum number
8728 of bytes that need to be passed to the 16-bit real mode code.
8729
8730 If RealModeBufferSize is NULL, then ASSERT().
8731 If ExtraStackSize is NULL, then ASSERT().
8732
8733 @param RealModeBufferSize A pointer to the size of the buffer below 1MB
8734 required to use the 16-bit thunk functions.
8735 @param ExtraStackSize A pointer to the extra size of stack below 1MB
8736 that the 16-bit thunk functions require for
8737 temporary storage in the transition to and from
8738 16-bit real mode.
8739
8740 **/
8741 VOID
8742 EFIAPI
8743 AsmGetThunk16Properties (
8744 OUT UINT32 *RealModeBufferSize,
8745 OUT UINT32 *ExtraStackSize
8746 );
8747
8748
8749 /**
8750 Prepares all structures a code required to use AsmThunk16().
8751
8752 Prepares all structures and code required to use AsmThunk16().
8753
8754 This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
8755 virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.
8756
8757 If ThunkContext is NULL, then ASSERT().
8758
8759 @param ThunkContext A pointer to the context structure that describes the
8760 16-bit real mode code to call.
8761
8762 **/
8763 VOID
8764 EFIAPI
8765 AsmPrepareThunk16 (
8766 IN OUT THUNK_CONTEXT *ThunkContext
8767 );
8768
8769
8770 /**
8771 Transfers control to a 16-bit real mode entry point and returns the results.
8772
8773 Transfers control to a 16-bit real mode entry point and returns the results.
8774 AsmPrepareThunk16() must be called with ThunkContext before this function is used.
8775 This function must be called with interrupts disabled.
8776
8777 The register state from the RealModeState field of ThunkContext is restored just prior
8778 to calling the 16-bit real mode entry point. This includes the EFLAGS field of RealModeState,
8779 which is used to set the interrupt state when a 16-bit real mode entry point is called.
8780 Control is transferred to the 16-bit real mode entry point specified by the CS and Eip fields of RealModeState.
8781 The stack is initialized to the SS and ESP fields of RealModeState. Any parameters passed to
8782 the 16-bit real mode code must be populated by the caller at SS:ESP prior to calling this function.
8783 The 16-bit real mode entry point is invoked with a 16-bit CALL FAR instruction,
8784 so when accessing stack contents, the 16-bit real mode code must account for the 16-bit segment
8785 and 16-bit offset of the return address that were pushed onto the stack. The 16-bit real mode entry
8786 point must exit with a RETF instruction. The register state is captured into RealModeState immediately
8787 after the RETF instruction is executed.
8788
8789 If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,
8790 or any of the 16-bit real mode code makes a SW interrupt, then the caller is responsible for making sure
8791 the IDT at address 0 is initialized to handle any HW or SW interrupts that may occur while in 16-bit real mode.
8792
8793 If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,
8794 then the caller is responsible for making sure the 8259 PIC is in a state compatible with 16-bit real mode.
8795 This includes the base vectors, the interrupt masks, and the edge/level trigger mode.
8796
8797 If THUNK_ATTRIBUTE_BIG_REAL_MODE is set in the ThunkAttributes field of ThunkContext, then the user code
8798 is invoked in big real mode. Otherwise, the user code is invoked in 16-bit real mode with 64KB segment limits.
8799
8800 If neither THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 nor THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in
8801 ThunkAttributes, then it is assumed that the user code did not enable the A20 mask, and no attempt is made to
8802 disable the A20 mask.
8803
8804 If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is set and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is clear in
8805 ThunkAttributes, then attempt to use the INT 15 service to disable the A20 mask. If this INT 15 call fails,
8806 then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.
8807
8808 If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is clear and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is set in
8809 ThunkAttributes, then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.
8810
8811 If ThunkContext is NULL, then ASSERT().
8812 If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().
8813 If both THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in
8814 ThunkAttributes, then ASSERT().
8815
8816 This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
8817 virtual to physical mappings for ThunkContext.RealModeBuffer are mapped 1:1.
8818
8819 @param ThunkContext A pointer to the context structure that describes the
8820 16-bit real mode code to call.
8821
8822 **/
8823 VOID
8824 EFIAPI
8825 AsmThunk16 (
8826 IN OUT THUNK_CONTEXT *ThunkContext
8827 );
8828
8829
8830 /**
8831 Prepares all structures and code for a 16-bit real mode thunk, transfers
8832 control to a 16-bit real mode entry point, and returns the results.
8833
8834 Prepares all structures and code for a 16-bit real mode thunk, transfers
8835 control to a 16-bit real mode entry point, and returns the results. If the
8836 caller only need to perform a single 16-bit real mode thunk, then this
8837 service should be used. If the caller intends to make more than one 16-bit
8838 real mode thunk, then it is more efficient if AsmPrepareThunk16() is called
8839 once and AsmThunk16() can be called for each 16-bit real mode thunk.
8840
8841 This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
8842 virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.
8843
8844 See AsmPrepareThunk16() and AsmThunk16() for the detailed description and ASSERT() conditions.
8845
8846 @param ThunkContext A pointer to the context structure that describes the
8847 16-bit real mode code to call.
8848
8849 **/
8850 VOID
8851 EFIAPI
8852 AsmPrepareAndThunk16 (
8853 IN OUT THUNK_CONTEXT *ThunkContext
8854 );
8855
8856 /**
8857 Generates a 16-bit random number through RDRAND instruction.
8858
8859 if Rand is NULL, then ASSERT().
8860
8861 @param[out] Rand Buffer pointer to store the random result.
8862
8863 @retval TRUE RDRAND call was successful.
8864 @retval FALSE Failed attempts to call RDRAND.
8865
8866 **/
8867 BOOLEAN
8868 EFIAPI
8869 AsmRdRand16 (
8870 OUT UINT16 *Rand
8871 );
8872
8873 /**
8874 Generates a 32-bit random number through RDRAND instruction.
8875
8876 if Rand is NULL, then ASSERT().
8877
8878 @param[out] Rand Buffer pointer to store the random result.
8879
8880 @retval TRUE RDRAND call was successful.
8881 @retval FALSE Failed attempts to call RDRAND.
8882
8883 **/
8884 BOOLEAN
8885 EFIAPI
8886 AsmRdRand32 (
8887 OUT UINT32 *Rand
8888 );
8889
8890 /**
8891 Generates a 64-bit random number through RDRAND instruction.
8892
8893 if Rand is NULL, then ASSERT().
8894
8895 @param[out] Rand Buffer pointer to store the random result.
8896
8897 @retval TRUE RDRAND call was successful.
8898 @retval FALSE Failed attempts to call RDRAND.
8899
8900 **/
8901 BOOLEAN
8902 EFIAPI
8903 AsmRdRand64 (
8904 OUT UINT64 *Rand
8905 );
8906
8907 #endif
8908 #endif
8909
8910