From: Achin Gupta <achin.gu...@arm.com> This patch uses the FFA_MEM_PERM_GET/SET ABIs to tweak the permissions of a set of pages if FF-A v1.1 and above is supported by the SPMC. For FF-A v1.0 the previous method through FFA_MSG_SEND_DIRECT_REQ/RESP is used.
Signed-off-by: Achin Gupta <achin.gu...@arm.com> Signed-off-by: Nishant Sharma <nishant.sha...@arm.com> --- ArmPkg/Include/IndustryStandard/ArmFfaSvc.h | 2 + ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c | 132 +++++++++++++++++--- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h b/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h index c80d783fad3f..7987678c996e 100644 --- a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h +++ b/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h @@ -23,6 +23,8 @@ #define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64 0xC4000070 #define ARM_SVC_ID_FFA_SUCCESS_AARCH32 0x84000061 #define ARM_SVC_ID_FFA_SUCCESS_AARCH64 0xC4000061 +#define ARM_SVC_ID_FFA_MEM_PERM_SET_AARCH32 0x84000089 +#define ARM_SVC_ID_FFA_MEM_PERM_GET_AARCH32 0x84000088 #define ARM_SVC_ID_FFA_ERROR_AARCH32 0x84000060 #define ARM_SVC_ID_FFA_ERROR_AARCH64 0xC4000060 #define ARM_SVC_ID_FFA_MSG_WAIT_AARCH32 0x8400006B diff --git a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c index 1a41a289ef17..76ef214bcb85 100644 --- a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c +++ b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c @@ -25,6 +25,66 @@ #include <Library/DebugLib.h> #include <Library/PcdLib.h> + +/** + Utility function to determine whether ABIs in FF-A v1.1 to set and get + memory permissions can be used. Ideally, this should be invoked once in the + library constructor and set a flag that can be used at runtime. However, the + StMM Core invokes this library before constructors are called and before the + StMM image itself is relocated. + + @retval EFI_SUCCESS The availability of ABIs was correctly determined. + @retval Other value Software stack is misconfigured. + +**/ +STATIC +BOOLEAN +UseFfaMemPermAbis ( + VOID + ) +{ + ARM_SVC_ARGS SvcArgs; + UINT32 SpmcFfaVersion; + STATIC UINT16 SpmcMajorVer = 0; + STATIC UINT16 SpmcMinorVer = 0; + + // Use prefetched version info. if either is not 0, then the version is + // already fetched. + if ((SpmcMajorVer | SpmcMinorVer) != 0) { + return (SpmcMajorVer == SPM_MAJOR_VERSION_FFA) && (SpmcMinorVer >= SPM_MINOR_VERSION_FFA); + } + + // Nothing to do if FF-A has not be enabled + if (FixedPcdGet32 (PcdFfaEnable) == 0) { + return FALSE; + } + + // Prepare the message parameters. + ZeroMem (&SvcArgs, sizeof (ARM_SVC_ARGS)); + SvcArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32; + SvcArgs.Arg1 = FFA_VERSION_COMPILED; + + // Invoke the ABI + ArmCallSvc (&SvcArgs); + + // Check if FF-A is supported and what version + SpmcFfaVersion = SvcArgs.Arg0; + + // Damn! FF-A is not supported at all even though we specified v1.0 as our + // version. However, the feature flag has been turned on. This is a + // misconfigured software stack. So, return an error and assert in a debug build. + if (SpmcFfaVersion == ARM_FFA_SPM_RET_NOT_SUPPORTED) { + ASSERT (0); + return FALSE; + } + + SpmcMajorVer = (SpmcFfaVersion >> FFA_VERSION_MAJOR_SHIFT) & FFA_VERSION_MAJOR_MASK; + SpmcMinorVer = (SpmcFfaVersion >> FFA_VERSION_MINOR_SHIFT) & FFA_VERSION_MINOR_MASK; + + return (SpmcMajorVer == SPM_MAJOR_VERSION_FFA) && (SpmcMinorVer >= SPM_MINOR_VERSION_FFA); +} + + /** Send memory permission request to target. @param [in, out] SvcArgs Pointer to SVC arguments to send. On @@ -55,6 +115,36 @@ SendMemoryPermissionRequest ( ArmCallSvc (SvcArgs); if (FixedPcdGet32 (PcdFfaEnable) != 0) { + + // Check if FF-A memory permission ABIs were used. + if (UseFfaMemPermAbis()) { + switch (SvcArgs->Arg0) { + + case ARM_SVC_ID_FFA_ERROR_AARCH32: + case ARM_SVC_ID_FFA_ERROR_AARCH64: + switch (SvcArgs->Arg2) { + case ARM_FFA_SPM_RET_INVALID_PARAMETERS: + return EFI_INVALID_PARAMETER; + case ARM_FFA_SPM_RET_NOT_SUPPORTED: + return EFI_UNSUPPORTED; + default: + // Undefined error code received. + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + case ARM_SVC_ID_FFA_SUCCESS_AARCH32: + case ARM_SVC_ID_FFA_SUCCESS_AARCH64: + *RetVal = SvcArgs->Arg2; + return EFI_SUCCESS; + + default: + // Undefined error code received. + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + } + // Get/Set memory attributes is an atomic call, with // StandaloneMm at S-EL0 being the caller and the SPM // core being the callee. Thus there won't be a @@ -164,12 +254,18 @@ GetMemoryPermissions ( // See [1], Section 13.5.5.1 MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64. ZeroMem (&SvcArgs, sizeof (ARM_SVC_ARGS)); if (FixedPcdGet32 (PcdFfaEnable) != 0) { - // See [2], Section 10.2 FFA_MSG_SEND_DIRECT_REQ. - SvcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ; - SvcArgs.Arg1 = ARM_FFA_DESTINATION_ENDPOINT_ID; - SvcArgs.Arg2 = 0; - SvcArgs.Arg3 = ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES; - SvcArgs.Arg4 = BaseAddress; + // Check if FF-A memory permission ABIs can be used. + if (UseFfaMemPermAbis()) { + SvcArgs.Arg0 = ARM_SVC_ID_FFA_MEM_PERM_GET_AARCH32; + SvcArgs.Arg1 = BaseAddress; + } else { + // See [2], Section 10.2 FFA_MSG_SEND_DIRECT_REQ. + SvcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ; + SvcArgs.Arg1 = ARM_FFA_DESTINATION_ENDPOINT_ID; + SvcArgs.Arg2 = 0; + SvcArgs.Arg3 = ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES; + SvcArgs.Arg4 = BaseAddress; + } } else { SvcArgs.Arg0 = ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES; SvcArgs.Arg1 = BaseAddress; @@ -219,14 +315,22 @@ RequestMemoryPermissionChange ( // See [1], Section 13.5.5.2 MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. ZeroMem (&SvcArgs, sizeof (ARM_SVC_ARGS)); if (FixedPcdGet32 (PcdFfaEnable) != 0) { - // See [2], Section 10.2 FFA_MSG_SEND_DIRECT_REQ. - SvcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ; - SvcArgs.Arg1 = ARM_FFA_DESTINATION_ENDPOINT_ID; - SvcArgs.Arg2 = 0; - SvcArgs.Arg3 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES; - SvcArgs.Arg4 = BaseAddress; - SvcArgs.Arg5 = EFI_SIZE_TO_PAGES (Length); - SvcArgs.Arg6 = Permissions; + // Check if FF-A memory permission ABIs can be used. + if (UseFfaMemPermAbis()) { + SvcArgs.Arg0 = ARM_SVC_ID_FFA_MEM_PERM_SET_AARCH32; + SvcArgs.Arg1 = BaseAddress; + SvcArgs.Arg2 = EFI_SIZE_TO_PAGES (Length); + SvcArgs.Arg3 = Permissions; + } else { + // See [2], Section 10.2 FFA_MSG_SEND_DIRECT_REQ. + SvcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ; + SvcArgs.Arg1 = ARM_FFA_DESTINATION_ENDPOINT_ID; + SvcArgs.Arg2 = 0; + SvcArgs.Arg3 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES; + SvcArgs.Arg4 = BaseAddress; + SvcArgs.Arg5 = EFI_SIZE_TO_PAGES (Length); + SvcArgs.Arg6 = Permissions; + } } else { SvcArgs.Arg0 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES; SvcArgs.Arg1 = BaseAddress; -- 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#106798): https://edk2.groups.io/g/devel/message/106798 Mute This Topic: https://groups.io/mt/100079878/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-