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