2 CPU Register Table Library functions.
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "RegisterCpuFeatures.h"
18 Checks if two CPU feature bit masks are equal.
20 @param[in] FirstFeatureMask The first input CPU feature bit mask
21 @param[in] SecondFeatureMask The second input CPU feature bit mask
23 @retval TRUE Two CPU feature bit masks are equal.
24 @retval FALSE Two CPU feature bit masks are not equal.
28 IN UINT8
*FirstFeatureMask
,
29 IN UINT8
*SecondFeatureMask
34 BitMaskSize
= PcdGetSize (PcdCpuFeaturesSupport
);
35 if (CompareMem (FirstFeatureMask
, SecondFeatureMask
, BitMaskSize
) == 0) {
43 Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.
45 @param[in] FeatureMask A pointer to the CPU feature bit mask.
56 BitMaskSize
= PcdGetSize (PcdCpuFeaturesSupport
);
57 Data8
= (UINT8
*) FeatureMask
;
58 for (Index
= 0; Index
< BitMaskSize
; Index
++) {
59 DEBUG ((DEBUG_INFO
, " %02x ", *Data8
++));
61 DEBUG ((DEBUG_INFO
, "\n"));
65 Dump CPU feature name or CPU feature bit mask.
67 @param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY
71 IN CPU_FEATURES_ENTRY
*CpuFeature
75 if (CpuFeature
->FeatureName
!= NULL
) {
76 DEBUG ((DEBUG_INFO
, "FeatureName: %a\n", CpuFeature
->FeatureName
));
78 DEBUG ((DEBUG_INFO
, "FeatureMask = "));
79 DumpCpuFeatureMask (CpuFeature
->FeatureMask
);
84 Determines if the feature bit mask is in dependent CPU feature bit mask buffer.
86 @param[in] FeatureMask Pointer to CPU feature bit mask
87 @param[in] DependentBitMask Pointer to dependent CPU feature bit mask buffer
89 @retval TRUE The feature bit mask is in dependent CPU feature bit mask buffer.
90 @retval FALSE The feature bit mask is not in dependent CPU feature bit mask buffer.
94 IN UINT8
*FeatureMask
,
95 IN UINT8
*DependentBitMask
103 BitMaskSize
= PcdGetSize (PcdCpuFeaturesSupport
);
106 Data2
= DependentBitMask
;
107 for (Index
= 0; Index
< BitMaskSize
; Index
++) {
108 if (((*(Data1
++)) & (*(Data2
++))) != 0) {
116 Checks and adjusts CPU features order per dependency relationship.
118 @param[in] FeatureList Pointer to CPU feature list
121 CheckCpuFeaturesDependency (
122 IN LIST_ENTRY
*FeatureList
125 LIST_ENTRY
*CurrentEntry
;
126 CPU_FEATURES_ENTRY
*CpuFeature
;
127 LIST_ENTRY
*CheckEntry
;
128 CPU_FEATURES_ENTRY
*CheckFeature
;
130 LIST_ENTRY
*TempEntry
;
132 CurrentEntry
= GetFirstNode (FeatureList
);
133 while (!IsNull (FeatureList
, CurrentEntry
)) {
135 CpuFeature
= CPU_FEATURE_ENTRY_FROM_LINK (CurrentEntry
);
136 if (CpuFeature
->BeforeAll
) {
138 // Check all features dispatched before this entry
140 CheckEntry
= GetFirstNode (FeatureList
);
141 while (CheckEntry
!= CurrentEntry
) {
142 CheckFeature
= CPU_FEATURE_ENTRY_FROM_LINK (CheckEntry
);
143 if (!CheckFeature
->BeforeAll
) {
145 // If this feature has no BeforeAll flag and is dispatched before CpuFeature,
146 // insert currentEntry before Checked feature
148 RemoveEntryList (CurrentEntry
);
149 InsertTailList (CheckEntry
, CurrentEntry
);
153 CheckEntry
= CheckEntry
->ForwardLink
;
160 if (CpuFeature
->AfterAll
) {
162 // Check all features dispatched after this entry
164 CheckEntry
= GetNextNode (FeatureList
, CurrentEntry
);
165 while (!IsNull (FeatureList
, CheckEntry
)) {
166 CheckFeature
= CPU_FEATURE_ENTRY_FROM_LINK (CheckEntry
);
167 if (!CheckFeature
->AfterAll
) {
169 // If this feature has no AfterAll flag and is dispatched after CpuFeature,
170 // insert currentEntry after Checked feature
172 TempEntry
= GetNextNode (FeatureList
, CurrentEntry
);
173 RemoveEntryList (CurrentEntry
);
174 InsertHeadList (CheckEntry
, CurrentEntry
);
175 CurrentEntry
= TempEntry
;
179 CheckEntry
= CheckEntry
->ForwardLink
;
186 if (CpuFeature
->BeforeFeatureBitMask
!= NULL
) {
188 // Check all features dispatched before this entry
190 CheckEntry
= GetFirstNode (FeatureList
);
191 while (CheckEntry
!= CurrentEntry
) {
192 CheckFeature
= CPU_FEATURE_ENTRY_FROM_LINK (CheckEntry
);
193 if (IsBitMaskMatchCheck (CheckFeature
->FeatureMask
, CpuFeature
->BeforeFeatureBitMask
)) {
195 // If there is dependency, swap them
197 RemoveEntryList (CurrentEntry
);
198 InsertTailList (CheckEntry
, CurrentEntry
);
202 CheckEntry
= CheckEntry
->ForwardLink
;
209 if (CpuFeature
->AfterFeatureBitMask
!= NULL
) {
211 // Check all features dispatched after this entry
213 CheckEntry
= GetNextNode (FeatureList
, CurrentEntry
);
214 while (!IsNull (FeatureList
, CheckEntry
)) {
215 CheckFeature
= CPU_FEATURE_ENTRY_FROM_LINK (CheckEntry
);
216 if (IsBitMaskMatchCheck (CheckFeature
->FeatureMask
, CpuFeature
->AfterFeatureBitMask
)) {
218 // If there is dependency, swap them
220 TempEntry
= GetNextNode (FeatureList
, CurrentEntry
);
221 RemoveEntryList (CurrentEntry
);
222 InsertHeadList (CheckEntry
, CurrentEntry
);
223 CurrentEntry
= TempEntry
;
227 CheckEntry
= CheckEntry
->ForwardLink
;
234 // No swap happened, check the next feature
236 CurrentEntry
= CurrentEntry
->ForwardLink
;
241 Worker function to register CPU Feature.
243 @param[in] CpuFeature Pointer to CPU feature entry
245 @retval RETURN_SUCCESS The CPU feature was successfully registered.
246 @retval RETURN_OUT_OF_RESOURCES There are not enough resources to register
248 @retval RETURN_UNSUPPORTED Registration of the CPU feature is not
249 supported due to a circular dependency between
250 BEFORE and AFTER features.
253 RegisterCpuFeatureWorker (
254 IN CPU_FEATURES_ENTRY
*CpuFeature
258 CPU_FEATURES_DATA
*CpuFeaturesData
;
259 CPU_FEATURES_ENTRY
*CpuFeatureEntry
;
262 BOOLEAN FeatureExist
;
264 BitMaskSize
= PcdGetSize (PcdCpuFeaturesSupport
);
265 CpuFeaturesData
= GetCpuFeaturesData ();
266 if (CpuFeaturesData
->FeaturesCount
== 0) {
267 InitializeListHead (&CpuFeaturesData
->FeatureList
);
268 InitializeSpinLock (&CpuFeaturesData
->MsrLock
);
269 InitializeSpinLock (&CpuFeaturesData
->MemoryMappedLock
);
270 CpuFeaturesData
->BitMaskSize
= BitMaskSize
;
272 ASSERT (CpuFeaturesData
->BitMaskSize
== BitMaskSize
);
274 FeatureExist
= FALSE
;
275 CpuFeatureEntry
= NULL
;
276 Entry
= GetFirstNode (&CpuFeaturesData
->FeatureList
);
277 while (!IsNull (&CpuFeaturesData
->FeatureList
, Entry
)) {
278 CpuFeatureEntry
= CPU_FEATURE_ENTRY_FROM_LINK (Entry
);
279 if (IsCpuFeatureMatch (CpuFeature
->FeatureMask
, CpuFeatureEntry
->FeatureMask
)) {
281 // If this feature already registered
286 Entry
= Entry
->ForwardLink
;
290 DEBUG ((DEBUG_INFO
, "[NEW] "));
291 DumpCpuFeature (CpuFeature
);
292 InsertTailList (&CpuFeaturesData
->FeatureList
, &CpuFeature
->Link
);
293 CpuFeaturesData
->FeaturesCount
++;
295 DEBUG ((DEBUG_INFO
, "[OVERRIDE] "));
296 DumpCpuFeature (CpuFeature
);
297 ASSERT (CpuFeatureEntry
!= NULL
);
299 // Overwrite original parameters of CPU feature
301 if (CpuFeature
->GetConfigDataFunc
!= NULL
) {
302 CpuFeatureEntry
->GetConfigDataFunc
= CpuFeature
->GetConfigDataFunc
;
304 if (CpuFeature
->SupportFunc
!= NULL
) {
305 CpuFeatureEntry
->SupportFunc
= CpuFeature
->SupportFunc
;
307 if (CpuFeature
->InitializeFunc
!= NULL
) {
308 CpuFeatureEntry
->InitializeFunc
= CpuFeature
->InitializeFunc
;
310 if (CpuFeature
->FeatureName
!= NULL
) {
311 if (CpuFeatureEntry
->FeatureName
== NULL
) {
312 CpuFeatureEntry
->FeatureName
= AllocatePool (CPU_FEATURE_NAME_SIZE
);
313 ASSERT (CpuFeatureEntry
->FeatureName
!= NULL
);
315 Status
= AsciiStrCpyS (CpuFeatureEntry
->FeatureName
, CPU_FEATURE_NAME_SIZE
, CpuFeature
->FeatureName
);
316 ASSERT_EFI_ERROR (Status
);
317 FreePool (CpuFeature
->FeatureName
);
319 if (CpuFeature
->BeforeFeatureBitMask
!= NULL
) {
320 if (CpuFeatureEntry
->BeforeFeatureBitMask
!= NULL
) {
321 FreePool (CpuFeatureEntry
->BeforeFeatureBitMask
);
323 CpuFeatureEntry
->BeforeFeatureBitMask
= CpuFeature
->BeforeFeatureBitMask
;
325 if (CpuFeature
->AfterFeatureBitMask
!= NULL
) {
326 if (CpuFeatureEntry
->AfterFeatureBitMask
!= NULL
) {
327 FreePool (CpuFeatureEntry
->AfterFeatureBitMask
);
329 CpuFeatureEntry
->AfterFeatureBitMask
= CpuFeature
->AfterFeatureBitMask
;
331 CpuFeatureEntry
->BeforeAll
= CpuFeature
->BeforeAll
;
332 CpuFeatureEntry
->AfterAll
= CpuFeature
->AfterAll
;
334 FreePool (CpuFeature
->FeatureMask
);
335 FreePool (CpuFeature
);
338 // Verify CPU features dependency can change CPU feature order
340 CheckCpuFeaturesDependency (&CpuFeaturesData
->FeatureList
);
341 return RETURN_SUCCESS
;
345 Sets CPU feature bit mask in CPU feature bit mask buffer.
347 @param[in] FeaturesBitMask Pointer to CPU feature bit mask buffer
348 @param[in] Feature The bit number of the CPU feature
349 @param[in] BitMaskSize CPU feature bit mask buffer size
352 SetCpuFeaturesBitMask (
353 IN UINT8
**FeaturesBitMask
,
358 UINT8
*CpuFeaturesBitMask
;
360 ASSERT (FeaturesBitMask
!= NULL
);
361 CpuFeaturesBitMask
= *FeaturesBitMask
;
362 if (CpuFeaturesBitMask
== NULL
) {
363 CpuFeaturesBitMask
= AllocateZeroPool (BitMaskSize
);
364 ASSERT (CpuFeaturesBitMask
!= NULL
);
365 *FeaturesBitMask
= CpuFeaturesBitMask
;
368 CpuFeaturesBitMask
+= (Feature
/ 8);
369 *CpuFeaturesBitMask
|= (UINT8
) (1 << (Feature
% 8));
373 Registers a CPU Feature.
375 @param GetConfigDataFunc CPU feature get configuration data function. This
376 is an optional parameter that may be NULL. If NULL,
377 then the most recently registered function for the
378 CPU feature is used. If no functions are registered
379 for a CPU feature, then the CPU configuration data
380 for the registered feature is NULL.
381 @param SupportFunc CPU feature support function. This is an optional
382 parameter that may be NULL. If NULL, then the most
383 recently registered function for the CPU feature is
384 used. If no functions are registered for a CPU
385 feature, then the CPU feature is assumed to be
386 supported by all CPUs.
387 @param InitializeFunc CPU feature initialize function. This is an optional
388 parameter that may be NULL. If NULL, then the most
389 recently registered function for the CPU feature is
390 used. If no functions are registered for a CPU
391 feature, then the CPU feature initialization is
393 @param ... Variable argument list of UINT32 CPU feature value.
394 Values with no modifiers are the features provided
395 by the registered functions.
396 Values with CPU_FEATURE_BEFORE modifier are features
397 that must be initialized after the features provided
398 by the registered functions are used.
399 Values with CPU_FEATURE_AFTER modifier are features
400 that must be initialized before the features provided
401 by the registered functions are used.
402 The last argument in this variable argument list must
403 always be CPU_FEATURE_END.
405 @retval RETURN_SUCCESS The CPU feature was successfully registered.
406 @retval RETURN_OUT_OF_RESOURCES There are not enough resources to register
408 @retval RETURN_UNSUPPORTED Registration of the CPU feature is not
409 supported due to a circular dependency between
410 BEFORE and AFTER features.
412 @note This service could be called by BSP only.
417 IN CHAR8
*FeatureName
, OPTIONAL
418 IN CPU_FEATURE_GET_CONFIG_DATA GetConfigDataFunc
, OPTIONAL
419 IN CPU_FEATURE_SUPPORT SupportFunc
, OPTIONAL
420 IN CPU_FEATURE_INITIALIZE InitializeFunc
, OPTIONAL
428 CPU_FEATURES_ENTRY
*CpuFeature
;
430 UINT8
*BeforeFeatureBitMask
;
431 UINT8
*AfterFeatureBitMask
;
436 BeforeFeatureBitMask
= NULL
;
437 AfterFeatureBitMask
= NULL
;
441 BitMaskSize
= PcdGetSize (PcdCpuFeaturesSupport
);
443 VA_START (Marker
, InitializeFunc
);
444 Feature
= VA_ARG (Marker
, UINT32
);
445 while (Feature
!= CPU_FEATURE_END
) {
446 ASSERT ((Feature
& (CPU_FEATURE_BEFORE
| CPU_FEATURE_AFTER
))
447 != (CPU_FEATURE_BEFORE
| CPU_FEATURE_AFTER
));
448 ASSERT ((Feature
& (CPU_FEATURE_BEFORE_ALL
| CPU_FEATURE_AFTER_ALL
))
449 != (CPU_FEATURE_BEFORE_ALL
| CPU_FEATURE_AFTER_ALL
));
450 if (Feature
< CPU_FEATURE_BEFORE
) {
451 BeforeAll
= ((Feature
& CPU_FEATURE_BEFORE_ALL
) != 0) ? TRUE
: FALSE
;
452 AfterAll
= ((Feature
& CPU_FEATURE_AFTER_ALL
) != 0) ? TRUE
: FALSE
;
453 Feature
&= ~(CPU_FEATURE_BEFORE_ALL
| CPU_FEATURE_AFTER_ALL
);
454 ASSERT (FeatureMask
== NULL
);
455 SetCpuFeaturesBitMask (&FeatureMask
, Feature
, BitMaskSize
);
456 } else if ((Feature
& CPU_FEATURE_BEFORE
) != 0) {
457 SetCpuFeaturesBitMask (&BeforeFeatureBitMask
, Feature
& ~CPU_FEATURE_BEFORE
, BitMaskSize
);
458 } else if ((Feature
& CPU_FEATURE_AFTER
) != 0) {
459 SetCpuFeaturesBitMask (&AfterFeatureBitMask
, Feature
& ~CPU_FEATURE_AFTER
, BitMaskSize
);
461 Feature
= VA_ARG (Marker
, UINT32
);
465 CpuFeature
= AllocateZeroPool (sizeof (CPU_FEATURES_ENTRY
));
466 ASSERT (CpuFeature
!= NULL
);
467 CpuFeature
->Signature
= CPU_FEATURE_ENTRY_SIGNATURE
;
468 CpuFeature
->FeatureMask
= FeatureMask
;
469 CpuFeature
->BeforeFeatureBitMask
= BeforeFeatureBitMask
;
470 CpuFeature
->AfterFeatureBitMask
= AfterFeatureBitMask
;
471 CpuFeature
->BeforeAll
= BeforeAll
;
472 CpuFeature
->AfterAll
= AfterAll
;
473 CpuFeature
->GetConfigDataFunc
= GetConfigDataFunc
;
474 CpuFeature
->SupportFunc
= SupportFunc
;
475 CpuFeature
->InitializeFunc
= InitializeFunc
;
476 if (FeatureName
!= NULL
) {
477 CpuFeature
->FeatureName
= AllocatePool (CPU_FEATURE_NAME_SIZE
);
478 ASSERT (CpuFeature
->FeatureName
!= NULL
);
479 Status
= AsciiStrCpyS (CpuFeature
->FeatureName
, CPU_FEATURE_NAME_SIZE
, FeatureName
);
480 ASSERT_EFI_ERROR (Status
);
483 Status
= RegisterCpuFeatureWorker (CpuFeature
);
484 ASSERT_EFI_ERROR (Status
);
486 return RETURN_SUCCESS
;
490 Add an entry in specified register table.
492 This function adds an entry in specified register table, with given register type,
493 register index, bit section and value.
495 @param[in] PreSmmFlag If TRUE, entry will be added into PreSmm register table
496 If FALSE, entry will be added into register table
497 @param[in] ProcessorNumber The index of the CPU to add a register table entry
498 @param[in] RegisterType Type of the register to program
499 @param[in] Index Index of the register to program
500 @param[in] ValidBitStart Start of the bit section
501 @param[in] ValidBitLength Length of the bit section
502 @param[in] Value Value to write
505 CpuRegisterTableWriteWorker (
506 IN BOOLEAN PreSmmFlag
,
507 IN UINTN ProcessorNumber
,
508 IN REGISTER_TYPE RegisterType
,
510 IN UINT8 ValidBitStart
,
511 IN UINT8 ValidBitLength
,
516 CPU_FEATURES_DATA
*CpuFeaturesData
;
517 ACPI_CPU_DATA
*AcpiCpuData
;
518 CPU_REGISTER_TABLE
*RegisterTable
;
519 CPU_REGISTER_TABLE_ENTRY
*RegisterTableEntry
;
521 CpuFeaturesData
= GetCpuFeaturesData ();
522 if (CpuFeaturesData
->RegisterTable
== NULL
) {
523 AcpiCpuData
= (ACPI_CPU_DATA
*) (UINTN
) PcdGet64 (PcdCpuS3DataAddress
);
524 if (AcpiCpuData
== NULL
) {
525 AcpiCpuData
= AllocateAcpiCpuData ();
526 ASSERT (AcpiCpuData
!= NULL
);
528 // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
530 Status
= PcdSet64S (PcdCpuS3DataAddress
, (UINT64
)(UINTN
)AcpiCpuData
);
531 ASSERT_EFI_ERROR (Status
);
533 ASSERT (AcpiCpuData
->RegisterTable
!= 0);
534 CpuFeaturesData
->RegisterTable
= (CPU_REGISTER_TABLE
*) (UINTN
) AcpiCpuData
->RegisterTable
;
535 CpuFeaturesData
->PreSmmRegisterTable
= (CPU_REGISTER_TABLE
*) (UINTN
) AcpiCpuData
->PreSmmInitRegisterTable
;
539 RegisterTable
= &CpuFeaturesData
->PreSmmRegisterTable
[ProcessorNumber
];
541 RegisterTable
= &CpuFeaturesData
->RegisterTable
[ProcessorNumber
];
544 if (RegisterTable
->TableLength
== RegisterTable
->AllocatedSize
/ sizeof (CPU_REGISTER_TABLE_ENTRY
)) {
545 EnlargeRegisterTable (RegisterTable
);
549 // Append entry in the register table.
551 RegisterTableEntry
= (CPU_REGISTER_TABLE_ENTRY
*) (UINTN
) RegisterTable
->RegisterTableEntry
;
552 RegisterTableEntry
[RegisterTable
->TableLength
].RegisterType
= RegisterType
;
553 RegisterTableEntry
[RegisterTable
->TableLength
].Index
= (UINT32
) Index
;
554 RegisterTableEntry
[RegisterTable
->TableLength
].ValidBitStart
= ValidBitStart
;
555 RegisterTableEntry
[RegisterTable
->TableLength
].ValidBitLength
= ValidBitLength
;
556 RegisterTableEntry
[RegisterTable
->TableLength
].Value
= Value
;
558 RegisterTable
->TableLength
++;
562 Adds an entry in specified register table.
564 This function adds an entry in specified register table, with given register type,
565 register index, bit section and value.
567 @param[in] ProcessorNumber The index of the CPU to add a register table entry
568 @param[in] RegisterType Type of the register to program
569 @param[in] Index Index of the register to program
570 @param[in] ValueMask Mask of bits in register to write
571 @param[in] Value Value to write
573 @note This service could be called by BSP only.
577 CpuRegisterTableWrite (
578 IN UINTN ProcessorNumber
,
579 IN REGISTER_TYPE RegisterType
,
589 Start
= (UINT8
)LowBitSet64 (ValueMask
);
590 End
= (UINT8
)HighBitSet64 (ValueMask
);
591 Length
= End
- Start
+ 1;
592 CpuRegisterTableWriteWorker (FALSE
, ProcessorNumber
, RegisterType
, Index
, Start
, Length
, Value
);
596 Adds an entry in specified Pre-SMM register table.
598 This function adds an entry in specified register table, with given register type,
599 register index, bit section and value.
601 @param[in] ProcessorNumber The index of the CPU to add a register table entry.
602 @param[in] RegisterType Type of the register to program
603 @param[in] Index Index of the register to program
604 @param[in] ValueMask Mask of bits in register to write
605 @param[in] Value Value to write
607 @note This service could be called by BSP only.
611 PreSmmCpuRegisterTableWrite (
612 IN UINTN ProcessorNumber
,
613 IN REGISTER_TYPE RegisterType
,
623 Start
= (UINT8
)LowBitSet64 (ValueMask
);
624 End
= (UINT8
)HighBitSet64 (ValueMask
);
625 Length
= End
- Start
+ 1;
626 CpuRegisterTableWriteWorker (TRUE
, ProcessorNumber
, RegisterType
, Index
, Start
, Length
, Value
);
630 Worker function to determine if a CPU feature is set in input CPU feature bit mask buffer.
632 @param[in] CpuBitMask CPU feature bit mask buffer
633 @param[in] CpuBitMaskSize The size of CPU feature bit mask buffer
634 @param[in] Feature The bit number of the CPU feature
636 @retval TRUE The CPU feature is set in PcdCpuFeaturesSupport.
637 @retval FALSE The CPU feature is not set in PcdCpuFeaturesSupport.
641 IsCpuFeatureSetInCpuPcd (
642 IN UINT8
*CpuBitMask
,
643 IN UINTN CpuBitMaskSize
,
647 if ((Feature
>> 3) >= CpuBitMaskSize
) {
650 return ((*(CpuBitMask
+ (Feature
>> 3)) & (1 << (Feature
& 0x07))) != 0);
654 Determines if a CPU feature is enabled in PcdCpuFeaturesSupport bit mask.
655 If a CPU feature is disabled in PcdCpuFeaturesSupport then all the code/data
656 associated with that feature should be optimized away if compiler
657 optimizations are enabled.
659 @param[in] Feature The bit number of the CPU feature to check in the PCD
660 PcdCpuFeaturesSupport
662 @retval TRUE The CPU feature is set in PcdCpuFeaturesSupport.
663 @retval FALSE The CPU feature is not set in PcdCpuFeaturesSupport.
665 @note This service could be called by BSP only.
669 IsCpuFeatureSupported (
673 return IsCpuFeatureSetInCpuPcd (
674 (UINT8
*)PcdGetPtr (PcdCpuFeaturesSupport
),
675 PcdGetSize (PcdCpuFeaturesSupport
),
681 Determines if a CPU feature is set in PcdCpuFeaturesSetting bit mask.
683 @param[in] Feature The bit number of the CPU feature to check in the PCD
684 PcdCpuFeaturesSetting
686 @retval TRUE The CPU feature is set in PcdCpuFeaturesSetting.
687 @retval FALSE The CPU feature is not set in PcdCpuFeaturesSetting.
689 @note This service could be called by BSP only.
693 IsCpuFeatureInSetting (
697 return IsCpuFeatureSetInCpuPcd (
698 (UINT8
*)PcdGetPtr (PcdCpuFeaturesSetting
),
699 PcdGetSize (PcdCpuFeaturesSetting
),
705 Determines if a CPU feature is set in PcdCpuFeaturesCapability bit mask.
707 @param[in] Feature The bit number of the CPU feature to check in the PCD
708 PcdCpuFeaturesCapability
710 @retval TRUE The CPU feature is set in PcdCpuFeaturesCapability.
711 @retval FALSE The CPU feature is not set in PcdCpuFeaturesCapability.
713 @note This service could be called by BSP only.
717 IsCpuFeatureCapability (
721 return IsCpuFeatureSetInCpuPcd (
722 (UINT8
*)PcdGetPtr (PcdCpuFeaturesCapability
),
723 PcdGetSize (PcdCpuFeaturesCapability
),
730 Determines if a CPU feature is set in PcdCpuFeaturesUserConfiguration bit mask.
732 @param[in] Feature The bit number of the CPU feature to check in the PCD
733 PcdCpuFeaturesUserConfiguration
735 @retval TRUE The CPU feature is set in PcdCpuFeaturesUserConfiguration.
736 @retval FALSE The CPU feature is not set in PcdCpuFeaturesUserConfiguration.
738 @note This service could be called by BSP only.
742 IsCpuFeatureUserConfiguration (
746 return IsCpuFeatureSetInCpuPcd (
747 (UINT8
*)PcdGetPtr (PcdCpuFeaturesUserConfiguration
),
748 PcdGetSize (PcdCpuFeaturesUserConfiguration
),
755 Switches to assigned BSP after CPU features initialization.
757 @param[in] ProcessorNumber The index of the CPU executing this function.
759 @note This service could be called by BSP only.
763 SwitchBspAfterFeaturesInitialize (
764 IN UINTN ProcessorNumber
767 CPU_FEATURES_DATA
*CpuFeaturesData
;
769 CpuFeaturesData
= GetCpuFeaturesData ();
770 CpuFeaturesData
->BspNumber
= ProcessorNumber
;