From 4a50363aaeaa16edafcff17486006049b30e1e2f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 15 Feb 2023 12:39:22 +0100 Subject: [PATCH] fix(versal): check smc_fid 23:16 bits 23:16 bits when they gets to SMC handler should be all zeros but be inside SIP Service Calls range which is defined as 0x82000000-0x8200ffff or 0xc2000000-0xc200ffff. That's why make sure that code won't handle any SMCs in SIP range out of predefined range. Also fix MASK values to check the same range for PM/IPI calls to make sure that masking covers all required bits including 23:16. Bits 15:12 are used for different class of requests. Change-Id: I9d3e91aa521d6bb90f6b15b71ff1e89fa77ee379 Signed-off-by: Michal Simek --- plat/xilinx/versal/sip_svc_setup.c | 17 ++++++++++++++--- plat/xilinx/versal_net/sip_svc_setup.c | 16 +++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/plat/xilinx/versal/sip_svc_setup.c b/plat/xilinx/versal/sip_svc_setup.c index 6f2ff9459..28a4cb987 100644 --- a/plat/xilinx/versal/sip_svc_setup.c +++ b/plat/xilinx/versal/sip_svc_setup.c @@ -6,6 +6,8 @@ /* Top level SMC handler for SiP calls. Dispatch PM calls to PM SMC handler. */ +#include + #include #include #include @@ -23,11 +25,12 @@ #define SIP_SVC_VERSION_MINOR U(1) /* These macros are used to identify PM calls from the SMC function ID */ -#define PM_FID_MASK 0xf000u +#define SIP_FID_MASK GENMASK(23, 16) +#define XLNX_FID_MASK GENMASK(23, 12) #define PM_FID_VALUE 0u #define IPI_FID_VALUE 0x1000u -#define is_pm_fid(_fid) (((_fid) & PM_FID_MASK) == PM_FID_VALUE) -#define is_ipi_fid(_fid) (((_fid) & PM_FID_MASK) == IPI_FID_VALUE) +#define is_pm_fid(_fid) (((_fid) & XLNX_FID_MASK) == PM_FID_VALUE) +#define is_ipi_fid(_fid) (((_fid) & XLNX_FID_MASK) == IPI_FID_VALUE) /* SiP Service UUID */ DEFINE_SVC_UUID2(versal_sip_uuid, @@ -62,6 +65,14 @@ uintptr_t sip_svc_smc_handler(uint32_t smc_fid, void *handle, u_register_t flags) { + VERBOSE("SMCID: 0x%08x, x1: 0x%016" PRIx64 ", x2: 0x%016" PRIx64 ", x3: 0x%016" PRIx64 ", x4: 0x%016" PRIx64 "\n", + smc_fid, x1, x2, x3, x4); + + if (smc_fid & SIP_FID_MASK) { + WARN("SMC out of SiP assinged range: 0x%x\n", smc_fid); + SMC_RET1(handle, SMC_UNK); + } + /* Let PM SMC handler deal with PM-related requests */ if (is_pm_fid(smc_fid)) { return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, diff --git a/plat/xilinx/versal_net/sip_svc_setup.c b/plat/xilinx/versal_net/sip_svc_setup.c index 0e3940fee..c91497c23 100644 --- a/plat/xilinx/versal_net/sip_svc_setup.c +++ b/plat/xilinx/versal_net/sip_svc_setup.c @@ -9,6 +9,7 @@ /* Top level SMC handler for SiP calls. Dispatch PM calls to PM SMC handler. */ #include +#include #include #include @@ -28,11 +29,12 @@ #define SIP_SVC_VERSION_MINOR (1U) /* These macros are used to identify PM calls from the SMC function ID */ -#define PM_FID_MASK 0xf000u +#define SIP_FID_MASK GENMASK(23, 16) +#define XLNX_FID_MASK GENMASK(23, 12) #define PM_FID_VALUE 0u #define IPI_FID_VALUE 0x1000u -#define is_pm_fid(_fid) (((_fid) & PM_FID_MASK) == PM_FID_VALUE) -#define is_ipi_fid(_fid) (((_fid) & PM_FID_MASK) == IPI_FID_VALUE) +#define is_pm_fid(_fid) (((_fid) & XLNX_FID_MASK) == PM_FID_VALUE) +#define is_ipi_fid(_fid) (((_fid) & XLNX_FID_MASK) == IPI_FID_VALUE) /* SiP Service UUID */ DEFINE_SVC_UUID2(versal_net_sip_uuid, @@ -62,6 +64,14 @@ static uintptr_t sip_svc_smc_handler(uint32_t smc_fid, void *handle, u_register_t flags) { + VERBOSE("SMCID: 0x%08x, x1: 0x%016" PRIx64 ", x2: 0x%016" PRIx64 ", x3: 0x%016" PRIx64 ", x4: 0x%016" PRIx64 "\n", + smc_fid, x1, x2, x3, x4); + + if (smc_fid & SIP_FID_MASK) { + WARN("SMC out of SiP assinged range: 0x%x\n", smc_fid); + SMC_RET1(handle, SMC_UNK); + } + /* Let PM SMC handler deal with PM-related requests */ if (is_pm_fid(smc_fid)) { return smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, -- 2.39.5