xref: /rk3399_ARM-atf/services/arm_arch_svc/arm_arch_svc_setup.c (revision 7832483ebf3e2ed8cc7c2e1b1ef83c3b9a4eaf1a)
13a1b0676SDimitris Papastamos /*
28ae6b1adSArvind Ram Prakash  * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved.
33a1b0676SDimitris Papastamos  *
43a1b0676SDimitris Papastamos  * SPDX-License-Identifier: BSD-3-Clause
53a1b0676SDimitris Papastamos  */
63a1b0676SDimitris Papastamos 
709d40e0eSAntonio Nino Diaz #include <common/debug.h>
809d40e0eSAntonio Nino Diaz #include <common/runtime_svc.h>
96bb96fa6SBoyan Karatotev #include <lib/cpus/errata.h>
1009d40e0eSAntonio Nino Diaz #include <lib/smccc.h>
1109d40e0eSAntonio Nino Diaz #include <services/arm_arch_svc.h>
12085e80ecSAntonio Nino Diaz #include <smccc_helpers.h>
130e753437SManish V Badarkhe #include <plat/common/platform.h>
148db17052SBoyan Karatotev #include <arch_features.h>
158db17052SBoyan Karatotev #include <arch_helpers.h>
168db17052SBoyan Karatotev #include <lib/el3_runtime/context_mgmt.h>
173a1b0676SDimitris Papastamos 
smccc_version(void)183a1b0676SDimitris Papastamos static int32_t smccc_version(void)
193a1b0676SDimitris Papastamos {
20d16ad813SMaheedhar Bollapalli 	return (int32_t)MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION);
213a1b0676SDimitris Papastamos }
223a1b0676SDimitris Papastamos 
smccc_arch_features(u_register_t arg1)23a718c3d6SManish V Badarkhe static int32_t smccc_arch_features(u_register_t arg1)
243a1b0676SDimitris Papastamos {
250e753437SManish V Badarkhe 	switch (arg1) {
263a1b0676SDimitris Papastamos 	case SMCCC_VERSION:
273a1b0676SDimitris Papastamos 	case SMCCC_ARCH_FEATURES:
286f0a2f04SManish V Badarkhe 		return SMC_ARCH_CALL_SUCCESS;
290e753437SManish V Badarkhe 	case SMCCC_ARCH_SOC_ID:
306f0a2f04SManish V Badarkhe 		return plat_is_smccc_feature_available(arg1);
31d1f2748eSStephan Gerhold #ifdef __aarch64__
32d1f2748eSStephan Gerhold 	/* Workaround checks are currently only implemented for aarch64 */
3359dc4ef4SDimitris Papastamos #if WORKAROUND_CVE_2017_5715
343a1b0676SDimitris Papastamos 	case SMCCC_ARCH_WORKAROUND_1:
35fd04156eSArvind Ram Prakash 		if (check_erratum_applies(CVE(2017, 5715))
36fd04156eSArvind Ram Prakash 			== ERRATA_NOT_APPLIES) {
37a205a56eSDimitris Papastamos 			return 1;
38fd04156eSArvind Ram Prakash 		}
39fd04156eSArvind Ram Prakash 
4059dc4ef4SDimitris Papastamos 		return 0; /* ERRATA_APPLIES || ERRATA_MISSING */
4159dc4ef4SDimitris Papastamos #endif
4248e1d350SJeenu Viswambharan 
43b8a25bbbSDimitris Papastamos #if WORKAROUND_CVE_2018_3639
4448e1d350SJeenu Viswambharan 	case SMCCC_ARCH_WORKAROUND_2: {
45fe007b2eSDimitris Papastamos #if DYNAMIC_WORKAROUND_CVE_2018_3639
4648e1d350SJeenu Viswambharan 		unsigned long long ssbs;
4748e1d350SJeenu Viswambharan 
4848e1d350SJeenu Viswambharan 		/*
4948e1d350SJeenu Viswambharan 		 * Firmware doesn't have to carry out dynamic workaround if the
5048e1d350SJeenu Viswambharan 		 * PE implements architectural Speculation Store Bypass Safe
5148e1d350SJeenu Viswambharan 		 * (SSBS) feature.
5248e1d350SJeenu Viswambharan 		 */
536ecfda52SDimitris Papastamos 		ssbs = (read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SSBS_SHIFT) &
5448e1d350SJeenu Viswambharan 			ID_AA64PFR1_EL1_SSBS_MASK;
5548e1d350SJeenu Viswambharan 
5648e1d350SJeenu Viswambharan 		/*
5748e1d350SJeenu Viswambharan 		 * If architectural SSBS is available on this PE, no firmware
5848e1d350SJeenu Viswambharan 		 * mitigation via SMCCC_ARCH_WORKAROUND_2 is required.
5948e1d350SJeenu Viswambharan 		 */
609e51f15eSSona Mathew 		if (ssbs != SSBS_NOT_IMPLEMENTED)
6148e1d350SJeenu Viswambharan 			return 1;
6248e1d350SJeenu Viswambharan 
63fe007b2eSDimitris Papastamos 		/*
64fe007b2eSDimitris Papastamos 		 * On a platform where at least one CPU requires
65fe007b2eSDimitris Papastamos 		 * dynamic mitigation but others are either unaffected
66fe007b2eSDimitris Papastamos 		 * or permanently mitigated, report the latter as not
67fe007b2eSDimitris Papastamos 		 * needing dynamic mitigation.
68fe007b2eSDimitris Papastamos 		 */
69fd04156eSArvind Ram Prakash 		if (check_erratum_applies(ERRATUM(ARCH_WORKAROUND_2))
70fd04156eSArvind Ram Prakash 			== ERRATA_NOT_APPLIES)
71fe007b2eSDimitris Papastamos 			return 1;
72fd04156eSArvind Ram Prakash 
73fe007b2eSDimitris Papastamos 		/*
74fe007b2eSDimitris Papastamos 		 * If we get here, this CPU requires dynamic mitigation
75fe007b2eSDimitris Papastamos 		 * so report it as such.
76fe007b2eSDimitris Papastamos 		 */
77fe007b2eSDimitris Papastamos 		return 0;
78fe007b2eSDimitris Papastamos #else
79fe007b2eSDimitris Papastamos 		/* Either the CPUs are unaffected or permanently mitigated */
80af10d224SManish V Badarkhe 		return SMC_ARCH_CALL_NOT_REQUIRED;
81b8a25bbbSDimitris Papastamos #endif
8248e1d350SJeenu Viswambharan 	}
83fe007b2eSDimitris Papastamos #endif
8448e1d350SJeenu Viswambharan 
859b2510b6SBipin Ravi #if (WORKAROUND_CVE_2022_23960 || WORKAROUND_CVE_2017_5715)
869b2510b6SBipin Ravi 	case SMCCC_ARCH_WORKAROUND_3:
879b2510b6SBipin Ravi 		/*
889b2510b6SBipin Ravi 		 * SMCCC_ARCH_WORKAROUND_3 should also take into account
899b2510b6SBipin Ravi 		 * CVE-2017-5715 since this SMC can be used instead of
909b2510b6SBipin Ravi 		 * SMCCC_ARCH_WORKAROUND_1.
919b2510b6SBipin Ravi 		 */
92fd04156eSArvind Ram Prakash 		if ((check_erratum_applies(ERRATUM(ARCH_WORKAROUND_3))
93fd04156eSArvind Ram Prakash 			== ERRATA_NOT_APPLIES) &&
94fd04156eSArvind Ram Prakash 		    (check_erratum_applies(CVE(2017, 5715))
95fd04156eSArvind Ram Prakash 			== ERRATA_NOT_APPLIES)) {
969b2510b6SBipin Ravi 			return 1;
979b2510b6SBipin Ravi 		}
98fd04156eSArvind Ram Prakash 
999b2510b6SBipin Ravi 		return 0; /* ERRATA_APPLIES || ERRATA_MISSING */
1009b2510b6SBipin Ravi #endif
1018db17052SBoyan Karatotev 
1028db17052SBoyan Karatotev #if ARCH_FEATURE_AVAILABILITY
103a0fa44b4SSona Mathew 	case SMCCC_ARCH_FEATURE_AVAILABILITY | (SMC_64 << FUNCID_CC_SHIFT):
1048db17052SBoyan Karatotev 		return SMC_ARCH_CALL_SUCCESS;
1058db17052SBoyan Karatotev #endif /* ARCH_FEATURE_AVAILABILITY */
1068db17052SBoyan Karatotev 
1078ae6b1adSArvind Ram Prakash #if WORKAROUND_CVE_2024_7881
1088ae6b1adSArvind Ram Prakash 	case SMCCC_ARCH_WORKAROUND_4:
109fd04156eSArvind Ram Prakash 		if (check_erratum_applies(CVE(2024, 7881)) != ERRATA_APPLIES) {
1108ae6b1adSArvind Ram Prakash 			return SMC_ARCH_CALL_NOT_SUPPORTED;
1118ae6b1adSArvind Ram Prakash 		}
1128ae6b1adSArvind Ram Prakash 		return 0;
1138ae6b1adSArvind Ram Prakash #endif /* WORKAROUND_CVE_2024_7881 */
1148ae6b1adSArvind Ram Prakash 
115d1f2748eSStephan Gerhold #endif /* __aarch64__ */
1169b2510b6SBipin Ravi 
11748e1d350SJeenu Viswambharan 	/* Fallthrough */
11848e1d350SJeenu Viswambharan 
1193a1b0676SDimitris Papastamos 	default:
1203a1b0676SDimitris Papastamos 		return SMC_UNK;
1213a1b0676SDimitris Papastamos 	}
1223a1b0676SDimitris Papastamos }
1233a1b0676SDimitris Papastamos 
124cb4ee3e4SArvind Ram Prakash /*
125cb4ee3e4SArvind Ram Prakash  * Handles SMCCC_ARCH_SOC_ID smc calls.
126cb4ee3e4SArvind Ram Prakash  *
127cb4ee3e4SArvind Ram Prakash  * - GET_SOC_REVISION: returns SoC revision (AArch32/AArch64)
128cb4ee3e4SArvind Ram Prakash  * - GET_SOC_VERSION:  returns SoC version  (AArch32/AArch64)
129cb4ee3e4SArvind Ram Prakash  * - GET_SOC_NAME:     returns SoC name string (AArch64 only)
130cb4ee3e4SArvind Ram Prakash  *
131cb4ee3e4SArvind Ram Prakash  * Returns invalid parameter for unsupported calls.
132cb4ee3e4SArvind Ram Prakash  */
smccc_arch_id(u_register_t arg1,void * handle,uint32_t is_smc64)133cb4ee3e4SArvind Ram Prakash static uintptr_t smccc_arch_id(u_register_t arg1, void *handle, uint32_t is_smc64)
134a718c3d6SManish V Badarkhe {
135a718c3d6SManish V Badarkhe 	if (arg1 == SMCCC_GET_SOC_REVISION) {
136cb4ee3e4SArvind Ram Prakash 		SMC_RET1(handle, plat_get_soc_revision());
137a718c3d6SManish V Badarkhe 	}
138a718c3d6SManish V Badarkhe 	if (arg1 == SMCCC_GET_SOC_VERSION) {
139cb4ee3e4SArvind Ram Prakash 		SMC_RET1(handle, plat_get_soc_version());
140a718c3d6SManish V Badarkhe 	}
141cb4ee3e4SArvind Ram Prakash #if __aarch64__
142cb4ee3e4SArvind Ram Prakash 	/* SoC Name is only present for SMC64 invocations */
143cb4ee3e4SArvind Ram Prakash 	if ((arg1 == SMCCC_GET_SOC_NAME) && is_smc64) {
144cb4ee3e4SArvind Ram Prakash 		uint64_t arg[SMCCC_SOC_NAME_LEN / 8];
145cb4ee3e4SArvind Ram Prakash 		int32_t ret;
146cb4ee3e4SArvind Ram Prakash 		char soc_name[SMCCC_SOC_NAME_LEN];
147cb4ee3e4SArvind Ram Prakash 
148cb4ee3e4SArvind Ram Prakash 		(void)memset(soc_name, 0U, SMCCC_SOC_NAME_LEN);
149cb4ee3e4SArvind Ram Prakash 		ret = plat_get_soc_name(soc_name);
150cb4ee3e4SArvind Ram Prakash 
151cb4ee3e4SArvind Ram Prakash 		if (ret == SMC_ARCH_CALL_SUCCESS) {
152cb4ee3e4SArvind Ram Prakash 			(void)memcpy(arg, soc_name, SMCCC_SOC_NAME_LEN);
153cb4ee3e4SArvind Ram Prakash 			/*
154cb4ee3e4SArvind Ram Prakash 			 * The SoC name is returned as a null-terminated
155cb4ee3e4SArvind Ram Prakash 			 * ASCII string, split across registers X1 to X17
156cb4ee3e4SArvind Ram Prakash 			 * in little endian order.
157cb4ee3e4SArvind Ram Prakash 			 * Each 64-bit register holds 8 consecutive bytes
158cb4ee3e4SArvind Ram Prakash 			 * of the string.
159cb4ee3e4SArvind Ram Prakash 			 */
160cb4ee3e4SArvind Ram Prakash 			SMC_RET18(handle, ret, arg[0], arg[1], arg[2],
161cb4ee3e4SArvind Ram Prakash 					arg[3], arg[4], arg[5], arg[6],
162cb4ee3e4SArvind Ram Prakash 					arg[7], arg[8], arg[9], arg[10],
163cb4ee3e4SArvind Ram Prakash 					arg[11], arg[12], arg[13], arg[14],
164cb4ee3e4SArvind Ram Prakash 					arg[15], arg[16]);
165cb4ee3e4SArvind Ram Prakash 		} else {
166cb4ee3e4SArvind Ram Prakash 			SMC_RET1(handle, ret);
167cb4ee3e4SArvind Ram Prakash 		}
168cb4ee3e4SArvind Ram Prakash 	}
169cb4ee3e4SArvind Ram Prakash #endif /* __aarch64__ */
170cb4ee3e4SArvind Ram Prakash 	SMC_RET1(handle, SMC_ARCH_CALL_INVAL_PARAM);
171a718c3d6SManish V Badarkhe }
172a718c3d6SManish V Badarkhe 
1733a1b0676SDimitris Papastamos /*
1748db17052SBoyan Karatotev  * Reads a system register, sanitises its value, and returns a bitmask
1758db17052SBoyan Karatotev  * representing which feature in that sysreg has been enabled by firmware. The
1768db17052SBoyan Karatotev  * bitmask is a 1:1 mapping to the register's fields.
1778db17052SBoyan Karatotev  */
1788db17052SBoyan Karatotev #if ARCH_FEATURE_AVAILABILITY
smccc_arch_feature_availability(u_register_t reg,void * handle,u_register_t flags)1798db17052SBoyan Karatotev static uintptr_t smccc_arch_feature_availability(u_register_t reg,
1808db17052SBoyan Karatotev 						 void *handle,
1818db17052SBoyan Karatotev 						 u_register_t flags)
1828db17052SBoyan Karatotev {
1838db17052SBoyan Karatotev 	per_world_context_t *caller_per_world_context;
1848db17052SBoyan Karatotev 	el3_state_t *state;
1858db17052SBoyan Karatotev 	u_register_t bitmask, check;
18634a22a02SBoyan Karatotev 	size_t security_state;
1878db17052SBoyan Karatotev 
1888db17052SBoyan Karatotev 	/* check the caller security state */
1898db17052SBoyan Karatotev 	if (is_caller_secure(flags)) {
19034a22a02SBoyan Karatotev 		security_state = SECURE;
1918db17052SBoyan Karatotev 	} else if (is_caller_non_secure(flags)) {
19234a22a02SBoyan Karatotev 		security_state = NON_SECURE;
1938db17052SBoyan Karatotev 	} else {
1948db17052SBoyan Karatotev #if ENABLE_RME
19534a22a02SBoyan Karatotev 		security_state = REALM;
1968db17052SBoyan Karatotev #else /* !ENABLE_RME */
1978db17052SBoyan Karatotev 		assert(0); /* shouldn't be possible */
1988db17052SBoyan Karatotev #endif /* ENABLE_RME */
1998db17052SBoyan Karatotev 	}
2008db17052SBoyan Karatotev 
20134a22a02SBoyan Karatotev 	caller_per_world_context = &per_world_context[get_cpu_context_index(security_state)];
20234a22a02SBoyan Karatotev 	state = get_el3state_ctx(cm_get_context(security_state));
2038db17052SBoyan Karatotev 
2048db17052SBoyan Karatotev 	switch (reg) {
2058db17052SBoyan Karatotev 	case SCR_EL3_OPCODE:
2068db17052SBoyan Karatotev 		bitmask  = read_ctx_reg(state, CTX_SCR_EL3);
2078db17052SBoyan Karatotev 		bitmask &= ~SCR_EL3_IGNORED;
2088db17052SBoyan Karatotev 		check    = bitmask & ~SCR_EL3_FEATS;
2098db17052SBoyan Karatotev 		bitmask &= SCR_EL3_FEATS;
2108db17052SBoyan Karatotev 		bitmask ^= SCR_EL3_FLIPPED;
2118db17052SBoyan Karatotev 		/* will only report 0 if neither is implemented */
212*f610c8c3SBoyan Karatotev 		if (is_feat_rng_trap_supported() || is_feat_rng_present()) {
2138db17052SBoyan Karatotev 			bitmask |= SCR_TRNDR_BIT;
214*f610c8c3SBoyan Karatotev 			check   &= ~SCR_TRNDR_BIT;
215*f610c8c3SBoyan Karatotev 		}
2168db17052SBoyan Karatotev 		break;
2178db17052SBoyan Karatotev 	case CPTR_EL3_OPCODE:
2188db17052SBoyan Karatotev 		bitmask  = caller_per_world_context->ctx_cptr_el3;
2198db17052SBoyan Karatotev 		check    = bitmask & ~CPTR_EL3_FEATS;
2208db17052SBoyan Karatotev 		bitmask &= CPTR_EL3_FEATS;
2218db17052SBoyan Karatotev 		bitmask ^= CPTR_EL3_FLIPPED;
2228db17052SBoyan Karatotev 		break;
2238db17052SBoyan Karatotev 	case MDCR_EL3_OPCODE:
2248db17052SBoyan Karatotev 		bitmask  = read_ctx_reg(state, CTX_MDCR_EL3);
2258db17052SBoyan Karatotev 		bitmask &= ~MDCR_EL3_IGNORED;
2268db17052SBoyan Karatotev 		check    = bitmask & ~MDCR_EL3_FEATS;
2278db17052SBoyan Karatotev 		bitmask &= MDCR_EL3_FEATS;
2288db17052SBoyan Karatotev 		bitmask ^= MDCR_EL3_FLIPPED;
2298db17052SBoyan Karatotev 		break;
2308db17052SBoyan Karatotev #if ENABLE_FEAT_MPAM
2318db17052SBoyan Karatotev 	case MPAM3_EL3_OPCODE:
2328db17052SBoyan Karatotev 		bitmask  = caller_per_world_context->ctx_mpam3_el3;
2338db17052SBoyan Karatotev 		bitmask &= ~MPAM3_EL3_IGNORED;
2348db17052SBoyan Karatotev 		check    = bitmask & ~MPAM3_EL3_FEATS;
2358db17052SBoyan Karatotev 		bitmask &= MPAM3_EL3_FEATS;
2368db17052SBoyan Karatotev 		bitmask ^= MPAM3_EL3_FLIPPED;
2378db17052SBoyan Karatotev 		break;
2388db17052SBoyan Karatotev #endif /* ENABLE_FEAT_MPAM */
2398db17052SBoyan Karatotev 	default:
2408db17052SBoyan Karatotev 		SMC_RET2(handle, SMC_INVALID_PARAM, ULL(0));
2418db17052SBoyan Karatotev 	}
2428db17052SBoyan Karatotev 
2438db17052SBoyan Karatotev 	/*
2448db17052SBoyan Karatotev 	 * failing this means that the requested register has a bit set that
2458db17052SBoyan Karatotev 	 * hasn't been declared as a known feature bit or an ignore bit. This is
2468db17052SBoyan Karatotev 	 * likely to happen when support for a new feature is added but the
2478db17052SBoyan Karatotev 	 * bitmask macros are not updated.
2488db17052SBoyan Karatotev 	 */
2498db17052SBoyan Karatotev 	if (ENABLE_ASSERTIONS && check != 0) {
2508db17052SBoyan Karatotev 		ERROR("Unexpected bits 0x%lx were set in register %lx!\n", check, reg);
2518db17052SBoyan Karatotev 		assert(0);
2528db17052SBoyan Karatotev 	}
2538db17052SBoyan Karatotev 
2548db17052SBoyan Karatotev 	SMC_RET2(handle, SMC_ARCH_CALL_SUCCESS, bitmask);
2558db17052SBoyan Karatotev }
2568db17052SBoyan Karatotev #endif /* ARCH_FEATURE_AVAILABILITY */
2578db17052SBoyan Karatotev 
2588db17052SBoyan Karatotev /*
2593a1b0676SDimitris Papastamos  * Top-level Arm Architectural Service SMC handler.
2603a1b0676SDimitris Papastamos  */
arm_arch_svc_smc_handler(uint32_t smc_fid,u_register_t x1,u_register_t x2,u_register_t x3,u_register_t x4,void * cookie,void * handle,u_register_t flags)2617fabe1a8SRoberto Vargas static uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid,
2623a1b0676SDimitris Papastamos 	u_register_t x1,
2633a1b0676SDimitris Papastamos 	u_register_t x2,
2643a1b0676SDimitris Papastamos 	u_register_t x3,
2653a1b0676SDimitris Papastamos 	u_register_t x4,
2663a1b0676SDimitris Papastamos 	void *cookie,
2673a1b0676SDimitris Papastamos 	void *handle,
2683a1b0676SDimitris Papastamos 	u_register_t flags)
2693a1b0676SDimitris Papastamos {
2708cee7b24SSigned-off-by: Maheedhar Bollapalli 	(void)x2;
2718cee7b24SSigned-off-by: Maheedhar Bollapalli 	(void)x3;
2728cee7b24SSigned-off-by: Maheedhar Bollapalli 	(void)x4;
2738cee7b24SSigned-off-by: Maheedhar Bollapalli 	(void)cookie;
2748cee7b24SSigned-off-by: Maheedhar Bollapalli 
2753a1b0676SDimitris Papastamos 	switch (smc_fid) {
2763a1b0676SDimitris Papastamos 	case SMCCC_VERSION:
2773a1b0676SDimitris Papastamos 		SMC_RET1(handle, smccc_version());
2783a1b0676SDimitris Papastamos 	case SMCCC_ARCH_FEATURES:
279a718c3d6SManish V Badarkhe 		SMC_RET1(handle, smccc_arch_features(x1));
280a718c3d6SManish V Badarkhe 	case SMCCC_ARCH_SOC_ID:
281cb4ee3e4SArvind Ram Prakash 	case SMCCC_ARCH_SOC_ID | (SMC_64 << FUNCID_CC_SHIFT):
282cb4ee3e4SArvind Ram Prakash 		return smccc_arch_id(x1, handle, (smc_fid
283cb4ee3e4SArvind Ram Prakash 				& (SMC_64 << FUNCID_CC_SHIFT)));
284cb4ee3e4SArvind Ram Prakash #if __aarch64__
2853a1b0676SDimitris Papastamos #if WORKAROUND_CVE_2017_5715
2863a1b0676SDimitris Papastamos 	case SMCCC_ARCH_WORKAROUND_1:
2873a1b0676SDimitris Papastamos 		/*
2883a1b0676SDimitris Papastamos 		 * The workaround has already been applied on affected PEs
2893a1b0676SDimitris Papastamos 		 * during entry to EL3. On unaffected PEs, this function
2903a1b0676SDimitris Papastamos 		 * has no effect.
2913a1b0676SDimitris Papastamos 		 */
2923a1b0676SDimitris Papastamos 		SMC_RET0(handle);
2933a1b0676SDimitris Papastamos #endif
294b8a25bbbSDimitris Papastamos #if WORKAROUND_CVE_2018_3639
295b8a25bbbSDimitris Papastamos 	case SMCCC_ARCH_WORKAROUND_2:
296b8a25bbbSDimitris Papastamos 		/*
297b8a25bbbSDimitris Papastamos 		 * The workaround has already been applied on affected PEs
298b8a25bbbSDimitris Papastamos 		 * requiring dynamic mitigation during entry to EL3.
299b8a25bbbSDimitris Papastamos 		 * On unaffected or statically mitigated PEs, this function
300b8a25bbbSDimitris Papastamos 		 * has no effect.
301b8a25bbbSDimitris Papastamos 		 */
302b8a25bbbSDimitris Papastamos 		SMC_RET0(handle);
303b8a25bbbSDimitris Papastamos #endif
3049b2510b6SBipin Ravi #if (WORKAROUND_CVE_2022_23960 || WORKAROUND_CVE_2017_5715)
3059b2510b6SBipin Ravi 	case SMCCC_ARCH_WORKAROUND_3:
3069b2510b6SBipin Ravi 		/*
3079b2510b6SBipin Ravi 		 * The workaround has already been applied on affected PEs
3089b2510b6SBipin Ravi 		 * during entry to EL3. On unaffected PEs, this function
3099b2510b6SBipin Ravi 		 * has no effect.
3109b2510b6SBipin Ravi 		 */
3119b2510b6SBipin Ravi 		SMC_RET0(handle);
3129b2510b6SBipin Ravi #endif
3138ae6b1adSArvind Ram Prakash #if WORKAROUND_CVE_2024_7881
3148ae6b1adSArvind Ram Prakash 	case SMCCC_ARCH_WORKAROUND_4:
3158ae6b1adSArvind Ram Prakash 		/*
3168ae6b1adSArvind Ram Prakash 		 * The workaround has already been applied on affected PEs
3178ae6b1adSArvind Ram Prakash 		 * during cold boot. This function has no effect whether PE is
3188ae6b1adSArvind Ram Prakash 		 * affected or not.
3198ae6b1adSArvind Ram Prakash 		 */
3208ae6b1adSArvind Ram Prakash 		SMC_RET0(handle);
3218ae6b1adSArvind Ram Prakash #endif /* WORKAROUND_CVE_2024_7881 */
322d1f2748eSStephan Gerhold #endif /* __aarch64__ */
3238db17052SBoyan Karatotev #if ARCH_FEATURE_AVAILABILITY
3248db17052SBoyan Karatotev 	/* return is 64 bit so only reply on SMC64 requests */
3258db17052SBoyan Karatotev 	case SMCCC_ARCH_FEATURE_AVAILABILITY | (SMC_64 << FUNCID_CC_SHIFT):
3268db17052SBoyan Karatotev 		return smccc_arch_feature_availability(x1, handle, flags);
3278db17052SBoyan Karatotev #endif /* ARCH_FEATURE_AVAILABILITY */
3283a1b0676SDimitris Papastamos 	default:
3293a1b0676SDimitris Papastamos 		WARN("Unimplemented Arm Architecture Service Call: 0x%x \n",
3303a1b0676SDimitris Papastamos 			smc_fid);
3313a1b0676SDimitris Papastamos 		SMC_RET1(handle, SMC_UNK);
3323a1b0676SDimitris Papastamos 	}
3333a1b0676SDimitris Papastamos }
3343a1b0676SDimitris Papastamos 
3353a1b0676SDimitris Papastamos /* Register Standard Service Calls as runtime service */
3363a1b0676SDimitris Papastamos DECLARE_RT_SVC(
3373a1b0676SDimitris Papastamos 		arm_arch_svc,
3383a1b0676SDimitris Papastamos 		OEN_ARM_START,
3393a1b0676SDimitris Papastamos 		OEN_ARM_END,
340d16ad813SMaheedhar Bollapalli 		(uint8_t)SMC_TYPE_FAST,
3413a1b0676SDimitris Papastamos 		NULL,
3423a1b0676SDimitris Papastamos 		arm_arch_svc_smc_handler
3433a1b0676SDimitris Papastamos );
344