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