[PATCH 0/6] Miscellaneous FWU fixes
Michal Simek
michal.simek at amd.com
Thu Sep 5 09:33:35 CEST 2024
On 9/5/24 08:24, Sughosh Ganu wrote:
> On Wed, 4 Sept 2024 at 17:30, Michal Simek <michal.simek at amd.com> wrote:
>>
>>
>>
>> On 8/30/24 13:40, Sughosh Ganu wrote:
>>>
>>> The following set of patches are miscellaneous fixes and some
>>> hardening of the FWU update logic.
>>>
>>> Sughosh Ganu (6):
>>> fwu: v2: perform some checks before reading metadata
>>> fwu: v2: try reading both copies of metadata
>>> fwu: v1: do a version check for the metadata
>>> fwu: check all images for transitioning out of Trial State
>>> fwu: add dependency checks for selecting FWU metadata version
>>> fwu: do not allow capsule processing on exceeding Trial Counter
>>> threshold
>>>
>>> include/fwu.h | 11 ++++++
>>> lib/fwu_updates/Kconfig | 1 +
>>> lib/fwu_updates/fwu.c | 31 +++++++++++++++-
>>> lib/fwu_updates/fwu_v1.c | 18 +++++++--
>>> lib/fwu_updates/fwu_v2.c | 80 ++++++++++++++++++++++------------------
>>> 5 files changed, 99 insertions(+), 42 deletions(-)
>>>
>>
>> I found one more thing.
>>
>> I did this change
>>
>> diff --git a/tools/mkfwumdata.c b/tools/mkfwumdata.c
>> index fbc2067bc12d..dab9530e499c 100644
>> --- a/tools/mkfwumdata.c
>> +++ b/tools/mkfwumdata.c
>> @@ -293,7 +293,7 @@ static void fwu_fill_version_specific_mdata(struct
>> fwu_mdata_object *mobj)
>> struct fwu_mdata *mdata = mobj->mdata;
>>
>> mdata->metadata_size = mobj->size;
>> - mdata->desc_offset = sizeof(struct fwu_mdata);
>> + mdata->desc_offset = 0x21; sizeof(struct fwu_mdata);
>>
>> for (i = 0; i < MAX_BANKS_V2; i++)
>> mdata->bank_state[i] = i < mobj->banks ?
>>
>>
>> to break desc_offset location. I generated mdata structure and write it to
>> primary mdata partition.
>>
>> This has been spotted by (my debug) which is the reason why I did it.
>>
>> if (g_mdata.desc_offset != FWU_IMG_DESC_OFFSET) {
>> printf("mdata offset is not 0x20\n");
>> return false;
>> }
>>
>> But I got one more message below which
>>
>> mdata offset is not 0x20
>> Both FWU metadata copies are valid but do not match. Restoring the secondary
>> partition from the primary
>
> The reason why this logic is in place is to handle the scenario
> whereby, during the metadata update, the primary copy gets updated
> correctly, but due to some reason (like a power cut), the secondary
> copy does not -- this is because the primary copy gets updated first.
> In such a scenario, the secondary copy of metadata can be then
> restored from the primary copy. In the scenario where the primary copy
> is corrupted, it will show up in the crc check, and will get restored
> from the secondary copy.
But in this case - CRC of primary is correct but data inside is wrong because
offset is at 0x21 not at 0x20.
That likely means that U-Boot is not actually using this field to find where
data is but I think that's fine to say not supported mdata structure but u-boot
should never copy this "primary broken" description to secondary one as syncup.
M
More information about the U-Boot
mailing list