在 12/9/21 1:46 AM, Omkar Anand Kulkarni 写道:
> Hi Ming,
> 
> Thanks for this patch. This patch helps to resolve Standalone MM issue while 
> exercising RAS use case.
> Few comments mentioned inline.
> 
> - Omkar
> 
> 
>  On 10/15/21 2:39 PM, Ming Huang via groups.io wrote:
>> There are two scene communicate with StandaloneMm(MM):
>> 1 edk2 -> TF-A -> MM, communicate MM use non-secure buffer which
>>   specify by EFI_SECURE_PARTITION_BOOT_INFO.SpNsCommBufBase;
>> 2 RAS scene: fiq -> TF-A -> MM, use secure buffer which
>>   specify by EFI_SECURE_PARTITION_BOOT_INFO.SpShareBufBase;
>>
>> For now, the second scene will failed because check buffer address.
>> This patch add CheckBufferAddr() to support check address for secure buffer.
>>
>> Signed-off-by: Ming Huang <huangm...@linux.alibaba.com>
>> ---
>>  StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c     | 70
>> ++++++++++++++++----
>>  StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c | 21
>> ++++++
>> StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h |  1 +
>>  3 files changed, 79 insertions(+), 13 deletions(-)
>>
>> diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
>> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
>> index 5dfaf9d751..63fab1bd78 100644
>> --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
>> +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
>> @@ -50,6 +50,7 @@ EFI_MM_COMMUNICATE_HEADER
>> **PerCpuGuidedEventContext = NULL;
>>
>>  // Descriptor with whereabouts of memory used for communication with
>> the normal world  EFI_MMRAM_DESCRIPTOR  mNsCommBuffer;
>> +EFI_MMRAM_DESCRIPTOR  mSCommBuffer;
>>
>>  MP_INFORMATION_HOB_DATA *mMpInformationHobData;
>>
>> @@ -60,6 +61,58 @@ EFI_MM_CONFIGURATION_PROTOCOL mMmConfig =
>> {
>>
>>  STATIC EFI_MM_ENTRY_POINT     mMmEntryPoint = NULL;
>>
>> +STATIC
>> +EFI_STATUS
>> +CheckBufferAddr (
>> +  IN UINTN CommBufferAddr
>> +  )
>> +{
>> +  UINTN      CommBufferSize;
>> +  EFI_STATUS Status;
>> +
>> +  Status =  EFI_SUCCESS;
>> +  if (CommBufferAddr < mNsCommBuffer.PhysicalStart) {
>> +    Status = EFI_ACCESS_DENIED;
>> +  }
>> +
>> +  if ((CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
>> +      (mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize)) {
>> +    Status =  EFI_INVALID_PARAMETER;
> 
> Single space after "Status = "
> 
> - Omkar
> 
> 
>> +  }
>> +
>> +  // Find out the size of the buffer passed  CommBufferSize =
>> + ((EFI_MM_COMMUNICATE_HEADER *) CommBufferAddr)->MessageLength
>> +
>> +    sizeof (EFI_MM_COMMUNICATE_HEADER);
>> +
>> +  // perform bounds check.
>> +  if (CommBufferAddr + CommBufferSize >=
>> +      mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize) {
>> +    Status =  EFI_ACCESS_DENIED;
> 
> Single space after "Status = "
> 
> - Omkar
> 
>> +  }
>> +
>> +  if (!EFI_ERROR (Status)) {
> 
> 
> In case of error this function call will not return from here. It will 
> execute the code below comparing the MM Communicate buffer address with the 
> Secure buffer address, which may cause wrong return type being returned. Can 
> you check this, please?
> 
> - Omkar
> 
> 
>> +    return EFI_SUCCESS;
>> +  }
>> +
>> +  Status =  EFI_SUCCESS;
>> +  if (CommBufferAddr < mSCommBuffer.PhysicalStart) {
>> +    Status = EFI_ACCESS_DENIED;
>> +  }
>> +
>> +  if ((CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
>> +      (mSCommBuffer.PhysicalStart + mSCommBuffer.PhysicalSize)) {
>> +    Status =  EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  // perform bounds check.
>> +  if (CommBufferAddr + CommBufferSize >=
>> +      mSCommBuffer.PhysicalStart + mSCommBuffer.PhysicalSize) {
>> +    Status =  EFI_ACCESS_DENIED;
>> +  }
>> +
>> +  return Status;
>> +}
>> +
> 
> 
> CheckBufferAddr() function performs validity and overflow checks on the 
> Communication buffers. These checks are same for both the non-secure
> MM communicate buffer and secure buffer shared between EL3 and S-EL0. Can 
> this code be combined ( example below)? This will help mitigate the above 
> mentioned return type issue as well.
> 
> STATIC
> EFI_STATUS
> CheckBufferAddr (
>   IN UINTN CommBufferAddr
>   )
> {
>   UINTN                CommBufferSize;
>   EFI_STATUS           Status;
>   EFI_MMRAM_DESCRIPTOR CommBuffer;
> 
>   if (CommBufferAddr < mNsCommBuffer.PhysicalStart ||
>       CommBufferAddr > (mNsCommBuffer.PhysicalStart + 
> mNsCommBuffer.PhysicalSize)) {
>     CommBuffer = mSCommBuffer;
>   } else {
>     CommBuffer = mNsCommBuffer;
>   }
> 
>   if (CommBufferAddr < CommBuffer.PhysicalStart) {
>     Status = EFI_ACCESS_DENIED;
>   }
> 
>   if ((CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
>       (CommBuffer.PhysicalStart + CommBuffer.PhysicalSize)) {
>     Status = EFI_INVALID_PARAMETER;
>   }
> 
>   // Find out the size of the buffer passed
>   CommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *) 
> CommBufferAddr)->MessageLength +
>     sizeof (EFI_MM_COMMUNICATE_HEADER);
> 
>   // perform bounds check.
>   if (CommBufferAddr + CommBufferSize >=
>       CommBuffer.PhysicalStart + CommBuffer.PhysicalSize) {
>     Status = EFI_ACCESS_DENIED;
>   }
> 
>   return Status;
> }
> 
> - Omkar
> 
> 
>>  /**
>>    The PI Standalone MM entry point for the TF-A CPU driver.
>>
>> @@ -104,25 +157,16 @@ PiMmStandaloneArmTfCpuDriverEntry (
>>      return EFI_INVALID_PARAMETER;
>>    }
>>
>> -  if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
>> -    return EFI_ACCESS_DENIED;
>> -  }
>> -
>> -  if ((NsCommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
>> -      (mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize)) {
>> -    return EFI_INVALID_PARAMETER;
>> +  Status = CheckBufferAddr (NsCommBufferAddr);  if (EFI_ERROR (Status))
>> + {
>> +    DEBUG ((DEBUG_ERROR, "Check Buffer failed: %r\n", Status));
>> +    return Status;
>>    }
>>
>>    // Find out the size of the buffer passed
>>    NsCommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *)
>> NsCommBufferAddr)->MessageLength +
>>      sizeof (EFI_MM_COMMUNICATE_HEADER);
>>
>> -  // perform bounds check.
>> -  if (NsCommBufferAddr + NsCommBufferSize >=
>> -      mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize) {
>> -    return EFI_ACCESS_DENIED;
>> -  }
>> -
>>    GuidedEventContext = NULL;
>>    // Now that the secure world can see the normal world buffer, allocate
>>    // memory to copy the communication buffer to the secure world.
>> diff --git
>> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
>> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
>> index fd9c59b4da..96dad20dd1 100644
>> --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
>> +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
>> @@ -107,6 +107,7 @@ StandaloneMmCpuInitialize (
>>    UINTN                            Index;
>>    UINTN                            ArraySize;
>>    VOID                            *HobStart;
>> +  EFI_MMRAM_HOB_DESCRIPTOR_BLOCK  *MmramRangesHob;
>>
>>    ASSERT (SystemTable != NULL);
>>    mMmst = SystemTable;
>> @@ -186,6 +187,26 @@ StandaloneMmCpuInitialize (
>>    CopyMem (&mNsCommBuffer, NsCommBufMmramRange,
>> sizeof(EFI_MMRAM_DESCRIPTOR));
>>    DEBUG ((DEBUG_INFO, "mNsCommBuffer: 0x%016lx - 0x%lx\n",
>> mNsCommBuffer.CpuStart, mNsCommBuffer.PhysicalSize));
>>
>> +  Status = GetGuidedHobData (
>> +             HobStart,
>> +             &gEfiMmPeiMmramMemoryReserveGuid,
>> +             (VOID **) &MmramRangesHob
>> +             );
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "MmramRangesHob data extraction failed -
>> 0x%x\n", Status));
>> +    return Status;
>> +  }
>> +
>> +  //
>> +  // As CreateHobListFromBootInfo(), the base and size of buffer shared
>> + with  // privileged Secure world software is in second one.
>> +  //
>> +  CopyMem (
>> +    &mSCommBuffer,
>> +    &MmramRangesHob->Descriptor[0] + 1,
> 
> Can this be changed to
> &MmramRangesHob->Descriptor[1],

I missed this comment at last email.
The struct define:
EFI_MMRAM_DESCRIPTOR  Descriptor[1];

I guess some static code analysis tool may report out of array range, if modify 
to 
&MmramRangesHob->Descriptor[1].

- Ming

> 
> - Omkar
> 
>> +    sizeof(EFI_MMRAM_DESCRIPTOR)
>> +  );
>> +
>>    //
>>    // Extract the MP information from the Hoblist
>>    //
>> diff --git
>> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
>> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
>> index 2c96439c15..2e03b20d85 100644
>> --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
>> +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
>> @@ -30,6 +30,7 @@ extern EFI_MM_CPU_PROTOCOL mMmCpuState;  //
>>  extern EFI_MM_COMMUNICATE_HEADER    **PerCpuGuidedEventContext;
>>  extern EFI_MMRAM_DESCRIPTOR          mNsCommBuffer;
>> +extern EFI_MMRAM_DESCRIPTOR          mSCommBuffer;
>>  extern MP_INFORMATION_HOB_DATA       *mMpInformationHobData;
>>  extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig;
>>
>> --
>> 2.17.1
>>
>>
>>
>>
>>
> 
> IMPORTANT NOTICE: The contents of this email and any attachments are 
> confidential and may also be privileged. If you are not the intended 
> recipient, please notify the sender immediately and do not disclose the 
> contents to any other person, use it for any purpose, or store or copy the 
> information in any medium. Thank you.
> 
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#85130): https://edk2.groups.io/g/devel/message/85130
Mute This Topic: https://groups.io/mt/86334815/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to