在 12/30/21 8:27 PM, Marvin Häuser 写道:
> 
> 
> On 25.12.21 03:09, Ming Huang wrote:
>>
>> 在 12/24/21 9:52 PM, Marvin Häuser 写道:
>>> On 24.12.21 02:18, Ming Huang wrote:
>>>> 在 12/23/21 7:05 PM, Marvin Häuser 写道:
>>>>> On 23.12.21 11:46, Ming Huang wrote:
>>>>>> 在 12/16/21 5:15 PM, Marvin Häuser 写道:
>>>>>>> Hey all,
>>>>>>>
>>>>>>>> On 15. Dec 2021, at 16:02, Ming Huang <huangm...@linux.alibaba.com> 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>> 
>>>>>>>>
>>>>>>>>> On 12/9/21 1:46 AM, Omkar Anand Kulkarni wrote:
>>>>>>>>> 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 = "
>>>>>>>> Modify it in v2.
>>>>>>>>
>>>>>>>>> - 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 = "
>>>>>>>> Modify it in v2.
>>>>>>>>
>>>>>>>>> - 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.
>>>>>>>> Your example is a good idea to solve this case. I may modify it like 
>>>>>>>> below in v2:
>>>>>>>>
>>>>>>>> STATIC
>>>>>>>> EFI_STATUS
>>>>>>>> CheckBufferAddr (
>>>>>>>> IN UINTN CommBufferAddr
>>>>>>>> )
>>>>>>>> {
>>>>>>>> UINTN      CommBufferSize;
>>>>>>>> EFI_STATUS Status;
>>>>>>>> UINT64     NsCommBufferEnd;
>>>>>>>> UINT64     SCommBufferEnd;
>>>>>>>> UINT64     CommBufferEnd;
>>>>>>>>
>>>>>>>> Status =  EFI_SUCCESS;
>>>>>>>> NsCommBufferEnd = mNsCommBuffer.PhysicalStart + 
>>>>>>>> mNsCommBuffer.PhysicalSize;
>>>>>>>> SCommBufferEnd = mSCommBuffer.PhysicalStart + 
>>>>>>>> mSCommBuffer.PhysicalSize;
>>>>>>>>
>>>>>>>> if ((CommBufferAddr >= mNsCommBuffer.PhysicalStart) &&
>>>>>>>> (CommBufferAddr < NsCommBufferEnd)) {
>>>>>>>> CommBufferEnd = NsCommBufferEnd;
>>>>>>>> } else if ((CommBufferAddr >= mSCommBuffer.PhysicalStart) &&
>>>>>>>>         (CommBufferAddr <= SCommBufferEnd)) {
>>>>>>> I find it odd the check here (lesser-equals) is inconsistent with the 
>>>>>>> check above (lesser). It’d be caught below anyway, but I’d change this 
>>>>>>> to lesser to keep the return codes consistent.
>>>>>> Should be lesser, modify it in v3.
>>>>>>
>>>>>>>> CommBufferEnd = SCommBufferEnd;
>>>>>>>> } else {
>>>>>>>> return EFI_ACCESS_DENIED;
>>>>>>>> }
>>>>>>>>
>>>>>>>> if ((CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >= 
>>>>>>>> CommBufferEnd) {
>>>>>>> Why is greater-equals used here? MessageLength == 0 is not filtered 
>>>>>>> below, so this looks odd to be honest, as this is only the theoretical 
>>>>>>> maximum buffer end.
>>>>>>>
>>>>>>> How do you know this cannot wraparound? I actually don’t think we do. 
>>>>>>> We do know it holds that CommBufferAddr <= CommBufferEnd though, so 
>>>>>>> checking CommBufferEnd - CommBufferAddr < sizeof 
>>>>>>> (EFI_MM_COMMUNICATE_HEADER) would give you that for free, if we assume 
>>>>>>> the UINT64 variables above are actually bounded by UINTN, which seems 
>>>>>>> reasonable - could ASSERT.
>>>>>> In my mind, (CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >= 
>>>>>> CommBufferEnd)
>>>>>> is the same with: CommBufferEnd - CommBufferAddr < sizeof 
>>>>>> (EFI_MM_COMMUNICATE_HEADER)
>>>>> Okay, assume:
>>>>> CommBufferEnd = MAX_UINTN
>>>>> CommBufferAddr = MAX_UINTN - 1 (MAX_UINTN - 1 < MAX_UINTN, so the check 
>>>>> above would pass)
>>>>> sizeof (EFI_MM_COMMUNICATE_HEADER) = 16 (should be accurate for 64-bit 
>>>>> architectures)
>>>>>
>>>>> Then (assume implicit mod 2^N on both sides due to bounded integers!):
>>>>> (CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >= CommBufferEnd) 
>>>>> <=> ((MAX_UINTN - 1) + 16) >= MAX_UINTN <=> MAX_UINTN + 15 >= MAX_UINTN 
>>>>> <=>(wraparound!!) 14 >= MAX_UINTN <=> FALSE
>>>>>
>>>>> And (assume implicit mod 2^N on both sides due to bounded integers!):
>>>>> CommBufferEnd - CommBufferAddr < sizeof (EFI_MM_COMMUNICATE_HEADER) <=> 
>>>>> MAX_UINTN - (MAX_UINTN - 1) < 16 <=> 1 < 16 <=> TRUE
>>>>>
>>>>> Due to wraparound semantics and the knowledge derived by the if-checks 
>>>>> above they are by no means the same. The left term of the first equation 
>>>>> can wrap around (or it cannot, but then we need some concrete proof that 
>>>>> it cannot), and the left term of the second equation obviously cannot 
>>>>> (directly follows from the if statements before).
>>>> I got it. Thanks for your proper comments.
>>>> I may modify it like below in v3:
>>>> ----------------------------------------
>>>> STATIC
>>>> EFI_STATUS
>>>> CheckBufferAddr (
>>>>     IN UINTN BufferAddr
>>>>     )
>>>> {
>>>>     UINTN  BufferSize;
>>>>     UINT64 NsCommBufferEnd;
>>>>     UINT64 SCommBufferEnd;
>>>>     UINT64 CommBufferEnd;
>>>>
>>>>     NsCommBufferEnd = mNsCommBuffer.PhysicalStart + 
>>>> mNsCommBuffer.PhysicalSize;
>>>>     SCommBufferEnd = mSCommBuffer.PhysicalStart + 
>>>> mSCommBuffer.PhysicalSize;
>>>>
>>>>     if ((BufferAddr >= mNsCommBuffer.PhysicalStart) &&
>>>>         (BufferAddr < NsCommBufferEnd)) {
>>>>       CommBufferEnd = NsCommBufferEnd;
>>>>     } else if ((BufferAddr >= mSCommBuffer.PhysicalStart) &&
>>>>                (BufferAddr < SCommBufferEnd)) {
>>>>       CommBufferEnd = SCommBufferEnd;
>>>>     } else {
>>>>       return EFI_ACCESS_DENIED;
>>>>     }
>>>>
>>>>     if ((CommBufferEnd - BufferAddr) < sizeof (EFI_MM_COMMUNICATE_HEADER)) 
>>>> {
>>>>       return EFI_INVALID_PARAMETER;
>>> Just another cosmetic thing I just noticed, why is this Invalid Parameter? 
>>> The check above yields Access Denied when the buffer start is out of a 
>>> trusted range, OK. The check below yields Access Denied when the buffer 
>>> data extends beyond the trusted range, OK. What makes this check different 
>>> from the other ones that it gets a different return code? I'm not sure on 
>>> the policy of function documentation (i.e. whether one is needed), but what 
>>> would the difference be in their descriptions?
>> Okay, EFI_ACCESS_DENIED should be return. Modify it in v3.
>>
>>>>     }
>>>>
>>>>     // Find out the size of the buffer passed
>>>>     BufferSize = ((EFI_MM_COMMUNICATE_HEADER *) BufferAddr)->MessageLength 
>>>> +
>>>>       sizeof (EFI_MM_COMMUNICATE_HEADER);
>>> Same issue as above, can also be solved by rewriting as subtraction. 
>>> Because you now know that (CommBufferEnd - BufferAddr) >= sizeof 
>>> (EFI_MM_COMMUNICATE_HEADER).
>> Sorry, I haven't understood what you mean. Could you rewrite 
>> CheckBufferAddr() as a sample?
> 
> CommBufferEnd - BufferAddr - sizeof (EFI_MM_COMMUNICATE_HEADER) < 
> ((EFI_MM_COMMUNICATE_HEADER *) BufferAddr)->MessageLength

Modify it in v3.
Thanks for your help.

- Ming

> 
> Best regards,
> Marvin
> 
> 
>>
>> Thank you very much.
>> Merry Christmas!
>>
>> - Ming
>>
>>> Best regards,
>>> Marvin
>>>
>>>>     // perform bounds check.
>>>>     if ((CommBufferEnd - BufferAddr) < BufferSize) {
>>>>       return EFI_ACCESS_DENIED;
>>>>     }
>>>>
>>>>     return EFI_SUCCESS;
>>>> }
>>>> ----------------------------------------
>>>>
>>>> - Ming
>>>>
>>>>>>> Alternatively, you could not store the maximum buffer end but the 
>>>>>>> maximum buffer size, so the additions of the buffer start would just 
>>>>>>> vanish. This might be more readable too I think.
>>>>>> As CommBufferAddr may be not at the begin of communicate buffer,
>>>>>> so check size with the maximum buffer size is not enough.
>>>>>>
>>>>>>>> Status =  EFI_INVALID_PARAMETER;
>>>>>>> Why is there no return here? This can proceed when the buffer cannot 
>>>>>>> fit this header, and yet below the header is dereferenced.
>>>>>> Modify it in v3.
>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> // Find out the size of the buffer passed
>>>>>>>> CommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *) 
>>>>>>>> CommBufferAddr)->MessageLength +
>>>>>>>> sizeof (EFI_MM_COMMUNICATE_HEADER);
>>>>>>> Same wraparound concern, same suggestion for solving it.
>>>>>>>
>>>>>>>> // perform bounds check.
>>>>>>>> if (CommBufferAddr + CommBufferSize >= CommBufferEnd) {
>>>>>>>> Status =  EFI_ACCESS_DENIED;
>>>>>>> It’s obviously not bad here, but for consistency’s sake, to mitigate 
>>>>>>> bugs introduced by future changes, and readability, I’d return here and 
>>>>>>> just return EFI_SUCCESS below, removing the code requirement of keeping 
>>>>>>> Status consistent with the check results.
>>>>>> Modify it in v3.
>>>>> Thanks for the modifications.
>>>>>
>>>>> Best regards,
>>>>> Marvin
>>>>>
>>>>>> - Ming
>>>>>>
>>>>>>> Finally, I really believe this kind of function should be abstracted in 
>>>>>>> a way that it can be consumed by all places that accept any sort of 
>>>>>>> communication buffer. Buffer validity checking is too critical than to 
>>>>>>> duplicate it in every consumer.
>>>>>>>
>>>>>>> Thanks!
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Marvin
>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> return Status;
>>>>>>>> }
>>>>>>>>
>>>>>>>> - Ming
>>>>>>>>
>>>>>>>>> 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],
>>>>>>>>> - 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 (#85240): https://edk2.groups.io/g/devel/message/85240
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