1 /* 2 * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <arm_arch_svc.h> 8 #include <debug.h> 9 #include <errata_report.h> 10 #include <runtime_svc.h> 11 #include <smccc.h> 12 #include <smccc_helpers.h> 13 #include <wa_cve_2017_5715.h> 14 15 static int32_t smccc_version(void) 16 { 17 return MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION); 18 } 19 20 static int32_t smccc_arch_features(u_register_t arg) 21 { 22 switch (arg) { 23 case SMCCC_VERSION: 24 case SMCCC_ARCH_FEATURES: 25 return SMC_OK; 26 #if WORKAROUND_CVE_2017_5715 27 case SMCCC_ARCH_WORKAROUND_1: 28 if (check_wa_cve_2017_5715() == ERRATA_NOT_APPLIES) 29 return 1; 30 return 0; /* ERRATA_APPLIES || ERRATA_MISSING */ 31 #endif 32 #if WORKAROUND_CVE_2018_3639 33 case SMCCC_ARCH_WORKAROUND_2: 34 return SMCCC_ARCH_NOT_REQUIRED; 35 #endif 36 default: 37 return SMC_UNK; 38 } 39 } 40 41 /* 42 * Top-level Arm Architectural Service SMC handler. 43 */ 44 static uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid, 45 u_register_t x1, 46 u_register_t x2, 47 u_register_t x3, 48 u_register_t x4, 49 void *cookie, 50 void *handle, 51 u_register_t flags) 52 { 53 switch (smc_fid) { 54 case SMCCC_VERSION: 55 SMC_RET1(handle, smccc_version()); 56 case SMCCC_ARCH_FEATURES: 57 SMC_RET1(handle, smccc_arch_features(x1)); 58 #if WORKAROUND_CVE_2017_5715 59 case SMCCC_ARCH_WORKAROUND_1: 60 /* 61 * The workaround has already been applied on affected PEs 62 * during entry to EL3. On unaffected PEs, this function 63 * has no effect. 64 */ 65 SMC_RET0(handle); 66 #endif 67 #if WORKAROUND_CVE_2018_3639 68 case SMCCC_ARCH_WORKAROUND_2: 69 /* 70 * The workaround has already been applied on affected PEs 71 * requiring dynamic mitigation during entry to EL3. 72 * On unaffected or statically mitigated PEs, this function 73 * has no effect. 74 */ 75 SMC_RET0(handle); 76 #endif 77 default: 78 WARN("Unimplemented Arm Architecture Service Call: 0x%x \n", 79 smc_fid); 80 SMC_RET1(handle, SMC_UNK); 81 } 82 } 83 84 /* Register Standard Service Calls as runtime service */ 85 DECLARE_RT_SVC( 86 arm_arch_svc, 87 OEN_ARM_START, 88 OEN_ARM_END, 89 SMC_TYPE_FAST, 90 NULL, 91 arm_arch_svc_smc_handler 92 ); 93