From 248512571fe86a45c03423fe893dc2e81c1ac117 Mon Sep 17 00:00:00 2001 From: Maurice Ma Date: Mon, 11 Oct 2021 06:17:24 -0700 Subject: [PATCH] Enhance IfwiUtility script to handle BIOS region gap The current SBL IfwiUtility script assumes the SBL image size occupies the full BIOS region. However, in some case, gap may exist at the beginning of the BIOS region. SBL image will not always start at BIOS region offset 0. This patch added special handling to support this case. Signed-off-by: Maurice Ma --- BootloaderCorePkg/Tools/IfwiUtility.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/BootloaderCorePkg/Tools/IfwiUtility.py b/BootloaderCorePkg/Tools/IfwiUtility.py index 75cbe5f2..84fb01b3 100644 --- a/BootloaderCorePkg/Tools/IfwiUtility.py +++ b/BootloaderCorePkg/Tools/IfwiUtility.py @@ -1,6 +1,6 @@ ## @ ifwi_utility.py # -# copyright (c) 2019, intel corporation. all rights reserved.
+# copyright (c) 2019 - 2021, intel corporation. all rights reserved.
# SPDX-license-identifier: BSD-2-clause-patent # ## @@ -673,22 +673,29 @@ class IFWI_PARSER: @staticmethod def parse_bios_region (img_data, base_off = 0): - offset = bytes_to_value(img_data[-8:-4]) - (0x100000000 - len(img_data)) - if offset <0 or offset >= len(img_data) - 0x10: + rgn_size = len(img_data) + offset = bytes_to_value(img_data[-8:-4]) - (0x100000000 - rgn_size) + if offset < 0 or offset >= rgn_size - sizeof(FLASH_MAP_DESC): return None fla_map_off = offset - if bytes_to_value(img_data[fla_map_off:fla_map_off+4]) != 0x504d4c46: + mst_desc = FLASH_MAP_DESC.from_buffer (img_data, fla_map_off) + if mst_desc.sig != FLASH_MAP.FLASH_MAP_SIGNATURE: return None - bios_comp = COMPONENT('BIOS', COMPONENT.COMP_TYPE['RGN'], base_off, len(img_data)) + sbl_size = mst_desc.size + sbl_off = rgn_size - sbl_size + if sbl_off < 0: + return None + + bios_comp = COMPONENT('BIOS', COMPONENT.COMP_TYPE['RGN'], base_off, rgn_size) curr_part = -1 fla_map_str = FLASH_MAP.from_buffer (img_data, fla_map_off) entry_num = (fla_map_str.length - sizeof(FLASH_MAP)) // sizeof(FLASH_MAP_DESC) for idx in range (entry_num): idx = entry_num - 1 - idx desc = FLASH_MAP_DESC.from_buffer (img_data, fla_map_off + sizeof(FLASH_MAP) + idx * sizeof(FLASH_MAP_DESC)) - file_comp = COMPONENT(desc.sig.decode(), COMPONENT.COMP_TYPE['FILE'], desc.offset + base_off, desc.size) + file_comp = COMPONENT(desc.sig.decode(), COMPONENT.COMP_TYPE['FILE'], desc.offset + sbl_off + base_off, desc.size) if curr_part != desc.flags & 0x4F: curr_part = desc.flags & 0x4F part_comp = COMPONENT('%s' % (FLASH_MAP.FLASH_MAP_REGION[curr_part]), COMPONENT.COMP_TYPE['PART'], desc.offset + base_off, desc.size)