UefiCpuPkg: Add MicrocodeLib for loading microcode
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3303 Signed-off-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Cc: Rahul Kumar <rahul1.kumar@intel.com>
This commit is contained in:
120
UefiCpuPkg/Include/Library/MicrocodeLib.h
Normal file
120
UefiCpuPkg/Include/Library/MicrocodeLib.h
Normal file
@@ -0,0 +1,120 @@
|
||||
/** @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
|
Reference in New Issue
Block a user