| /** @file | |
| Public include file for Microcode library. | |
| Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef MICROCODE_LIB_H_ | |
| #define MICROCODE_LIB_H_ | |
| #include <Register/Intel/Microcode.h> | |
| #include <Ppi/ShadowMicrocode.h> | |
| /** | |
| Get microcode update signature of currently loaded microcode update. | |
| @return Microcode signature. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetProcessorMicrocodeSignature ( | |
| VOID | |
| ); | |
| /** | |
| Get the processor signature and platform ID for current processor. | |
| @param MicrocodeCpuId Return the processor signature and platform ID. | |
| **/ | |
| VOID | |
| EFIAPI | |
| GetProcessorMicrocodeCpuId ( | |
| EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId | |
| ); | |
| /** | |
| 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. | |
| @param Microcode Pointer to the microcode entry. | |
| @return The microcode total size. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| GetMicrocodeLength ( | |
| IN CPU_MICROCODE_HEADER *Microcode | |
| ); | |
| /** | |
| Load the microcode to the processor. | |
| If Microcode is NULL, then ASSERT. | |
| @param Microcode Pointer to the microcode entry. | |
| **/ | |
| VOID | |
| EFIAPI | |
| LoadMicrocode ( | |
| IN CPU_MICROCODE_HEADER *Microcode | |
| ); | |
| /** | |
| 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. | |
| @param Microcode Pointer to a microcode entry. | |
| @param MicrocodeLength The total length of the microcode entry. | |
| @param 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. | |
| @param 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. | |
| @param MicrocodeCpuIdCount The number of elements in MicrocodeCpuIds. | |
| @param VerifyChecksum FALSE to skip all the checksum verifications. | |
| @retval TRUE The microcode is valid. | |
| @retval FALSE The microcode is invalid. | |
| **/ | |
| 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 | |
| ); | |
| #endif |