diff options
author | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-11-08 14:12:40 +0000 |
---|---|---|
committer | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-12-11 13:45:41 +0000 |
commit | e8ce60aeb139a0f11bee83bd3ce904475d2bf460 (patch) | |
tree | 92906ca010e6eec986eaf33dcb395c1ae4c47631 /services/std_svc/spm | |
parent | bbc8100720ee95478e90895f1061009551f92851 (diff) | |
download | trusted-firmware-a-e8ce60aeb139a0f11bee83bd3ce904475d2bf460.tar.gz |
SPM: Introduce SMC handlers for SPCI and SPRT
Change-Id: I2ae9b3bb686c41b2e138132a7bed107925ac861e
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Diffstat (limited to 'services/std_svc/spm')
-rw-r--r-- | services/std_svc/spm/spci.c | 52 | ||||
-rw-r--r-- | services/std_svc/spm/spm.mk | 9 | ||||
-rw-r--r-- | services/std_svc/spm/sprt.c | 48 |
3 files changed, 107 insertions, 2 deletions
diff --git a/services/std_svc/spm/spci.c b/services/std_svc/spm/spci.c new file mode 100644 index 0000000000..603523f18e --- /dev/null +++ b/services/std_svc/spm/spci.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <debug.h> +#include <smccc.h> +#include <smccc_helpers.h> +#include <spci_svc.h> +#include <utils.h> + +#include "spm_private.h" + +/******************************************************************************* + * This function handles all SMCs in the range reserved for SPCI. + ******************************************************************************/ +uint64_t spci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, + uint64_t x3, uint64_t x4, void *cookie, void *handle, + uint64_t flags) +{ + uint32_t spci_fid; + + /* SPCI only supported from the Non-secure world for now */ + if (is_caller_non_secure(flags) == SMC_FROM_SECURE) { + SMC_RET1(handle, SMC_UNK); + } + + if ((smc_fid & SPCI_FID_TUN_FLAG) == 0) { + + /* Miscellaneous calls */ + + spci_fid = (smc_fid >> SPCI_FID_MISC_SHIFT) & SPCI_FID_MISC_MASK; + + switch (spci_fid) { + + case SPCI_FID_VERSION: + SMC_RET1(handle, SPCI_VERSION_COMPILED); + + default: + break; + } + + } else { + + /* Tunneled calls */ + + } + + WARN("SPCI: Unsupported call 0x%08x\n", smc_fid); + SMC_RET1(handle, SPCI_NOT_SUPPORTED); +} diff --git a/services/std_svc/spm/spm.mk b/services/std_svc/spm/spm.mk index 0e77086045..889c77d25b 100644 --- a/services/std_svc/spm/spm.mk +++ b/services/std_svc/spm/spm.mk @@ -14,10 +14,15 @@ endif SPM_SOURCES := $(addprefix services/std_svc/spm/, \ ${ARCH}/spm_helpers.S \ ${ARCH}/spm_shim_exceptions.S \ - spm_main.c \ sp_setup.c \ - sp_xlat.c) + sp_xlat.c \ + spci.c \ + spm_main.c \ + sprt.c) + +# Force SMC Calling Convention 2 when using SPM +SMCCC_MAJOR_VERSION := 2 # Let the top-level Makefile know that we intend to include a BL32 image NEED_BL32 := yes diff --git a/services/std_svc/spm/sprt.c b/services/std_svc/spm/sprt.c new file mode 100644 index 0000000000..8d0c510b93 --- /dev/null +++ b/services/std_svc/spm/sprt.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <arch_helpers.h> +#include <assert.h> +#include <context_mgmt.h> +#include <debug.h> +#include <smccc.h> +#include <smccc_helpers.h> +#include <sprt_svc.h> +#include <utils.h> + +#include "spm_private.h" + +/******************************************************************************* + * This function handles all SMCs in the range reserved for SPRT. + ******************************************************************************/ +uint64_t sprt_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, + uint64_t x3, uint64_t x4, void *cookie, void *handle, + uint64_t flags) +{ + /* SPRT only supported from the Secure world */ + if (is_caller_non_secure(flags) == SMC_FROM_NON_SECURE) { + SMC_RET1(handle, SMC_UNK); + } + + assert(handle == cm_get_context(SECURE)); + + /* + * Only S-EL0 partitions are supported for now. Make the next ERET into + * the partition jump directly to S-EL0 instead of S-EL1. + */ + cm_set_elr_spsr_el3(SECURE, read_elr_el1(), read_spsr_el1()); + + switch (smc_fid) { + case SPRT_VERSION: + SMC_RET1(handle, SPRT_VERSION_COMPILED); + + default: + break; + } + + WARN("SPRT: Unsupported call 0x%08x\n", smc_fid); + SMC_RET1(handle, SPRT_NOT_SUPPORTED); +} |