1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2021, Linaro Limited
4  * All rights reserved.
5  */
6 
7 #include <inttypes.h>
8 #include <string.h>
9 #include <ta_arm_bti.h>
10 #include <ta_arm_bti_priv.h>
11 #include <tee_internal_api.h>
12 
13 void call_using_blr(void (*)(void));
14 void call_using_br(void (*)(void));
15 void call_using_br_x16(void (*)(void));
16 void bti_j(void);
17 void bti_c(void);
18 void bti_jc(void);
19 void bti_none(void);
20 
test_bti(uint32_t nCommandID,uint32_t nParamTypes,TEE_Param pParams[4])21 TEE_Result test_bti(uint32_t nCommandID, uint32_t nParamTypes, TEE_Param pParams[4])
22 {
23 	void (*func)(void) = NULL;
24 
25 	if (nParamTypes != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 0, 0, 0))
26 		return TEE_ERROR_GENERIC;
27 
28 	switch (pParams[0].value.a) {
29 	case TA_FUNC_BTI_C:
30 		func = bti_c;
31 		break;
32 	case TA_FUNC_BTI_J:
33 		func = bti_j;
34 		break;
35 	case TA_FUNC_BTI_JC:
36 		func = bti_jc;
37 		break;
38 	case TA_FUNC_BTI_NONE:
39 		func = bti_none;
40 		break;
41 	default:
42 		break;
43 	}
44 
45 	switch (nCommandID) {
46 	case TA_TEST_USING_BLR :
47 		call_using_blr(func);
48 		break;
49 	case TA_TEST_USING_BR :
50 		call_using_br(func);
51 		break;
52 	case TA_TEST_USING_BR_X16 :
53 		call_using_br_x16(func);
54 		break;
55 	default:
56 		return TEE_ERROR_BAD_PARAMETERS;
57 	}
58 
59 	return TEE_SUCCESS;
60 }
61