1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2014, STMicroelectronics International N.V. 4 * Copyright (c) 2020, Linaro Limited 5 */ 6 7 #include <config.h> 8 #include <string.h> 9 #include <tee_api.h> 10 #include <utee_syscalls.h> 11 #include <util.h> 12 13 #include "tee_api_private.h" 14 15 #define ACCESS_RW (TEE_MEMORY_ACCESS_READ | TEE_MEMORY_ACCESS_WRITE) 16 #define ACCESS_W_ANY (TEE_MEMORY_ACCESS_WRITE | TEE_MEMORY_ACCESS_ANY_OWNER) 17 #define ACCESS_R TEE_MEMORY_ACCESS_READ 18 #define ACCESS_W TEE_MEMORY_ACCESS_WRITE 19 20 /* System API - Misc */ 21 22 void TEE_Panic(TEE_Result panicCode) 23 { 24 _utee_panic(panicCode); 25 } 26 27 static void check_res(const char *msg __maybe_unused, TEE_Result res) 28 { 29 if (res) { 30 DMSG("%s: error %#"PRIx32, msg, res); 31 TEE_Panic(0); 32 } 33 } 34 35 static TEE_Result check_access(uint32_t flags, void *buf, size_t len) 36 { 37 if (!len) 38 return TEE_SUCCESS; 39 40 if (!buf) 41 return TEE_ERROR_SECURITY; 42 43 if (IS_ENABLED(CFG_TA_STRICT_ANNOTATION_CHECKS)) 44 return TEE_CheckMemoryAccessRights(flags, buf, len); 45 46 return TEE_SUCCESS; 47 } 48 49 void __utee_check_outbuf_annotation(void *buf, uint32_t *len) 50 { 51 check_res("[outbuf] len", 52 check_access(ACCESS_RW, len, sizeof(*len))); 53 check_res("[outbuf] buf", 54 check_access(ACCESS_W_ANY, buf, *len)); 55 } 56 57 void __utee_check_instring_annotation(const char *buf) 58 { 59 check_res("[instring]", 60 check_access(ACCESS_R, (char *)buf, strlen(buf) + 1)); 61 } 62 63 void __utee_check_outstring_annotation(char *buf, uint32_t *len) 64 { 65 check_res("[outstring] len", 66 check_access(ACCESS_RW, len, sizeof(*len))); 67 check_res("[outstring] buf", 68 check_access(ACCESS_W_ANY, buf, *len)); 69 } 70 71 void __utee_check_out_annotation(void *buf, const size_t len) 72 { 73 check_res("[out]", 74 check_access(ACCESS_W, buf, len)); 75 } 76 77 void __utee_check_attr_in_annotation(const TEE_Attribute *attr, size_t count) 78 { 79 check_res("[in] attr", 80 check_access(ACCESS_R, (void *)attr, sizeof(*attr) * count)); 81 } 82 83 void __utee_check_inout_annotation(void *buf, const size_t len) 84 { 85 check_res("[inout]", 86 check_access(ACCESS_RW, buf, len)); 87 } 88