xref: /optee_os/lib/libutee/tee_api_panic.c (revision 6551d565c2f5a7c61c48ffff2148a4b3dac218a5)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
294e8a4fcSJens Wiklander /*
394e8a4fcSJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
46915bbbbSJens Wiklander  * Copyright (c) 2020, Linaro Limited
594e8a4fcSJens Wiklander  */
66915bbbbSJens Wiklander 
76915bbbbSJens Wiklander #include <config.h>
86915bbbbSJens Wiklander #include <string.h>
994e8a4fcSJens Wiklander #include <tee_api.h>
1094e8a4fcSJens Wiklander #include <utee_syscalls.h>
116915bbbbSJens Wiklander #include <util.h>
126915bbbbSJens Wiklander 
136915bbbbSJens Wiklander #include "tee_api_private.h"
146915bbbbSJens Wiklander 
156915bbbbSJens Wiklander #define ACCESS_RW	(TEE_MEMORY_ACCESS_READ | TEE_MEMORY_ACCESS_WRITE)
166915bbbbSJens Wiklander #define ACCESS_W_ANY	(TEE_MEMORY_ACCESS_WRITE | TEE_MEMORY_ACCESS_ANY_OWNER)
176915bbbbSJens Wiklander #define ACCESS_R	TEE_MEMORY_ACCESS_READ
186915bbbbSJens Wiklander #define ACCESS_W	TEE_MEMORY_ACCESS_WRITE
1994e8a4fcSJens Wiklander 
2094e8a4fcSJens Wiklander /* System API - Misc */
2194e8a4fcSJens Wiklander 
TEE_Panic(TEE_Result panicCode)220e1c6e8eSJerome Forissier void TEE_Panic(TEE_Result panicCode)
2394e8a4fcSJens Wiklander {
242c028fdeSJerome Forissier 	_utee_panic(panicCode);
25b68bcfebSJens Wiklander #ifdef __COVERITY__
26b68bcfebSJens Wiklander 	__coverity_panic__();
27b68bcfebSJens Wiklander #endif
2894e8a4fcSJens Wiklander }
296915bbbbSJens Wiklander 
check_res(const char * msg __maybe_unused,TEE_Result res)306915bbbbSJens Wiklander static void check_res(const char *msg __maybe_unused, TEE_Result res)
316915bbbbSJens Wiklander {
326915bbbbSJens Wiklander 	if (res) {
336915bbbbSJens Wiklander 		DMSG("%s: error %#"PRIx32, msg, res);
346915bbbbSJens Wiklander 		TEE_Panic(0);
356915bbbbSJens Wiklander 	}
366915bbbbSJens Wiklander }
376915bbbbSJens Wiklander 
check_access(uint32_t flags,void * buf,size_t len)386915bbbbSJens Wiklander static TEE_Result check_access(uint32_t flags, void *buf, size_t len)
396915bbbbSJens Wiklander {
406915bbbbSJens Wiklander 	if (!len)
416915bbbbSJens Wiklander 		return TEE_SUCCESS;
426915bbbbSJens Wiklander 
436915bbbbSJens Wiklander 	if (!buf)
446915bbbbSJens Wiklander 		return TEE_ERROR_SECURITY;
456915bbbbSJens Wiklander 
466915bbbbSJens Wiklander 	if (IS_ENABLED(CFG_TA_STRICT_ANNOTATION_CHECKS))
476915bbbbSJens Wiklander 		return TEE_CheckMemoryAccessRights(flags, buf, len);
486915bbbbSJens Wiklander 
496915bbbbSJens Wiklander 	return TEE_SUCCESS;
506915bbbbSJens Wiklander }
516915bbbbSJens Wiklander 
__utee_check_outbuf_annotation(void * buf,size_t * len)52*6551d565SJens Wiklander void __utee_check_outbuf_annotation(void *buf, size_t *len)
53*6551d565SJens Wiklander {
54*6551d565SJens Wiklander 	check_res("[outbuf] len",
55*6551d565SJens Wiklander 		  check_access(ACCESS_RW, len, sizeof(*len)));
56*6551d565SJens Wiklander 	check_res("[outbuf] buf",
57*6551d565SJens Wiklander 		  check_access(ACCESS_W_ANY, buf, *len));
58*6551d565SJens Wiklander }
59*6551d565SJens Wiklander 
__utee_check_gp11_outbuf_annotation(void * buf,uint32_t * len)60*6551d565SJens Wiklander void __utee_check_gp11_outbuf_annotation(void *buf, uint32_t *len)
616915bbbbSJens Wiklander {
626915bbbbSJens Wiklander 	check_res("[outbuf] len",
636915bbbbSJens Wiklander 		  check_access(ACCESS_RW, len, sizeof(*len)));
646915bbbbSJens Wiklander 	check_res("[outbuf] buf",
656915bbbbSJens Wiklander 		  check_access(ACCESS_W_ANY, buf, *len));
666915bbbbSJens Wiklander }
676915bbbbSJens Wiklander 
__utee_check_instring_annotation(const char * buf)686915bbbbSJens Wiklander void __utee_check_instring_annotation(const char *buf)
696915bbbbSJens Wiklander {
706915bbbbSJens Wiklander 	check_res("[instring]",
716915bbbbSJens Wiklander 		  check_access(ACCESS_R, (char *)buf, strlen(buf) + 1));
726915bbbbSJens Wiklander }
736915bbbbSJens Wiklander 
__utee_check_outstring_annotation(char * buf,size_t * len)74*6551d565SJens Wiklander void __utee_check_outstring_annotation(char *buf, size_t *len)
75*6551d565SJens Wiklander {
76*6551d565SJens Wiklander 	check_res("[outstring] len",
77*6551d565SJens Wiklander 		  check_access(ACCESS_RW, len, sizeof(*len)));
78*6551d565SJens Wiklander 	check_res("[outstring] buf",
79*6551d565SJens Wiklander 		  check_access(ACCESS_W_ANY, buf, *len));
80*6551d565SJens Wiklander }
81*6551d565SJens Wiklander 
__utee_check_gp11_outstring_annotation(char * buf,uint32_t * len)82*6551d565SJens Wiklander void __utee_check_gp11_outstring_annotation(char *buf, uint32_t *len)
836915bbbbSJens Wiklander {
846915bbbbSJens Wiklander 	check_res("[outstring] len",
856915bbbbSJens Wiklander 		  check_access(ACCESS_RW, len, sizeof(*len)));
866915bbbbSJens Wiklander 	check_res("[outstring] buf",
876915bbbbSJens Wiklander 		  check_access(ACCESS_W_ANY, buf, *len));
886915bbbbSJens Wiklander }
896915bbbbSJens Wiklander 
__utee_check_out_annotation(void * buf,const size_t len)906915bbbbSJens Wiklander void __utee_check_out_annotation(void *buf, const size_t len)
916915bbbbSJens Wiklander {
926915bbbbSJens Wiklander 	check_res("[out]",
936915bbbbSJens Wiklander 		  check_access(ACCESS_W, buf, len));
946915bbbbSJens Wiklander }
956915bbbbSJens Wiklander 
__utee_check_attr_in_annotation(const TEE_Attribute * attr,size_t count)966915bbbbSJens Wiklander void __utee_check_attr_in_annotation(const TEE_Attribute *attr, size_t count)
976915bbbbSJens Wiklander {
986915bbbbSJens Wiklander 	check_res("[in] attr",
996915bbbbSJens Wiklander 		  check_access(ACCESS_R, (void *)attr, sizeof(*attr) * count));
1006915bbbbSJens Wiklander }
1016915bbbbSJens Wiklander 
__utee_check_gp11_attr_in_annotation(const __GP11_TEE_Attribute * attr,size_t count)1024f4374c8SJens Wiklander void __utee_check_gp11_attr_in_annotation(const __GP11_TEE_Attribute *attr,
1034f4374c8SJens Wiklander 					  size_t count)
1044f4374c8SJens Wiklander 
1054f4374c8SJens Wiklander {
1064f4374c8SJens Wiklander 	check_res("[in] attr",
1074f4374c8SJens Wiklander 		  check_access(ACCESS_R, (void *)attr, sizeof(*attr) * count));
1084f4374c8SJens Wiklander }
1094f4374c8SJens Wiklander 
__utee_check_inout_annotation(void * buf,const size_t len)1106915bbbbSJens Wiklander void __utee_check_inout_annotation(void *buf, const size_t len)
1116915bbbbSJens Wiklander {
1126915bbbbSJens Wiklander 	check_res("[inout]",
1136915bbbbSJens Wiklander 		  check_access(ACCESS_RW, buf, len));
1146915bbbbSJens Wiklander }
115