mirror of
https://github.com/LongSoft/UEFITool.git
synced 2024-11-25 17:38:22 +08:00
Improve descriptor version handling
This commit is contained in:
parent
3eae2e4fdc
commit
ec38091599
@ -36,18 +36,15 @@ typedef struct FLASH_DESCRIPTOR_HEADER_ {
|
|||||||
|
|
||||||
// Descriptor version was reserved in older firmware
|
// Descriptor version was reserved in older firmware
|
||||||
#define FLASH_DESCRIPTOR_VERSION_INVALID 0xFFFFFFFF
|
#define FLASH_DESCRIPTOR_VERSION_INVALID 0xFFFFFFFF
|
||||||
|
// The only known version found in Coffee Lake
|
||||||
|
#define FLASH_DESCRIPTOR_VERSION_MAJOR 1
|
||||||
|
#define FLASH_DESCRIPTOR_VERSION_MINOR 0
|
||||||
|
|
||||||
// Descriptor version present in Coffee Lake and newer
|
// Descriptor version present in Coffee Lake and newer
|
||||||
typedef struct _FLASH_DESCRIPTOR_VERSION_V3 {
|
typedef struct _FLASH_DESCRIPTOR_VERSION {
|
||||||
UINT32 Reserved : 14;
|
UINT32 Reserved : 14;
|
||||||
UINT32 VersionMinor : 7;
|
UINT32 Minor : 7;
|
||||||
UINT32 VersionMajor : 11;
|
UINT32 Major : 11;
|
||||||
} FLASH_DESCRIPTOR_VERSION_V3;
|
|
||||||
|
|
||||||
// Descripror version
|
|
||||||
typedef union _FLASH_DESCRIPTOR_VERSION {
|
|
||||||
UINT32 RawValue;
|
|
||||||
FLASH_DESCRIPTOR_VERSION_V3 V3;
|
|
||||||
} FLASH_DESCRIPTOR_VERSION;
|
} FLASH_DESCRIPTOR_VERSION;
|
||||||
|
|
||||||
// Descriptor map
|
// Descriptor map
|
||||||
@ -71,7 +68,7 @@ typedef struct FLASH_DESCRIPTOR_MAP_ {
|
|||||||
UINT32 NumberOfProcStraps : 8; // One-based number of UINT32s to read as processor straps, min=0, max=255 (1 Kb)
|
UINT32 NumberOfProcStraps : 8; // One-based number of UINT32s to read as processor straps, min=0, max=255 (1 Kb)
|
||||||
UINT32 : 16;
|
UINT32 : 16;
|
||||||
// FLMAP 3
|
// FLMAP 3
|
||||||
FLASH_DESCRIPTOR_VERSION Version; // Reserved prior to v3
|
UINT32 DescriptorVersion; // Reserved prior to Coffee Lake
|
||||||
} FLASH_DESCRIPTOR_MAP;
|
} FLASH_DESCRIPTOR_MAP;
|
||||||
|
|
||||||
// Component section
|
// Component section
|
||||||
|
@ -317,14 +317,10 @@ USTATUS FfsParser::parseIntelImage(const UByteArray & intelImage, const UINT32 l
|
|||||||
const FLASH_DESCRIPTOR_REGION_SECTION* regionSection = (const FLASH_DESCRIPTOR_REGION_SECTION*)calculateAddress8((UINT8*)descriptor, descriptorMap->RegionBase);
|
const FLASH_DESCRIPTOR_REGION_SECTION* regionSection = (const FLASH_DESCRIPTOR_REGION_SECTION*)calculateAddress8((UINT8*)descriptor, descriptorMap->RegionBase);
|
||||||
const FLASH_DESCRIPTOR_COMPONENT_SECTION* componentSection = (const FLASH_DESCRIPTOR_COMPONENT_SECTION*)calculateAddress8((UINT8*)descriptor, descriptorMap->ComponentBase);
|
const FLASH_DESCRIPTOR_COMPONENT_SECTION* componentSection = (const FLASH_DESCRIPTOR_COMPONENT_SECTION*)calculateAddress8((UINT8*)descriptor, descriptorMap->ComponentBase);
|
||||||
|
|
||||||
UINT8 descriptorVersion = 0;
|
UINT8 descriptorVersion = 2;
|
||||||
if (descriptorMap->Version.RawValue != FLASH_DESCRIPTOR_VERSION_INVALID) // Kaby Lake+ descriptor
|
|
||||||
descriptorVersion = 3;
|
|
||||||
// Check descriptor version by getting hardcoded value of FlashParameters.ReadClockFrequency
|
// Check descriptor version by getting hardcoded value of FlashParameters.ReadClockFrequency
|
||||||
else if (componentSection->FlashParameters.ReadClockFrequency == FLASH_FREQUENCY_20MHZ) // Old descriptor
|
if (componentSection->FlashParameters.ReadClockFrequency == FLASH_FREQUENCY_20MHZ)
|
||||||
descriptorVersion = 1;
|
descriptorVersion = 1;
|
||||||
else // Skylake+ descriptor
|
|
||||||
descriptorVersion = 2;
|
|
||||||
|
|
||||||
// Regions
|
// Regions
|
||||||
std::vector<REGION_INFO> regions;
|
std::vector<REGION_INFO> regions;
|
||||||
@ -374,7 +370,7 @@ USTATUS FfsParser::parseIntelImage(const UByteArray & intelImage, const UINT32 l
|
|||||||
// Add all other regions
|
// Add all other regions
|
||||||
for (UINT8 i = Subtypes::GbeRegion; i <= Subtypes::PttRegion; i++) {
|
for (UINT8 i = Subtypes::GbeRegion; i <= Subtypes::PttRegion; i++) {
|
||||||
if (descriptorVersion == 1 && i == Subtypes::MicrocodeRegion)
|
if (descriptorVersion == 1 && i == Subtypes::MicrocodeRegion)
|
||||||
break; // Do not parse Microcode and other following regions for old descriptors
|
break; // Do not parse Microcode and other following regions for legacy descriptors
|
||||||
|
|
||||||
const UINT16* RegionBase = ((const UINT16*)regionSection) + 2 * i;
|
const UINT16* RegionBase = ((const UINT16*)regionSection) + 2 * i;
|
||||||
const UINT16* RegionLimit = ((const UINT16*)regionSection) + 2 * i + 1;
|
const UINT16* RegionLimit = ((const UINT16*)regionSection) + 2 * i + 1;
|
||||||
@ -507,7 +503,7 @@ USTATUS FfsParser::parseIntelImage(const UByteArray & intelImage, const UINT32 l
|
|||||||
info += usprintf("\nPDR %s %s", masterSection->BiosRead & FLASH_DESCRIPTOR_REGION_ACCESS_PDR ? "Yes " : "No ",
|
info += usprintf("\nPDR %s %s", masterSection->BiosRead & FLASH_DESCRIPTOR_REGION_ACCESS_PDR ? "Yes " : "No ",
|
||||||
masterSection->BiosWrite & FLASH_DESCRIPTOR_REGION_ACCESS_PDR ? "Yes " : "No ");
|
masterSection->BiosWrite & FLASH_DESCRIPTOR_REGION_ACCESS_PDR ? "Yes " : "No ");
|
||||||
}
|
}
|
||||||
else if (descriptorVersion >= 2) {
|
else if (descriptorVersion == 2) {
|
||||||
const FLASH_DESCRIPTOR_MASTER_SECTION_V2* masterSection = (const FLASH_DESCRIPTOR_MASTER_SECTION_V2*)calculateAddress8((UINT8*)descriptor, descriptorMap->MasterBase);
|
const FLASH_DESCRIPTOR_MASTER_SECTION_V2* masterSection = (const FLASH_DESCRIPTOR_MASTER_SECTION_V2*)calculateAddress8((UINT8*)descriptor, descriptorMap->MasterBase);
|
||||||
info += UString("\nRegion access settings:");
|
info += UString("\nRegion access settings:");
|
||||||
info += usprintf("\nBIOS: %03Xh %03Xh ME: %03Xh %03Xh\nGbE: %03Xh %03Xh EC: %03Xh %03Xh",
|
info += usprintf("\nBIOS: %03Xh %03Xh ME: %03Xh %03Xh\nGbE: %03Xh %03Xh EC: %03Xh %03Xh",
|
||||||
@ -539,6 +535,17 @@ USTATUS FfsParser::parseIntelImage(const UByteArray & intelImage, const UINT32 l
|
|||||||
info += usprintf("\nEC %s %s",
|
info += usprintf("\nEC %s %s",
|
||||||
masterSection->BiosRead & FLASH_DESCRIPTOR_REGION_ACCESS_EC ? "Yes " : "No ",
|
masterSection->BiosRead & FLASH_DESCRIPTOR_REGION_ACCESS_EC ? "Yes " : "No ",
|
||||||
masterSection->BiosWrite & FLASH_DESCRIPTOR_REGION_ACCESS_EC ? "Yes " : "No ");
|
masterSection->BiosWrite & FLASH_DESCRIPTOR_REGION_ACCESS_EC ? "Yes " : "No ");
|
||||||
|
|
||||||
|
// Prepend descriptor version if present
|
||||||
|
if (descriptorMap->DescriptorVersion != FLASH_DESCRIPTOR_VERSION_INVALID) {
|
||||||
|
const FLASH_DESCRIPTOR_VERSION* version = (const FLASH_DESCRIPTOR_VERSION*)&descriptorMap->DescriptorVersion;
|
||||||
|
UString versionStr = usprintf("Flash descriptor version: %d.%d", version->Major, version->Minor);
|
||||||
|
if (version->Major != FLASH_DESCRIPTOR_VERSION_MAJOR || version->Minor != FLASH_DESCRIPTOR_VERSION_MINOR) {
|
||||||
|
versionStr += ", unknown";
|
||||||
|
msg(usprintf("%s: unknown flash descriptor version %d.%d", __FUNCTION__, version->Major, version->Minor));
|
||||||
|
}
|
||||||
|
info = versionStr + "\n" + info;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// VSCC table
|
// VSCC table
|
||||||
|
Loading…
Reference in New Issue
Block a user