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