Skip to content

Commit 01e2e08

Browse files
committed
Add FFS volume parser for non-AMI NVRAM areas
1 parent 4e2a8f6 commit 01e2e08

1 file changed

Lines changed: 33 additions & 1 deletion

File tree

common/nvramparser.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1250,8 +1250,40 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index,const UINT32
12501250
if (U_SUCCESS != ffsParser->parseIntelMicrocodeHeader(ucode, storeOffset, index, ucodeIndex)) {
12511251
throw 0;
12521252
}
1253+
1254+
UINT32 storeSize = ucodeHeader->TotalSize;
12531255

1254-
storeOffset += ucodeHeader->TotalSize - 1;
1256+
storeOffset += storeSize - 1;
1257+
previousStoreEndOffset = storeOffset + 1;
1258+
continue;
1259+
} catch (...) {
1260+
// Parsing failed, try something else
1261+
}
1262+
1263+
// FFS volume
1264+
try {
1265+
// Check data size
1266+
if (volumeBodySize - storeOffset < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) {
1267+
throw 0;
1268+
}
1269+
1270+
// Check volume header candidate
1271+
const EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (const EFI_FIRMWARE_VOLUME_HEADER*)(volumeBody.constData() + storeOffset);
1272+
if (volumeHeader->Signature != EFI_FV_SIGNATURE) {
1273+
throw 0;
1274+
}
1275+
1276+
// All checks passed, volume found
1277+
UByteArray volume = volumeBody.mid(storeOffset);
1278+
UModelIndex volumeIndex;
1279+
if (U_SUCCESS != ffsParser->parseVolumeHeader(volume, storeOffset, index, volumeIndex)) {
1280+
throw 0;
1281+
}
1282+
1283+
(VOID)ffsParser->parseVolumeBody(volumeIndex);
1284+
UINT32 storeSize = (UINT32)(model->header(volumeIndex).size() + model->body(volumeIndex).size());
1285+
1286+
storeOffset += storeSize - 1;
12551287
previousStoreEndOffset = storeOffset + 1;
12561288
continue;
12571289
} catch (...) {

0 commit comments

Comments
 (0)