mirror of
https://github.com/LongSoft/UEFITool.git
synced 2024-11-22 07:58:22 +08:00
parent
1dccf3f15a
commit
6fdc69415b
@ -4310,6 +4310,11 @@ USTATUS FfsParser::parseIntelMicrocodeHeader(const UByteArray & microcode, const
|
||||
dataSize = INTEL_MICROCODE_REAL_DATA_SIZE_ON_ZERO;
|
||||
}
|
||||
|
||||
// Cross check DataSize and TotalSize
|
||||
if (ucodeHeader->TotalSize < sizeof(INTEL_MICROCODE_HEADER) + dataSize) {
|
||||
return U_INVALID_MICROCODE;
|
||||
}
|
||||
|
||||
// Recalculate the whole microcode checksum
|
||||
UByteArray tempMicrocode = microcode;
|
||||
INTEL_MICROCODE_HEADER* tempUcodeHeader = (INTEL_MICROCODE_HEADER*)(tempMicrocode.data());
|
||||
@ -4320,10 +4325,16 @@ USTATUS FfsParser::parseIntelMicrocodeHeader(const UByteArray & microcode, const
|
||||
// Construct header, body and tail
|
||||
UByteArray header = microcode.left(sizeof(INTEL_MICROCODE_HEADER));
|
||||
UByteArray body = microcode.mid(sizeof(INTEL_MICROCODE_HEADER), dataSize);
|
||||
UByteArray tail = microcode.mid(sizeof(INTEL_MICROCODE_HEADER) + dataSize);
|
||||
UByteArray tail;
|
||||
|
||||
// Check if the tail is present
|
||||
if (ucodeHeader->TotalSize > sizeof(INTEL_MICROCODE_HEADER) + dataSize) {
|
||||
tail = microcode.mid(sizeof(INTEL_MICROCODE_HEADER) + dataSize, ucodeHeader->TotalSize - (sizeof(INTEL_MICROCODE_HEADER) + dataSize));
|
||||
}
|
||||
|
||||
// Check if we have extended header in the tail
|
||||
UString extendedHeaderInfo;
|
||||
bool msgUnknownOrDamagedMicrocodeTail = false;
|
||||
if ((UINT32)tail.size() >= sizeof(INTEL_MICROCODE_EXTENDED_HEADER)) {
|
||||
const INTEL_MICROCODE_EXTENDED_HEADER* extendedHeader = (const INTEL_MICROCODE_EXTENDED_HEADER*)tail.constData();
|
||||
|
||||
@ -4339,7 +4350,7 @@ USTATUS FfsParser::parseIntelMicrocodeHeader(const UByteArray & microcode, const
|
||||
// We have more than 0 entries and they are all in the tail
|
||||
if (extendedReservedBytesValid
|
||||
&& extendedHeader->EntryCount > 0
|
||||
&& (UINT32)tail.size() >= sizeof(INTEL_MICROCODE_EXTENDED_HEADER) + extendedHeader->EntryCount * sizeof(INTEL_MICROCODE_EXTENDED_HEADER_ENTRY)) {
|
||||
&& (UINT32)tail.size() == sizeof(INTEL_MICROCODE_EXTENDED_HEADER) + extendedHeader->EntryCount * sizeof(INTEL_MICROCODE_EXTENDED_HEADER_ENTRY)) {
|
||||
// Recalculate extended header checksum
|
||||
INTEL_MICROCODE_EXTENDED_HEADER* tempExtendedHeader = (INTEL_MICROCODE_EXTENDED_HEADER*)(tempMicrocode.data() + sizeof(INTEL_MICROCODE_HEADER) + dataSize);
|
||||
tempExtendedHeader->Checksum = 0;
|
||||
@ -4367,16 +4378,23 @@ USTATUS FfsParser::parseIntelMicrocodeHeader(const UByteArray & microcode, const
|
||||
+ (entry->Checksum == entryCalculated ? UString("valid") : usprintf("invalid, should be %08Xh", entryCalculated));
|
||||
}
|
||||
}
|
||||
else {
|
||||
msgUnknownOrDamagedMicrocodeTail = true;
|
||||
}
|
||||
}
|
||||
else if (tail.size() != 0) {
|
||||
msgUnknownOrDamagedMicrocodeTail = true;
|
||||
}
|
||||
|
||||
// Get microcode binary
|
||||
UByteArray microcodeBinary = microcode.left(ucodeHeader->TotalSize);
|
||||
|
||||
// Add info
|
||||
UString name("Intel microcode");
|
||||
UString info = usprintf("Full size: %Xh (%u)\nHeader size: %Xh (%u)\nBody size: %Xh (%u)\nTail size: %Xh (%u)\n"
|
||||
UString info = usprintf("Full size: %Xh (%u)\nHeader size: 0h (0u)\nBody size: %Xh (%u)\nTail size: 0h (0u)\n"
|
||||
"Date: %02X.%02X.%04x\nCPU signature: %08Xh\nRevision: %08Xh\nCPU flags: %02Xh\nChecksum: %08Xh, ",
|
||||
dataSize, dataSize,
|
||||
header.size(), header.size(),
|
||||
body.size(), body.size(),
|
||||
tail.size(), tail.size(),
|
||||
microcodeBinary.size(), microcodeBinary.size(),
|
||||
microcodeBinary.size(), microcodeBinary.size(),
|
||||
ucodeHeader->DateDay,
|
||||
ucodeHeader->DateMonth,
|
||||
ucodeHeader->DateYear,
|
||||
@ -4388,9 +4406,11 @@ USTATUS FfsParser::parseIntelMicrocodeHeader(const UByteArray & microcode, const
|
||||
+ extendedHeaderInfo;
|
||||
|
||||
// Add tree item
|
||||
index = model->addItem(localOffset, Types::Microcode, Subtypes::IntelMicrocode, name, UString(), info, header, body, tail, Fixed, parent);
|
||||
index = model->addItem(localOffset, Types::Microcode, Subtypes::IntelMicrocode, name, UString(), info, UByteArray(), microcodeBinary, UByteArray(), Fixed, parent);
|
||||
if (msgInvalidChecksum)
|
||||
msg(usprintf("%s: invalid microcode checksum %08Xh, should be %08Xh", __FUNCTION__, ucodeHeader->Checksum, calculated), index);
|
||||
if (msgUnknownOrDamagedMicrocodeTail)
|
||||
msg(usprintf("%s: extended header of size %Xh (%u) found, but it's damaged or has unknown format", __FUNCTION__, tail.size(), tail.size()), index);
|
||||
|
||||
// No need to parse the body further for now
|
||||
return U_SUCCESS;
|
||||
|
Loading…
Reference in New Issue
Block a user