blob: 37bfc62e2bb3b5276eebd72aa17f69950cc902a6 [file] [log] [blame]
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +00001/*
Manish V Badarkhef809c6e2020-02-22 08:43:00 +00002 * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00007#include <common/debug.h>
8#include <common/runtime_svc.h>
9#include <lib/cpus/errata_report.h>
10#include <lib/cpus/wa_cve_2017_5715.h>
11#include <lib/cpus/wa_cve_2018_3639.h>
12#include <lib/smccc.h>
13#include <services/arm_arch_svc.h>
Antonio Nino Diaz3c817f42018-03-21 10:49:27 +000014#include <smccc_helpers.h>
Manish V Badarkhef809c6e2020-02-22 08:43:00 +000015#include <plat/common/platform.h>
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000016
17static int32_t smccc_version(void)
18{
19 return MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION);
20}
21
Manish V Badarkhe709bc372020-04-28 13:25:56 +010022static int32_t smccc_arch_features(u_register_t arg1)
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000023{
Manish V Badarkhef809c6e2020-02-22 08:43:00 +000024 switch (arg1) {
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000025 case SMCCC_VERSION:
26 case SMCCC_ARCH_FEATURES:
Manish V Badarkhe80f13ee2020-07-23 20:23:01 +010027 return SMC_ARCH_CALL_SUCCESS;
Manish V Badarkhef809c6e2020-02-22 08:43:00 +000028 case SMCCC_ARCH_SOC_ID:
Manish V Badarkhe80f13ee2020-07-23 20:23:01 +010029 return plat_is_smccc_feature_available(arg1);
Dimitris Papastamos6d1f4992018-03-28 12:06:40 +010030#if WORKAROUND_CVE_2017_5715
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000031 case SMCCC_ARCH_WORKAROUND_1:
Dimitris Papastamos570c06a2018-04-06 15:29:34 +010032 if (check_wa_cve_2017_5715() == ERRATA_NOT_APPLIES)
Dimitris Papastamos914757c2018-03-12 14:47:09 +000033 return 1;
Dimitris Papastamos6d1f4992018-03-28 12:06:40 +010034 return 0; /* ERRATA_APPLIES || ERRATA_MISSING */
35#endif
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000036
Dimitris Papastamose6625ec2018-04-05 14:38:26 +010037#if WORKAROUND_CVE_2018_3639
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000038 case SMCCC_ARCH_WORKAROUND_2: {
Dimitris Papastamosba51d9e2018-05-16 11:36:14 +010039#if DYNAMIC_WORKAROUND_CVE_2018_3639
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000040 unsigned long long ssbs;
41
42 /*
43 * Firmware doesn't have to carry out dynamic workaround if the
44 * PE implements architectural Speculation Store Bypass Safe
45 * (SSBS) feature.
46 */
Dimitris Papastamosb091eb92019-02-27 11:46:48 +000047 ssbs = (read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SSBS_SHIFT) &
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000048 ID_AA64PFR1_EL1_SSBS_MASK;
49
50 /*
51 * If architectural SSBS is available on this PE, no firmware
52 * mitigation via SMCCC_ARCH_WORKAROUND_2 is required.
53 */
54 if (ssbs != SSBS_UNAVAILABLE)
55 return 1;
56
Dimitris Papastamosba51d9e2018-05-16 11:36:14 +010057 /*
58 * On a platform where at least one CPU requires
59 * dynamic mitigation but others are either unaffected
60 * or permanently mitigated, report the latter as not
61 * needing dynamic mitigation.
62 */
63 if (wa_cve_2018_3639_get_disable_ptr() == NULL)
64 return 1;
65 /*
66 * If we get here, this CPU requires dynamic mitigation
67 * so report it as such.
68 */
69 return 0;
70#else
71 /* Either the CPUs are unaffected or permanently mitigated */
Manish V Badarkhe13335172020-02-19 13:36:50 +000072 return SMC_ARCH_CALL_NOT_REQUIRED;
Dimitris Papastamose6625ec2018-04-05 14:38:26 +010073#endif
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000074 }
Dimitris Papastamosba51d9e2018-05-16 11:36:14 +010075#endif
Jeenu Viswambharanaa00aff2018-11-15 11:38:03 +000076
77 /* Fallthrough */
78
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000079 default:
80 return SMC_UNK;
81 }
Manish V Badarkhe709bc372020-04-28 13:25:56 +010082}
83
84/* return soc revision or soc version on success otherwise
85 * return invalid parameter */
86static int32_t smccc_arch_id(u_register_t arg1)
87{
88 if (arg1 == SMCCC_GET_SOC_REVISION) {
89 return plat_get_soc_revision();
90 }
91 if (arg1 == SMCCC_GET_SOC_VERSION) {
92 return plat_get_soc_version();
93 }
94 return SMC_ARCH_CALL_INVAL_PARAM;
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +000095}
96
97/*
98 * Top-level Arm Architectural Service SMC handler.
99 */
Roberto Vargas05712702018-02-12 12:36:17 +0000100static uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid,
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +0000101 u_register_t x1,
102 u_register_t x2,
103 u_register_t x3,
104 u_register_t x4,
105 void *cookie,
106 void *handle,
107 u_register_t flags)
108{
109 switch (smc_fid) {
110 case SMCCC_VERSION:
111 SMC_RET1(handle, smccc_version());
112 case SMCCC_ARCH_FEATURES:
Manish V Badarkhe709bc372020-04-28 13:25:56 +0100113 SMC_RET1(handle, smccc_arch_features(x1));
114 case SMCCC_ARCH_SOC_ID:
115 SMC_RET1(handle, smccc_arch_id(x1));
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +0000116#if WORKAROUND_CVE_2017_5715
117 case SMCCC_ARCH_WORKAROUND_1:
118 /*
119 * The workaround has already been applied on affected PEs
120 * during entry to EL3. On unaffected PEs, this function
121 * has no effect.
122 */
123 SMC_RET0(handle);
124#endif
Dimitris Papastamose6625ec2018-04-05 14:38:26 +0100125#if WORKAROUND_CVE_2018_3639
126 case SMCCC_ARCH_WORKAROUND_2:
127 /*
128 * The workaround has already been applied on affected PEs
129 * requiring dynamic mitigation during entry to EL3.
130 * On unaffected or statically mitigated PEs, this function
131 * has no effect.
132 */
133 SMC_RET0(handle);
134#endif
Dimitris Papastamos0dcdb1a2018-01-19 16:58:29 +0000135 default:
136 WARN("Unimplemented Arm Architecture Service Call: 0x%x \n",
137 smc_fid);
138 SMC_RET1(handle, SMC_UNK);
139 }
140}
141
142/* Register Standard Service Calls as runtime service */
143DECLARE_RT_SVC(
144 arm_arch_svc,
145 OEN_ARM_START,
146 OEN_ARM_END,
147 SMC_TYPE_FAST,
148 NULL,
149 arm_arch_svc_smc_handler
150);