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])21TEE_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