I've failed to figure out how to upload a CL so I'm resorting to this,
it's more of a bug report anyway. There seems to be a conflict in how
the standard SMCs are claimed with the TRNG SMCs claimed by SPM-MM
before TRNG would get a chance to handle them properly.
The patch below might fix the issue but I've not tested it or even
built against ToT.
----
The TRNG SMCs use 0x84000050 to 0x84000053 which is in the range that
SPM-MM claims for itself. Resolve this conflict by making SMC-MM much
more selective about the SMCs it claims for itself.
Signed-off-by: Andrew Scull <ascull@google.com>
Change-Id: If86b0d6a22497d34315c61fe72645b642c6e35f3
---
 include/services/spm_mm_svc.h         | 12 ++----------
 services/std_svc/spm_mm/spm_mm_main.c | 12 ++++++++++++
 2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/include/services/spm_mm_svc.h b/include/services/spm_mm_svc.h
index 3148beb80..4247c95a1 100644
--- a/include/services/spm_mm_svc.h
+++ b/include/services/spm_mm_svc.h
@@ -38,17 +38,8 @@
 #define SPM_MM_VERSION_COMPILED
SPM_MM_VERSION_FORM(SPM_MM_VERSION_MAJOR, \
                                                    SPM_MM_VERSION_MINOR)
-/* These macros are used to identify SPM-MM calls using the SMC function ID */
-#define SPM_MM_FID_MASK                        U(0xffff)
-#define SPM_MM_FID_MIN_VALUE           U(0x40)
-#define SPM_MM_FID_MAX_VALUE           U(0x7f)
-#define is_spm_mm_fid(_fid)                                             \
-               ((((_fid) & SPM_MM_FID_MASK) >= SPM_MM_FID_MIN_VALUE) && \
-                (((_fid) & SPM_MM_FID_MASK) <= SPM_MM_FID_MAX_VALUE))
-
 /*
  * SMC IDs defined in [1] for accessing MM services from the Non-secure world.
- * These FIDs occupy the range 0x40 - 0x5f.
  * [1] DEN0060A_ARM_MM_Interface_Specification.pdf
  */
 #define MM_VERSION_AARCH32             U(0x84000040)
@@ -59,7 +50,6 @@
  * SMC IDs defined for accessing services implemented by the Secure Partition
  * Manager from the Secure Partition(s). These services enable a partition to
  * handle delegated events and request privileged operations from the manager.
- * They occupy the range 0x60-0x7f.
  */
 #define SPM_MM_VERSION_AARCH32                 U(0x84000060)
 #define MM_SP_EVENT_COMPLETE_AARCH64           U(0xC4000061)
@@ -94,6 +84,8 @@
 int32_t spm_mm_setup(void);
+bool is_spm_mm_fid(uint32_t smc_fid);
+
 uint64_t spm_mm_smc_handler(uint32_t smc_fid,
                            uint64_t x1,
                            uint64_t x2,
diff --git a/services/std_svc/spm_mm/spm_mm_main.c
b/services/std_svc/spm_mm/spm_mm_main.c
index 14c0038ba..07226b0fb 100644
--- a/services/std_svc/spm_mm/spm_mm_main.c
+++ b/services/std_svc/spm_mm/spm_mm_main.c
@@ -266,6 +266,18 @@ static uint64_t mm_communicate(uint32_t smc_fid,
uint64_t mm_cookie,
        SMC_RET1(handle, rc);
 }
+/* Predicate indicating that a function id is part of SPM-MM */
+bool is_spm_mm_fid(uint32_t smc_fid)
+{
+       return ((smc_fid == MM_VERSION_AARCH32) ||
+               (smc_fid == MM_COMMUNICATE_AARCH32) ||
+               (smc_fid == MM_COMMUNICATE_AARCH64) ||
+               (smc_fid == SPM_MM_VERSION_AARCH32) ||
+               (smc_fid == MM_SP_EVENT_COMPLETE_AARCH64) ||
+               (smc_fid == MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64) ||
+               (smc_fid == MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64));
+}
+
 /*******************************************************************************
  * Secure Partition Manager SMC handler.
  ******************************************************************************/
-- 
2.32.0.554.ge1b32706d8-goog
-- 
TF-A mailing list
TF-A@lists.trustedfirmware.org
https://lists.trustedfirmware.org/mailman/listinfo/tf-a