Hi Andrew,

Thanks for reporting the bug, "DEN0060A_ARM_MM_Interface_Specification.pdf" does not talk about range for SPM_MM but don't know how it's mentioned in the comments.

Will you be able to push a patch following instructions at https://trustedfirmware-a.readthedocs.io/en/latest/process/contributing.html#submitting-changes 
Repository: https://review.trustedfirmware.org/admin/repos/TF-A/trusted-firmware-a , you will be able to login to gerrit using github credentials.

If not, then could you please send me the patch file (it appears copying directly from email generates corrupt patch file)

Thanks
Manish


From: TF-A <tf-a-bounces@lists.trustedfirmware.org> on behalf of Andrew Scull via TF-A <tf-a@lists.trustedfirmware.org>
Sent: 03 August 2021 22:32
To: tf-a@lists.trustedfirmware.org <tf-a@lists.trustedfirmware.org>
Cc: Andre Przywara <Andre.Przywara@arm.com>; Jimmy Brisson <Jimmy.Brisson@arm.com>
Subject: [TF-A] TRNG SMCs intercepted by SPM-MM
 
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