TianoCore EDK2 master
|
#include <Uefi/UefiBaseType.h>
#include <Register/Intel/Cpuid.h>
#include <Register/Intel/ArchitecturalMsr.h>
#include <Register/Intel/Microcode.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Ppi/ShadowMicrocode.h>
Go to the source code of this file.
Functions | |
UINT32 EFIAPI | GetProcessorMicrocodeSignature (VOID) |
VOID EFIAPI | GetProcessorMicrocodeCpuId (EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId) |
UINT32 EFIAPI | GetMicrocodeLength (IN CPU_MICROCODE_HEADER *Microcode) |
VOID EFIAPI | LoadMicrocode (IN CPU_MICROCODE_HEADER *Microcode) |
BOOLEAN | IsProcessorMatchedMicrocode (IN UINT32 ProcessorSignature, IN UINT32 ProcessorFlags, IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId, IN UINTN MicrocodeCpuIdCount) |
BOOLEAN EFIAPI | IsValidMicrocode (IN CPU_MICROCODE_HEADER *Microcode, IN UINTN MicrocodeLength, IN UINT32 MinimumRevision, IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds, IN UINTN MicrocodeCpuIdCount, IN BOOLEAN VerifyChecksum) |
Implementation of MicrocodeLib.
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
Definition in file MicrocodeLib.c.
UINT32 EFIAPI GetMicrocodeLength | ( | IN CPU_MICROCODE_HEADER * | Microcode | ) |
Return the total size of the microcode entry.
Logic follows pseudo code in SDM as below:
N = 512 If (Update.DataSize != 00000000H) N = Update.TotalSize / 4
If Microcode is NULL, then ASSERT.
Microcode | Pointer to the microcode entry. |
Definition at line 73 of file MicrocodeLib.c.
VOID EFIAPI GetProcessorMicrocodeCpuId | ( | EDKII_PEI_MICROCODE_CPU_ID * | MicrocodeCpuId | ) |
Get the processor signature and platform ID for current processor.
MicrocodeCpuId | Return the processor signature and platform ID. |
Definition at line 43 of file MicrocodeLib.c.
UINT32 EFIAPI GetProcessorMicrocodeSignature | ( | VOID | ) |
Get microcode update signature of currently loaded microcode update.
Definition at line 24 of file MicrocodeLib.c.
BOOLEAN IsProcessorMatchedMicrocode | ( | IN UINT32 | ProcessorSignature, |
IN UINT32 | ProcessorFlags, | ||
IN EDKII_PEI_MICROCODE_CPU_ID * | MicrocodeCpuId, | ||
IN UINTN | MicrocodeCpuIdCount | ||
) |
Determine if a microcode patch matchs the specific processor signature and flag.
[in] | ProcessorSignature | The processor signature field value in a microcode patch. |
[in] | ProcessorFlags | The processor flags field value in a microcode patch. |
[in] | MicrocodeCpuId | A pointer to an array of EDKII_PEI_MICROCODE_CPU_ID structures. |
[in] | MicrocodeCpuIdCount | Number of elements in MicrocodeCpuId array. |
TRUE | The specified microcode patch matches to one of the MicrocodeCpuId. |
FALSE | The specified microcode patch doesn't match to any of the MicrocodeCpuId. |
Definition at line 122 of file MicrocodeLib.c.
BOOLEAN EFIAPI IsValidMicrocode | ( | IN CPU_MICROCODE_HEADER * | Microcode, |
IN UINTN | MicrocodeLength, | ||
IN UINT32 | MinimumRevision, | ||
IN EDKII_PEI_MICROCODE_CPU_ID * | MicrocodeCpuIds, | ||
IN UINTN | MicrocodeCpuIdCount, | ||
IN BOOLEAN | VerifyChecksum | ||
) |
Detect whether specified processor can find matching microcode patch and load it.
Microcode format is as below: +-------------------------------------—+----------------------------------------------—+ | CPU_MICROCODE_HEADER | | +-------------------------------------—+ V | Update Data | CPU_MICROCODE_HEADER.Checksum +-------------------------------------—+----—+ ^ | CPU_MICROCODE_EXTENDED_TABLE_HEADER | | | +-------------------------------------—+ V | | CPU_MICROCODE_EXTENDED_TABLE[0] | CPU_MICROCODE_EXTENDED_TABLE_HEADER.Checksum | | CPU_MICROCODE_EXTENDED_TABLE[1] | ^ | | ... | | | +-------------------------------------—+----—+--------------------------------------—+
There may by multiple CPU_MICROCODE_EXTENDED_TABLE in this format. The count of CPU_MICROCODE_EXTENDED_TABLE is indicated by ExtendedSignatureCount of CPU_MICROCODE_EXTENDED_TABLE_HEADER structure.
If Microcode is NULL, then ASSERT.
Microcode | Pointer to a microcode entry. |
MicrocodeLength | The total length of the microcode entry. |
MinimumRevision | The microcode whose revision <= MinimumRevision is treated as invalid. Caller can supply value get from GetProcessorMicrocodeSignature() to check whether the microcode is newer than loaded one. Caller can supply 0 to treat any revision (except 0) microcode as valid. |
MicrocodeCpuIds | Pointer to an array of processor signature and platform ID that represents a set of processors. Caller can supply zero-element array to skip the processor signature and platform ID check. |
MicrocodeCpuIdCount | The number of elements in MicrocodeCpuIds. |
VerifyChecksum | FALSE to skip all the checksum verifications. |
TRUE | The microcode is valid. |
FALSE | The microcode is invalid. |
Definition at line 186 of file MicrocodeLib.c.
VOID EFIAPI LoadMicrocode | ( | IN CPU_MICROCODE_HEADER * | Microcode | ) |
Load the microcode to the processor.
If Microcode is NULL, then ASSERT.
Microcode | Pointer to the microcode entry. |
Definition at line 98 of file MicrocodeLib.c.