public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
@ 2021-06-08 14:21 Ming Huang
  2021-06-09  7:10 ` Ard Biesheuvel
  0 siblings, 1 reply; 6+ messages in thread
From: Ming Huang @ 2021-06-08 14:21 UTC (permalink / raw)
  To: devel, ardb+tianocore, sami.mujawar, jiewen.yao,
	supreeth.venkatesh
  Cc: guoheyi, Ming Huang

TF-A: TrustedFirmware-a
SPM: Secure Partition Manager(MM)

For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
with buffer address (PLAT_SPM_BUF_BASE). The address is different
from PcdMmBufferBase which use in edk2.
Checking address will let TF-A communicate failed to MM. So remove
below checking code:
if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
  return EFI_ACCESS_DENIED;
}

Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
---
 StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
index 63fbe26642..fe98d3181d 100644
--- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
+++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
@@ -103,10 +103,6 @@ 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;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
  2021-06-08 14:21 [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue Ming Huang
@ 2021-06-09  7:10 ` Ard Biesheuvel
  2021-06-10  1:14   ` Ming Huang
  0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2021-06-09  7:10 UTC (permalink / raw)
  To: Ming Huang
  Cc: edk2-devel-groups-io, Ard Biesheuvel, Sami Mujawar, Jiewen Yao,
	Supreeth Venkatesh, guoheyi

On Tue, 8 Jun 2021 at 16:21, Ming Huang <huangming@linux.alibaba.com> wrote:
>
> TF-A: TrustedFirmware-a
> SPM: Secure Partition Manager(MM)
>
> For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
> with buffer address (PLAT_SPM_BUF_BASE). The address is different
> from PcdMmBufferBase which use in edk2.

Then why do we have PcdMmBufferBase?

Is it possible to set PcdMmBufferBase to the correct value?

> Checking address will let TF-A communicate failed to MM. So remove
> below checking code:
> if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
>   return EFI_ACCESS_DENIED;
> }
>
> Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
> ---
>  StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c | 4 ----
>  1 file changed, 4 deletions(-)
>
> diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> index 63fbe26642..fe98d3181d 100644
> --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> @@ -103,10 +103,6 @@ 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;
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
  2021-06-09  7:10 ` Ard Biesheuvel
@ 2021-06-10  1:14   ` Ming Huang
  2021-06-16  5:29     ` [edk2-devel] " Omkar Anand Kulkarni
  0 siblings, 1 reply; 6+ messages in thread
From: Ming Huang @ 2021-06-10  1:14 UTC (permalink / raw)
  To: Ard Biesheuvel
  Cc: edk2-devel-groups-io, Ard Biesheuvel, Sami Mujawar, Jiewen Yao,
	Supreeth Venkatesh, guoheyi



On 6/9/21 3:10 PM, Ard Biesheuvel wrote:
> On Tue, 8 Jun 2021 at 16:21, Ming Huang <huangming@linux.alibaba.com> wrote:
>>
>> TF-A: TrustedFirmware-a
>> SPM: Secure Partition Manager(MM)
>>
>> For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
>> with buffer address (PLAT_SPM_BUF_BASE). The address is different
>> from PcdMmBufferBase which use in edk2.
> 
> Then why do we have PcdMmBufferBase?

ArmPkg use this Pcd for the base address of non-secure communication buffer.

> 
> Is it possible to set PcdMmBufferBase to the correct value?

The secure communication may interrupt the non-secure communication. if we
use the same address (PcdMmBufferBase and PLAT_SPM_BUF_BASE), the date in
communication buffer may be corrupted.

Best Regards,
Ming

> 
>> Checking address will let TF-A communicate failed to MM. So remove
>> below checking code:
>> if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
>>   return EFI_ACCESS_DENIED;
>> }
>>
>> Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
>> ---
>>  StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c | 4 ----
>>  1 file changed, 4 deletions(-)
>>
>> diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>> index 63fbe26642..fe98d3181d 100644
>> --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>> +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>> @@ -103,10 +103,6 @@ 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;
>> --
>> 2.17.1
>>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-devel] [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
  2021-06-10  1:14   ` Ming Huang
@ 2021-06-16  5:29     ` Omkar Anand Kulkarni
  2021-06-16 14:10       ` Ard Biesheuvel
  0 siblings, 1 reply; 6+ messages in thread
From: Omkar Anand Kulkarni @ 2021-06-16  5:29 UTC (permalink / raw)
  To: devel@edk2.groups.io, huangming@linux.alibaba.com, Ard Biesheuvel
  Cc: Ard Biesheuvel, Sami Mujawar, Jiewen Yao, Supreeth Venkatesh,
	guoheyi@linux.alibaba.com, nd


On 6/10/21 6:44 AM, Ming Huang via groups.io wrote:
> On 6/9/21 3:10 PM, Ard Biesheuvel wrote:
> > On Tue, 8 Jun 2021 at 16:21, Ming Huang <huangming@linux.alibaba.com>
> wrote:
> >>
> >> TF-A: TrustedFirmware-a
> >> SPM: Secure Partition Manager(MM)
> >>
> >> For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
> with
> >> buffer address (PLAT_SPM_BUF_BASE). The address is different from
> >> PcdMmBufferBase which use in edk2.
> >
> > Then why do we have PcdMmBufferBase?
> 
> ArmPkg use this Pcd for the base address of non-secure communication
> buffer.
> 
> >
> > Is it possible to set PcdMmBufferBase to the correct value?
> 
> The secure communication may interrupt the non-secure communication. if
> we use the same address (PcdMmBufferBase and PLAT_SPM_BUF_BASE), the
> date in communication buffer may be corrupted.
> 
> Best Regards,
> Ming

In case where an interrupt handler executing from EL3 makes a call into StandaloneMM, the handler in EL3 makes an spm call into StandaloneMM using PLAT_SPM_BUF_BASE buffer base address. This PLAT_SPM_BUF_BASE is a shared buffer between EL3 and S-EL0. This is where the following check fails and leads to spm call failure. So this change would help resolve this issue.

- Omkar

> 
> >
> >> Checking address will let TF-A communicate failed to MM. So remove
> >> below checking code:
> >> if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
> >>   return EFI_ACCESS_DENIED;
> >> }
> >>
> >> Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
> >> ---
> >>  StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c |
> 4
> >> ----
> >>  1 file changed, 4 deletions(-)
> >>
> >> diff --git
> >> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> >> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> >> index 63fbe26642..fe98d3181d 100644
> >> ---
> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> >> +++
> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> >> @@ -103,10 +103,6 @@ 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;
> >> --
> >> 2.17.1
> >>
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-devel] [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
  2021-06-16  5:29     ` [edk2-devel] " Omkar Anand Kulkarni
@ 2021-06-16 14:10       ` Ard Biesheuvel
  2021-06-18  3:42         ` Ming Huang
  0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2021-06-16 14:10 UTC (permalink / raw)
  To: Omkar Kulkarni
  Cc: devel@edk2.groups.io, huangming@linux.alibaba.com, Ard Biesheuvel,
	Sami Mujawar, Jiewen Yao, Supreeth Venkatesh,
	guoheyi@linux.alibaba.com, nd

On Wed, 16 Jun 2021 at 07:30, Omkar Kulkarni <Omkar.Kulkarni@arm.com> wrote:
>
>
> On 6/10/21 6:44 AM, Ming Huang via groups.io wrote:
> > On 6/9/21 3:10 PM, Ard Biesheuvel wrote:
> > > On Tue, 8 Jun 2021 at 16:21, Ming Huang <huangming@linux.alibaba.com>
> > wrote:
> > >>
> > >> TF-A: TrustedFirmware-a
> > >> SPM: Secure Partition Manager(MM)
> > >>
> > >> For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
> > with
> > >> buffer address (PLAT_SPM_BUF_BASE). The address is different from
> > >> PcdMmBufferBase which use in edk2.
> > >
> > > Then why do we have PcdMmBufferBase?
> >
> > ArmPkg use this Pcd for the base address of non-secure communication
> > buffer.
> >
> > >
> > > Is it possible to set PcdMmBufferBase to the correct value?
> >
> > The secure communication may interrupt the non-secure communication. if
> > we use the same address (PcdMmBufferBase and PLAT_SPM_BUF_BASE), the
> > date in communication buffer may be corrupted.
> >
> > Best Regards,
> > Ming
>
> In case where an interrupt handler executing from EL3 makes a call into StandaloneMM, the handler in EL3 makes an spm call into StandaloneMM using PLAT_SPM_BUF_BASE buffer base address. This PLAT_SPM_BUF_BASE is a shared buffer between EL3 and S-EL0. This is where the following check fails and leads to spm call failure. So this change would help resolve this issue.
>

But is it the right fix? Why would EDK2 even be aware of how EL3 and
S-EL0 communicate with each other, and where the buffer is located?


> >
> > >
> > >> Checking address will let TF-A communicate failed to MM. So remove
> > >> below checking code:
> > >> if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
> > >>   return EFI_ACCESS_DENIED;
> > >> }
> > >>
> > >> Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
> > >> ---
> > >>  StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c |
> > 4
> > >> ----
> > >>  1 file changed, 4 deletions(-)
> > >>
> > >> diff --git
> > >> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> > >> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> > >> index 63fbe26642..fe98d3181d 100644
> > >> ---
> > a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> > >> +++
> > b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
> > >> @@ -103,10 +103,6 @@ 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;
> > >> --
> > >> 2.17.1
> > >>
> >
> >
> > 
> >
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [edk2-devel] [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue
  2021-06-16 14:10       ` Ard Biesheuvel
@ 2021-06-18  3:42         ` Ming Huang
  0 siblings, 0 replies; 6+ messages in thread
From: Ming Huang @ 2021-06-18  3:42 UTC (permalink / raw)
  To: Ard Biesheuvel, Omkar Kulkarni
  Cc: devel@edk2.groups.io, Ard Biesheuvel, Sami Mujawar, Jiewen Yao,
	Supreeth Venkatesh, guoheyi@linux.alibaba.com, nd



On 6/16/21 10:10 PM, Ard Biesheuvel wrote:
> On Wed, 16 Jun 2021 at 07:30, Omkar Kulkarni <Omkar.Kulkarni@arm.com> wrote:
>>
>>
>> On 6/10/21 6:44 AM, Ming Huang via groups.io wrote:
>>> On 6/9/21 3:10 PM, Ard Biesheuvel wrote:
>>>> On Tue, 8 Jun 2021 at 16:21, Ming Huang <huangming@linux.alibaba.com>
>>> wrote:
>>>>>
>>>>> TF-A: TrustedFirmware-a
>>>>> SPM: Secure Partition Manager(MM)
>>>>>
>>>>> For AArch64, when SPM enable in TF-A, TF-A may communicate to MM
>>> with
>>>>> buffer address (PLAT_SPM_BUF_BASE). The address is different from
>>>>> PcdMmBufferBase which use in edk2.
>>>>
>>>> Then why do we have PcdMmBufferBase?
>>>
>>> ArmPkg use this Pcd for the base address of non-secure communication
>>> buffer.
>>>
>>>>
>>>> Is it possible to set PcdMmBufferBase to the correct value?
>>>
>>> The secure communication may interrupt the non-secure communication. if
>>> we use the same address (PcdMmBufferBase and PLAT_SPM_BUF_BASE), the
>>> date in communication buffer may be corrupted.
>>>
>>> Best Regards,
>>> Ming
>>
>> In case where an interrupt handler executing from EL3 makes a call into StandaloneMM, the handler in EL3 makes an spm call into StandaloneMM using PLAT_SPM_BUF_BASE buffer base address. This PLAT_SPM_BUF_BASE is a shared buffer between EL3 and S-EL0. This is where the following check fails and leads to spm call failure. So this change would help resolve this issue.
>>
> 
> But is it the right fix? Why would EDK2 even be aware of how EL3 and
> S-EL0 communicate with each other, and where the buffer is located?

The root cause for this problem is that the StandaloneMmPkg and TF-A
are not full cooperative.
PLAT_SPM_BUF_BASE is not dynamic buffer just like PcdMmBufferBase.

Please refer PcdMmBufferBase comments in edk2-platforms/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc: 
  #
  # Set the base address and size of the buffer used
  # for communication between the Normal world edk2
  # with StandaloneMm image at S-EL0 through MM_COMMUNICATE.
  # This buffer gets allocated in ATF and since we do not have
  # a mechanism currently to communicate the base address and
  # size of this buffer from ATF, hard-code it here
  #
  ## MM Communicate
  gArmTokenSpaceGuid.PcdMmBufferBase|0xFF600000
  gArmTokenSpaceGuid.PcdMmBufferSize|0x10000


Best Regards,
Ming

> 
> 
>>>
>>>>
>>>>> Checking address will let TF-A communicate failed to MM. So remove
>>>>> below checking code:
>>>>> if (NsCommBufferAddr < mNsCommBuffer.PhysicalStart) {
>>>>>   return EFI_ACCESS_DENIED;
>>>>> }
>>>>>
>>>>> Signed-off-by: Ming Huang <huangming@linux.alibaba.com>
>>>>> ---
>>>>>  StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c |
>>> 4
>>>>> ----
>>>>>  1 file changed, 4 deletions(-)
>>>>>
>>>>> diff --git
>>>>> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>>>>> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>>>>> index 63fbe26642..fe98d3181d 100644
>>>>> ---
>>> a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>>>>> +++
>>> b/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
>>>>> @@ -103,10 +103,6 @@ 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;
>>>>> --
>>>>> 2.17.1
>>>>>
>>>
>>>
>>> 
>>>
>>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-06-18  3:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-08 14:21 [Patch] StandaloneMmPkg: Fixed communicating from TF-A failed issue Ming Huang
2021-06-09  7:10 ` Ard Biesheuvel
2021-06-10  1:14   ` Ming Huang
2021-06-16  5:29     ` [edk2-devel] " Omkar Anand Kulkarni
2021-06-16 14:10       ` Ard Biesheuvel
2021-06-18  3:42         ` Ming Huang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox