summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGovindraj Raja <govindraj.raja@arm.com>2026-01-06 16:56:06 +0000
committerTrustedFirmware Code Review <review@review.trustedfirmware.org>2026-01-06 16:56:06 +0000
commit8f54a00aec6c317957aa86b3835c062292025d65 (patch)
tree26b8f18404612884b9f736eeee452858f0c42769
parentd934b937c036eae5e2329ae579f543f9b1c57a80 (diff)
parent6c79953cd6d9a93d3c71796be0e056b4fbb3c72c (diff)
downloadarm-trusted-firmware-8f54a00aec6c317957aa86b3835c062292025d65.tar.gz
arm-trusted-firmware-8f54a00aec6c317957aa86b3835c062292025d65.zip
Merge "feat(spm-mm): fix wrong range of SPM_MM" into integration
-rw-r--r--include/services/spm_mm_svc.h23
-rw-r--r--services/std_svc/spm/spm_mm/spm_mm_main.c22
2 files changed, 35 insertions, 10 deletions
diff --git a/include/services/spm_mm_svc.h b/include/services/spm_mm_svc.h
index 6086c0f9a..5fe84678d 100644
--- a/include/services/spm_mm_svc.h
+++ b/include/services/spm_mm_svc.h
@@ -38,18 +38,19 @@
#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))
-
+/*
+ * These macros are used to identify MM calls using the SMC function ID
+ * See the SMCCC spec's Table 6-4: Reserved Standard Secure Service Call range.
+ */
+#define MM_FID_MASK U(0xffff)
+#define MM_FID_MIN_VALUE U(0x40)
+#define MM_FID_MAX_VALUE U(0x4f)
/*
* 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
+ * These FIDs occupy the range 0x40 - 0x4f.
+ * [1] DEN0028 - SMC Calling Convention.
+ * Table 6-4: Reserved Standard Secure Service Call range
+ * [2] DEN0060A - Management Mode Interface Specification.
*/
#define MM_VERSION_AARCH32 U(0x84000040)
#define MM_COMMUNICATE_AARCH64 U(0xC4000041)
@@ -137,6 +138,8 @@ uint64_t spm_mm_tpm_start_handler(uint32_t smc_fid,
void *handle,
uint64_t flags);
+bool is_spm_mm_fid(uint32_t smc_fid);
+
#endif /* __ASSEMBLER__ */
#endif /* SPM_MM_SVC_H */
diff --git a/services/std_svc/spm/spm_mm/spm_mm_main.c b/services/std_svc/spm/spm_mm/spm_mm_main.c
index c204987a0..939e31ad6 100644
--- a/services/std_svc/spm/spm_mm/spm_mm_main.c
+++ b/services/std_svc/spm/spm_mm/spm_mm_main.c
@@ -395,3 +395,25 @@ uint64_t spm_mm_smc_handler(uint32_t smc_fid,
SMC_RET1(handle, SMC_UNK);
}
+
+bool is_spm_mm_fid(uint32_t smc_fid)
+{
+ uint32_t fid = smc_fid & MM_FID_MASK;
+
+ if ((fid >= MM_FID_MIN_VALUE) &&
+ (fid <= MM_FID_MAX_VALUE)) {
+ return true;
+ }
+
+ switch (smc_fid) {
+ case SPM_MM_VERSION_AARCH32:
+ case MM_SP_EVENT_COMPLETE_AARCH64:
+ case MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64:
+ case MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}