On 7/11/2023 7:36 AM, Nishant Sharma wrote:
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

nit: "been 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);

It would be nice to either have the assert be self documenting
(ASSERT (SpmcFfaVersion == ARM_FFA_SPM_RET_NOT_SUPPORTED)) or
to add a print here.

+    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);

For these two default cases, can we print out what
error code we received?

Thanks,
Oliver

+            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;


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#106879): https://edk2.groups.io/g/devel/message/106879
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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to