xref: /rk3399_ARM-atf/services/arm_arch_svc/arm_arch_svc_setup.c (revision 085e80ec111b2ab3607f0f38f6ef0062922bc196)
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 <workaround_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 	int ret;
23 
24 	switch (arg) {
25 	case SMCCC_VERSION:
26 	case SMCCC_ARCH_FEATURES:
27 		return SMC_OK;
28 	case SMCCC_ARCH_WORKAROUND_1:
29 		ret = check_workaround_cve_2017_5715();
30 		if (ret == ERRATA_APPLIES)
31 			return 0;
32 		else if (ret == ERRATA_NOT_APPLIES)
33 			return 1;
34 		return -1; /* ERRATA_MISSING */
35 	default:
36 		return SMC_UNK;
37 	}
38 }
39 
40 /*
41  * Top-level Arm Architectural Service SMC handler.
42  */
43 static uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid,
44 	u_register_t x1,
45 	u_register_t x2,
46 	u_register_t x3,
47 	u_register_t x4,
48 	void *cookie,
49 	void *handle,
50 	u_register_t flags)
51 {
52 	switch (smc_fid) {
53 	case SMCCC_VERSION:
54 		SMC_RET1(handle, smccc_version());
55 	case SMCCC_ARCH_FEATURES:
56 		SMC_RET1(handle, smccc_arch_features(x1));
57 #if WORKAROUND_CVE_2017_5715
58 	case SMCCC_ARCH_WORKAROUND_1:
59 		/*
60 		 * The workaround has already been applied on affected PEs
61 		 * during entry to EL3.  On unaffected PEs, this function
62 		 * has no effect.
63 		 */
64 		SMC_RET0(handle);
65 #endif
66 	default:
67 		WARN("Unimplemented Arm Architecture Service Call: 0x%x \n",
68 			smc_fid);
69 		SMC_RET1(handle, SMC_UNK);
70 	}
71 }
72 
73 /* Register Standard Service Calls as runtime service */
74 DECLARE_RT_SVC(
75 		arm_arch_svc,
76 		OEN_ARM_START,
77 		OEN_ARM_END,
78 		SMC_TYPE_FAST,
79 		NULL,
80 		arm_arch_svc_smc_handler
81 );
82