diff --git a/include/services/gtsi_svc.h b/include/services/gtsi_svc.h deleted file mode 100644 index ef4289f50..000000000 --- a/include/services/gtsi_svc.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2021, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef GTSI_SVC_H -#define GTSI_SVC_H - -/* GTSI error codes. */ -#define GTSI_SUCCESS 0 -#define GTSI_ERROR_NOT_SUPPORTED -1 -#define GTSI_ERROR_INVALID_ADDRESS -2 -#define GTSI_ERROR_INVALID_PAS -3 - -/* The macros below are used to identify GTSI calls from the SMC function ID */ -#define GTSI_FNUM_MIN_VALUE U(0x1B0) -#define GTSI_FNUM_MAX_VALUE U(0x1B1) -#define is_gtsi_fid(fid) __extension__ ({ \ - __typeof__(fid) _fid = (fid); \ - ((GET_SMC_NUM(_fid) >= GTSI_FNUM_MIN_VALUE) && \ - (GET_SMC_NUM(_fid) <= GTSI_FNUM_MAX_VALUE) && \ - (GET_SMC_TYPE(_fid) == SMC_TYPE_FAST) && \ - (GET_SMC_CC(_fid) == SMC_64) && \ - (GET_SMC_OEN(_fid) == OEN_STD_START) && \ - ((_fid & 0x00FE0000) == 0U)); }) - -/* Get GTSI fastcall std FID from function number */ -#define GTSI_FID(smc_cc, func_num) \ - ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ - ((smc_cc) << FUNCID_CC_SHIFT) | \ - (OEN_STD_START << FUNCID_OEN_SHIFT) | \ - ((func_num) << FUNCID_NUM_SHIFT)) - -#define GRAN_TRANS_TO_REALM_FNUM U(0x1B0) -#define GRAN_TRANS_TO_NS_FNUM U(0x1B1) - -#define SMC_ASC_MARK_REALM GTSI_FID(SMC_64, GRAN_TRANS_TO_REALM_FNUM) -#define SMC_ASC_MARK_NONSECURE GTSI_FID(SMC_64, GRAN_TRANS_TO_NS_FNUM) - -#define GRAN_TRANS_RET_BAD_ADDR -2 -#define GRAN_TRANS_RET_BAD_PAS -3 - -#endif /* GTSI_SVC_H */ diff --git a/include/services/rmi_svc.h b/include/services/rmi_svc.h deleted file mode 100644 index 46fd5109d..000000000 --- a/include/services/rmi_svc.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2021, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef RMI_SVC_H -#define RMI_SVC_H - -#include -#include - -/* RMI error codes. */ -#define RMI_SUCCESS 0 -#define RMI_ERROR_NOT_SUPPORTED -1 -#define RMI_ERROR_INVALID_ADDRESS -2 -#define RMI_ERROR_INVALID_PAS -3 - -/* The macros below are used to identify RMI calls from the SMC function ID */ -#define RMI_FNUM_MIN_VALUE U(0x150) -#define RMI_FNUM_MAX_VALUE U(0x18F) -#define is_rmi_fid(fid) __extension__ ({ \ - __typeof__(fid) _fid = (fid); \ - ((GET_SMC_NUM(_fid) >= RMI_FNUM_MIN_VALUE) && \ - (GET_SMC_NUM(_fid) <= RMI_FNUM_MAX_VALUE) && \ - (GET_SMC_TYPE(_fid) == SMC_TYPE_FAST) && \ - (GET_SMC_CC(_fid) == SMC_64) && \ - (GET_SMC_OEN(_fid) == OEN_STD_START) && \ - ((_fid & 0x00FE0000) == 0U)); }) - -/* Get RMI fastcall std FID from function number */ -#define RMI_FID(smc_cc, func_num) \ - ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ - ((smc_cc) << FUNCID_CC_SHIFT) | \ - (OEN_STD_START << FUNCID_OEN_SHIFT) | \ - ((func_num) << FUNCID_NUM_SHIFT)) - -/* - * SMC_RMM_INIT_COMPLETE is the only function in the RMI that originates from - * the Realm world and is handled by the RMMD. The remaining functions are - * always invoked by the Normal world, forwarded by RMMD and handled by the - * RMM - */ -#define RMI_FNUM_REQ_COMPLETE U(0x18F) -#define RMI_FNUM_VERSION_REQ U(0x150) - -#define RMI_FNUM_GRANULE_DELEGATE U(0x151) -#define RMI_FNUM_GRANULE_UNDELEGATE U(0x152) - -/* RMI SMC64 FIDs handled by the RMMD */ -#define RMI_RMM_REQ_COMPLETE RMI_FID(SMC_64, RMI_FNUM_REQ_COMPLETE) -#define RMI_RMM_REQ_VERSION RMI_FID(SMC_64, RMI_FNUM_VERSION_REQ) - -#define RMI_RMM_GRANULE_DELEGATE RMI_FID(SMC_64, \ - RMI_FNUM_GRANULE_DELEGATE) -#define RMI_RMM_GRANULE_UNDELEGATE RMI_FID(SMC_64, \ - RMI_FNUM_GRANULE_UNDELEGATE) - -#define RMI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16) -#define RMI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFF) - -/* Reserve a special value for MBZ parameters. */ -#define RMI_PARAM_MBZ U(0x0) - -#endif /* RMI_SVC_H */ diff --git a/include/services/rmmd_svc.h b/include/services/rmmd_svc.h index 132973b77..8eb49c810 100644 --- a/include/services/rmmd_svc.h +++ b/include/services/rmmd_svc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2022, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,6 +7,76 @@ #ifndef RMMD_SVC_H #define RMMD_SVC_H +#include +#include + +/* Construct RMM fastcall std FID from function number */ +#define RMM_FID(smc_cc, func_num) \ + ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ + ((smc_cc) << FUNCID_CC_SHIFT) | \ + (OEN_STD_START << FUNCID_OEN_SHIFT) | \ + ((func_num) << FUNCID_NUM_SHIFT)) + +/* The macros below are used to identify RMI calls from the SMC function ID */ +#define RMI_FNUM_MIN_VALUE U(0x150) +#define RMI_FNUM_MAX_VALUE U(0x18F) + +#define is_rmi_fid(fid) __extension__ ({ \ + __typeof__(fid) _fid = (fid); \ + ((GET_SMC_NUM(_fid) >= RMI_FNUM_MIN_VALUE) && \ + (GET_SMC_NUM(_fid) <= RMI_FNUM_MAX_VALUE) && \ + (GET_SMC_TYPE(_fid) == SMC_TYPE_FAST) && \ + (GET_SMC_CC(_fid) == SMC_64) && \ + (GET_SMC_OEN(_fid) == OEN_STD_START) && \ + ((_fid & 0x00FE0000) == 0U)); }) + +/* + * RMI_FNUM_REQ_COMPLETE is the only function in the RMI rnage that originates + * from the Realm world and is handled by the RMMD. The RMI functions are + * always invoked by the Normal world, forwarded by RMMD and handled by the + * RMM + */ +#define RMI_FNUM_REQ_COMPLETE U(0x18F) +#define RMMD_RMI_REQ_COMPLETE RMM_FID(SMC_64, RMI_FNUM_REQ_COMPLETE) + +/* The SMC in the range 0x8400 0190 - 0x8400 01AF are reserved for RSIs.*/ + +/* + * EL3 - RMM SMCs used for requesting RMMD services. These SMCs originate in Realm + * world and return to Realm world. + * + * These are allocated from 0x8400 01B0 - 0x8400 01CF in the RMM Service range. + */ +#define RMMD_EL3_FNUM_MIN_VALUE U(0x1B0) +#define RMMD_EL3_FNUM_MAX_VALUE U(0x1CF) + +/* The macros below are used to identify GTSI calls from the SMC function ID */ +#define is_rmmd_el3_fid(fid) __extension__ ({ \ + __typeof__(fid) _fid = (fid); \ + ((GET_SMC_NUM(_fid) >= RMMD_EL3_FNUM_MIN_VALUE) &&\ + (GET_SMC_NUM(_fid) <= RMMD_EL3_FNUM_MAX_VALUE) &&\ + (GET_SMC_TYPE(_fid) == SMC_TYPE_FAST) && \ + (GET_SMC_CC(_fid) == SMC_64) && \ + (GET_SMC_OEN(_fid) == OEN_STD_START) && \ + ((_fid & 0x00FE0000) == 0U)); }) + +/* RMMD Service Function NUmbers */ +#define GTSI_DELEGATE U(0x1B0) +#define GTSI_UNDELEGATE U(0x1B1) +#define ATTEST_GET_REALM_KEY U(0x1B2) +#define ATTEST_GET_PLAT_TOKEN U(0x1B3) + +#define RMMD_GTSI_DELEGATE RMM_FID(SMC_64, GTSI_DELEGATE) +#define RMMD_GTSI_UNDELEGATE RMM_FID(SMC_64, GTSI_UNDELEGATE) + +/* Return error codes from RMM-EL3 SMCs */ +#define RMMD_OK 0 +#define RMMD_ERR_BAD_ADDR -2 +#define RMMD_ERR_BAD_PAS -3 +#define RMMD_ERR_NOMEM -4 +#define RMMD_ERR_INVAL -5 +#define RMMD_ERR_UNK -6 + #ifndef __ASSEMBLER__ #include @@ -20,7 +90,7 @@ uint64_t rmmd_rmi_handler(uint32_t smc_fid, void *handle, uint64_t flags); -uint64_t rmmd_gtsi_handler(uint32_t smc_fid, +uint64_t rmmd_rmm_el3_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, diff --git a/services/std_svc/rmmd/rmmd_main.c b/services/std_svc/rmmd/rmmd_main.c index 28d0b01bf..7f4a0109c 100644 --- a/services/std_svc/rmmd/rmmd_main.c +++ b/services/std_svc/rmmd/rmmd_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2022, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -257,7 +255,7 @@ uint64_t rmmd_rmi_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, /* RMI must not be invoked by the Secure world */ if (src_sec_state == SMC_FROM_SECURE) { - WARN("RMM: RMI invoked by secure world.\n"); + WARN("RMMD: RMI invoked by secure world.\n"); SMC_RET1(handle, SMC_UNK); } @@ -266,17 +264,19 @@ uint64_t rmmd_rmi_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, * is. */ if (src_sec_state == SMC_FROM_NON_SECURE) { - VERBOSE("RMM: RMI call from non-secure world.\n"); + VERBOSE("RMMD: RMI call from non-secure world.\n"); return rmmd_smc_forward(NON_SECURE, REALM, smc_fid, x1, x2, x3, x4, handle); } - assert(src_sec_state == SMC_FROM_REALM); + if (src_sec_state != SMC_FROM_REALM) { + SMC_RET1(handle, SMC_UNK); + } switch (smc_fid) { - case RMI_RMM_REQ_COMPLETE: + case RMMD_RMI_REQ_COMPLETE: if (ctx->state == RMM_STATE_RESET) { - VERBOSE("RMM: running rmmd_rmm_sync_exit\n"); + VERBOSE("RMMD: running rmmd_rmm_sync_exit\n"); rmmd_rmm_sync_exit(x1); } @@ -284,7 +284,7 @@ uint64_t rmmd_rmi_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, x2, x3, x4, 0, handle); default: - WARN("RMM: Unsupported RMM call 0x%08x\n", smc_fid); + WARN("RMMD: Unsupported RMM call 0x%08x\n", smc_fid); SMC_RET1(handle, SMC_UNK); } } @@ -325,10 +325,32 @@ static void *rmmd_cpu_on_finish_handler(const void *arg) /* Subscribe to PSCI CPU on to initialize RMM on secondary */ SUBSCRIBE_TO_EVENT(psci_cpu_on_finish, rmmd_cpu_on_finish_handler); +/* Convert GPT lib error to RMMD GTS error */ +static int gpt_to_gts_error(int error, uint32_t smc_fid, uint64_t address) +{ + int ret; + + if (error == 0) { + return RMMD_OK; + } + + if (error == -EINVAL) { + ret = RMMD_ERR_BAD_ADDR; + } else { + /* This is the only other error code we expect */ + assert(error == -EPERM); + ret = RMMD_ERR_BAD_PAS; + } + + ERROR("RMMD: PAS Transition failed. GPT ret = %d, PA: 0x%"PRIx64 ", FID = 0x%x\n", + error, address, smc_fid); + return ret; +} + /******************************************************************************* - * This function handles all SMCs in the range reserved for GTF. + * This function handles RMM-EL3 interface SMCs ******************************************************************************/ -uint64_t rmmd_gtsi_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, +uint64_t rmmd_rmm_el3_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { @@ -339,33 +361,19 @@ uint64_t rmmd_gtsi_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, src_sec_state = caller_sec_state(flags); if (src_sec_state != SMC_FROM_REALM) { - WARN("RMM: GTF call originated from secure or normal world\n"); + WARN("RMMD: RMM-EL3 call originated from secure or normal world\n"); SMC_RET1(handle, SMC_UNK); } switch (smc_fid) { - case SMC_ASC_MARK_REALM: + case RMMD_GTSI_DELEGATE: ret = gpt_delegate_pas(x1, PAGE_SIZE_4KB, SMC_FROM_REALM); - break; - case SMC_ASC_MARK_NONSECURE: + SMC_RET1(handle, gpt_to_gts_error(ret, smc_fid, x1)); + case RMMD_GTSI_UNDELEGATE: ret = gpt_undelegate_pas(x1, PAGE_SIZE_4KB, SMC_FROM_REALM); - break; + SMC_RET1(handle, gpt_to_gts_error(ret, smc_fid, x1)); default: - WARN("RMM: Unsupported GTF call 0x%08x\n", smc_fid); + WARN("RMMD: Unsupported RMM-EL3 call 0x%08x\n", smc_fid); SMC_RET1(handle, SMC_UNK); } - - if (ret == -EINVAL) { - ERROR("[GTSI] Transition failed: invalid %s\n", "address"); - ERROR(" PA: 0x%"PRIx64 ", SRC: %d, PAS: %d\n", x1, - SMC_FROM_REALM, smc_fid); - ret = GRAN_TRANS_RET_BAD_ADDR; - } else if (ret == -EPERM) { - ERROR("[GTSI] Transition failed: invalid %s\n", "caller/PAS"); - ERROR(" PA: 0x%"PRIx64 ", SRC: %d, PAS: %d\n", x1, - SMC_FROM_REALM, smc_fid); - ret = GRAN_TRANS_RET_BAD_PAS; - } - - SMC_RET1(handle, ret); } diff --git a/services/std_svc/rmmd/rmmd_private.h b/services/std_svc/rmmd/rmmd_private.h index d170bcd22..ca2c37c7b 100644 --- a/services/std_svc/rmmd/rmmd_private.h +++ b/services/std_svc/rmmd/rmmd_private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2022, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -31,7 +31,6 @@ #ifndef __ASSEMBLER__ #include -#include typedef enum rmm_state { RMM_STATE_RESET = 0, diff --git a/services/std_svc/rmmd/trp/trp_entry.S b/services/std_svc/rmmd/trp/trp_entry.S index 5826d7501..1b03c9fbc 100644 --- a/services/std_svc/rmmd/trp/trp_entry.S +++ b/services/std_svc/rmmd/trp/trp_entry.S @@ -1,12 +1,11 @@ /* - * Copyright (c) 2021, Arm Limited. All rights reserved. + * Copyright (c) 2021-2022, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include -#include -#include +#include #include "trp_private.h" .global trp_head @@ -59,7 +58,7 @@ trp_head: bl trp_main warm_boot: - mov_imm x0, RMI_RMM_REQ_COMPLETE + mov_imm x0, RMMD_RMI_REQ_COMPLETE mov x1, xzr smc #0 b trp_handler diff --git a/services/std_svc/rmmd/trp/trp_main.c b/services/std_svc/rmmd/trp/trp_main.c index 2ab9eccfd..2e3f07634 100644 --- a/services/std_svc/rmmd/trp/trp_main.c +++ b/services/std_svc/rmmd/trp/trp_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,8 +7,7 @@ #include #include -#include -#include +#include #include #include @@ -79,7 +78,7 @@ static trp_args_t *trp_ret_rmi_version(void) { VERBOSE("RMM version is %u.%u\n", RMI_ABI_VERSION_MAJOR, RMI_ABI_VERSION_MINOR); - return set_smc_args(RMI_RMM_REQ_COMPLETE, RMI_ABI_VERSION, + return set_smc_args(RMMD_RMI_REQ_COMPLETE, RMI_ABI_VERSION, 0, 0, 0, 0, 0, 0); } @@ -91,13 +90,13 @@ static trp_args_t *trp_asc_mark_realm(unsigned long long x1) unsigned long long ret; VERBOSE("Delegating granule 0x%llx\n", x1); - ret = trp_smc(set_smc_args(SMC_ASC_MARK_REALM, x1, 0, 0, 0, 0, 0, 0)); + ret = trp_smc(set_smc_args(RMMD_GTSI_DELEGATE, x1, 0, 0, 0, 0, 0, 0)); if (ret != 0ULL) { ERROR("Granule transition from NON-SECURE type to REALM type " "failed 0x%llx\n", ret); } - return set_smc_args(RMI_RMM_REQ_COMPLETE, ret, 0, 0, 0, 0, 0, 0); + return set_smc_args(RMMD_RMI_REQ_COMPLETE, ret, 0, 0, 0, 0, 0, 0); } /******************************************************************************* @@ -108,13 +107,13 @@ static trp_args_t *trp_asc_mark_nonsecure(unsigned long long x1) unsigned long long ret; VERBOSE("Undelegating granule 0x%llx\n", x1); - ret = trp_smc(set_smc_args(SMC_ASC_MARK_NONSECURE, x1, 0, 0, 0, 0, 0, 0)); + ret = trp_smc(set_smc_args(RMMD_GTSI_UNDELEGATE, x1, 0, 0, 0, 0, 0, 0)); if (ret != 0ULL) { ERROR("Granule transition from REALM type to NON-SECURE type " "failed 0x%llx\n", ret); } - return set_smc_args(RMI_RMM_REQ_COMPLETE, ret, 0, 0, 0, 0, 0, 0); + return set_smc_args(RMMD_RMI_REQ_COMPLETE, ret, 0, 0, 0, 0, 0, 0); } /******************************************************************************* diff --git a/services/std_svc/rmmd/trp/trp_private.h b/services/std_svc/rmmd/trp/trp_private.h index 923139007..43a4a4bfd 100644 --- a/services/std_svc/rmmd/trp/trp_private.h +++ b/services/std_svc/rmmd/trp/trp_private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -31,6 +31,19 @@ typedef struct trp_args { #define write_trp_arg(args, offset, val) (((args)->regs[offset >> 3]) \ = val) +/* RMI handled by TRP */ +#define RMI_FNUM_VERSION_REQ U(0x150) + +#define RMI_FNUM_GRANULE_DELEGATE U(0x151) +#define RMI_FNUM_GRANULE_UNDELEGATE U(0x152) + +#define RMI_RMM_REQ_VERSION RMM_FID(SMC_64, RMI_FNUM_VERSION_REQ) + +#define RMI_RMM_GRANULE_DELEGATE RMM_FID(SMC_64, \ + RMI_FNUM_GRANULE_DELEGATE) +#define RMI_RMM_GRANULE_UNDELEGATE RMM_FID(SMC_64, \ + RMI_FNUM_GRANULE_UNDELEGATE) + /* Definitions for RMI VERSION */ #define RMI_ABI_VERSION_MAJOR U(0x0) #define RMI_ABI_VERSION_MINOR U(0x0) diff --git a/services/std_svc/std_svc_setup.c b/services/std_svc/std_svc_setup.c index eea7e147a..bfe26cab1 100644 --- a/services/std_svc/std_svc_setup.c +++ b/services/std_svc/std_svc_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2021, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2022, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,9 +13,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -168,13 +166,10 @@ static uintptr_t std_svc_smc_handler(uint32_t smc_fid, } #endif #if ENABLE_RME - /* - * Granule transition service interface functions (GTSI) are allocated - * from the Std service range. Call the RMM dispatcher to handle calls. - */ - if (is_gtsi_fid(smc_fid)) { - return rmmd_gtsi_handler(smc_fid, x1, x2, x3, x4, cookie, - handle, flags); + + if (is_rmmd_el3_fid(smc_fid)) { + return rmmd_rmm_el3_handler(smc_fid, x1, x2, x3, x4, cookie, + handle, flags); } if (is_rmi_fid(smc_fid)) {