xref: /optee_os/lib/libutee/tee_api_panic.c (revision 9fc2442cc66c279cb962c90c4375746fc9b28bb9)
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