On 13 June 2018 at 01:03, Leif Lindholm <leif.lindh...@linaro.org> wrote:
> On Thu, Jun 07, 2018 at 05:08:17PM +0200, Ard Biesheuvel wrote:
>> In commit 913fdda9f4b9 ("Silicon/SynQuacerPlatformFlashAccessLib: don't
>> dereference FVB header fields"), we dropped all accesses to FVB header
>> field, which was necessary because the flash partition may not in fact
>> contain such a header. Instead, only an exact match on the base address
>> of the FV compared to the base address of the capsule payload would
>> result in a match, making it difficult to create capsules that only
>> update a subset of the flash contents.
>>
>> Given that the FVB protocol provides a GetBlockSize() method that also
>> returns the number of consecutive blocks of that size, and does not rely
>> on the FVB header contents, we can actually infer the size of the flash
>> partition, and use it to decide whether a capsule payload targets an
>> area that is covered by this partition entirely.
>>
>> This optimization allows us to extend the FV description to include the
>> SCP firmware partition without requiring us to actually provide a
>> payload for that partition immediately, which is useful as a preparatory
>> step.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
>> ---
>>  
>> Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformFlashAccessLib/SynQuacerPlatformFlashAccessLib.c
>>  | 53 +++++++++-----------
>>  1 file changed, 25 insertions(+), 28 deletions(-)
>>
>> diff --git 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformFlashAccessLib/SynQuacerPlatformFlashAccessLib.c
>>  
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformFlashAccessLib/SynQuacerPlatformFlashAccessLib.c
>> index ebb6ce189aa5..a6843c949a28 100644
>> --- 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformFlashAccessLib/SynQuacerPlatformFlashAccessLib.c
>> +++ 
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformFlashAccessLib/SynQuacerPlatformFlashAccessLib.c
>> @@ -44,8 +44,10 @@ STATIC
>>  EFI_STATUS
>>  GetFvbByAddress (
>>    IN  EFI_PHYSICAL_ADDRESS                Address,
>> +  IN  UINTN                               Length,
>>    OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  **OutFvb,
>> -  OUT EFI_PHYSICAL_ADDRESS                *FvbBaseAddress
>> +  OUT EFI_LBA                             *Lba,
>> +  OUT UINTN                               *BlockSize
>>    )
>>  {
>>    EFI_STATUS                          Status;
>> @@ -54,6 +56,8 @@ GetFvbByAddress (
>>    UINTN                               Index;
>>    EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *Fvb;
>>    EFI_FVB_ATTRIBUTES_2                Attributes;
>> +  EFI_PHYSICAL_ADDRESS                FvbBaseAddress;
>> +  UINTN                               NumberOfBlocks;
>>
>>    //
>>    // Locate all handles with Firmware Volume Block protocol
>> @@ -84,7 +88,7 @@ GetFvbByAddress (
>>      //
>>      // Checks if the address range of this handle contains parameter Address
>>      //
>> -    Status = Fvb->GetPhysicalAddress (Fvb, FvbBaseAddress);
>> +    Status = Fvb->GetPhysicalAddress (Fvb, &FvbBaseAddress);
>>      if (EFI_ERROR (Status)) {
>>        continue;
>>      }
>> @@ -102,8 +106,25 @@ GetFvbByAddress (
>>        continue;
>>      }
>>
>> -    if (Address == *FvbBaseAddress) {
>> +    Status = Fvb->GetBlockSize (Fvb, 0, BlockSize, &NumberOfBlocks);
>> +    if (EFI_ERROR (Status)) {
>> +      DEBUG ((DEBUG_INFO, "%a: failed to get FVB blocksize - %r, 
>> ignoring\n",
>> +        __FUNCTION__, Status));
>> +      continue;
>> +    }
>> +
>> +    if ((Length % *BlockSize) != 0) {
>> +      DEBUG ((DEBUG_INFO,
>> +        "%a: Length 0x%lx is not a multiple of the blocksize 0x%lx, 
>> ignoring\n",
>> +        __FUNCTION__, Length, *BlockSize));
>> +      Status = EFI_INVALID_PARAMETER;
>> +      continue;
>> +    }
>> +
>> +    if (Address >= FvbBaseAddress &&
>> +        (Address + Length) <= (FvbBaseAddress + *BlockSize * 
>> NumberOfBlocks)) {
>
> As I've already been giving Marcin a hard time about this today, could you add
> parentheses around "Address >= FvbBaseAddress" and "*BlockSize * 
> NumberOfBlocks"?
>

Sure. But to be consistent, shouldn't I also add parens around the
entire term after the && then?

I.e.,

+    if ((Address >= FvbBaseAddress) &&
+        ((Address + Length) <= (FvbBaseAddress + (*BlockSize *
NumberOfBlocks)))) {

I'm not sure why we like redundant parentheses so much in Tianocore,
but I don't particularly mind either.



>>        *OutFvb  = Fvb;
>> +      *Lba = (Address - FvbBaseAddress) / *BlockSize;
>>        Status   = EFI_SUCCESS;
>>        break;
>>      }
>> @@ -190,9 +211,7 @@ PerformFlashWriteWithProgress (
>>    EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *Fvb;
>>    EFI_STATUS                          Status;
>>    UINTN                               BlockSize;
>> -  UINTN                               NumberOfBlocks;
>>    EFI_LBA                             Lba;
>> -  EFI_PHYSICAL_ADDRESS                FvbBaseAddress;
>>    UINTN                               NumBytes;
>>    UINTN                               Remaining;
>>
>> @@ -216,7 +235,7 @@ PerformFlashWriteWithProgress (
>>    // that covers the system firmware
>>    //
>>    Fvb = NULL;
>> -  Status = GetFvbByAddress (FlashAddress, &Fvb, &FvbBaseAddress);
>> +  Status = GetFvbByAddress (FlashAddress, Length, &Fvb, &Lba, &BlockSize);
>>    if (EFI_ERROR (Status)) {
>>      DEBUG ((DEBUG_ERROR,
>>        "%a: failed to locate FVB handle for address 0x%llx - %r\n",
>> @@ -224,28 +243,6 @@ PerformFlashWriteWithProgress (
>>      return Status;
>>    }
>>
>> -  Status = Fvb->GetBlockSize(Fvb, 0, &BlockSize, &NumberOfBlocks);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "%a: failed to get FVB blocksize - %r\n",
>> -      __FUNCTION__, Status));
>> -    return Status;
>> -  }
>> -
>> -  if ((Length % BlockSize) != 0) {
>> -    DEBUG ((DEBUG_ERROR,
>> -      "%a: Length 0x%lx is not a multiple of the blocksize 0x%lx\n",
>> -      __FUNCTION__, Length, BlockSize));
>> -    return EFI_INVALID_PARAMETER;
>> -  }
>> -
>> -  Lba = (FlashAddress - FvbBaseAddress) / BlockSize;
>> -  if (Lba > NumberOfBlocks - 1) {
>> -    DEBUG ((DEBUG_ERROR,
>> -      "%a: flash device with non-uniform blocksize not supported\n",
>> -      __FUNCTION__));
>> -    return EFI_UNSUPPORTED;
>> -  }
>> -
>>    //
>>    // Remap the region as device rather than uncached.
>>    //
>> --
>> 2.17.0
>>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to