| /** @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 |