xref: /optee_os/lib/libutee/trace_ext.c (revision 1bb929836182ecb96d2d9d268daa807c67596396)
1*1bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
24de4bebcSJens Wiklander /*
34de4bebcSJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
44de4bebcSJens Wiklander  * All rights reserved.
54de4bebcSJens Wiklander  *
64de4bebcSJens Wiklander  * Redistribution and use in source and binary forms, with or without
74de4bebcSJens Wiklander  * modification, are permitted provided that the following conditions are met:
84de4bebcSJens Wiklander  *
94de4bebcSJens Wiklander  * 1. Redistributions of source code must retain the above copyright notice,
104de4bebcSJens Wiklander  * this list of conditions and the following disclaimer.
114de4bebcSJens Wiklander  *
124de4bebcSJens Wiklander  * 2. Redistributions in binary form must reproduce the above copyright notice,
134de4bebcSJens Wiklander  * this list of conditions and the following disclaimer in the documentation
144de4bebcSJens Wiklander  * and/or other materials provided with the distribution.
154de4bebcSJens Wiklander  *
164de4bebcSJens Wiklander  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
174de4bebcSJens Wiklander  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
184de4bebcSJens Wiklander  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
194de4bebcSJens Wiklander  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
204de4bebcSJens Wiklander  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214de4bebcSJens Wiklander  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224de4bebcSJens Wiklander  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
234de4bebcSJens Wiklander  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
244de4bebcSJens Wiklander  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
254de4bebcSJens Wiklander  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
264de4bebcSJens Wiklander  * POSSIBILITY OF SUCH DAMAGE.
274de4bebcSJens Wiklander  */
284de4bebcSJens Wiklander 
294de4bebcSJens Wiklander #include <stdio.h>
304de4bebcSJens Wiklander #include <stdarg.h>
314de4bebcSJens Wiklander #include <string.h>
324de4bebcSJens Wiklander #include <string_ext.h>
334de4bebcSJens Wiklander #include <trace.h>
344de4bebcSJens Wiklander #include <util.h>
354de4bebcSJens Wiklander #include <utee_syscalls.h>
364de4bebcSJens Wiklander 
378a1e7b89SJerome Forissier #if TRACE_LEVEL > 0
384de4bebcSJens Wiklander 
39bfc6487bSJerome Forissier void trace_ext_puts(const char *str)
404de4bebcSJens Wiklander {
414de4bebcSJens Wiklander 	utee_log(str, strlen(str));
424de4bebcSJens Wiklander }
434de4bebcSJens Wiklander 
444de4bebcSJens Wiklander int trace_ext_get_thread_id(void)
454de4bebcSJens Wiklander {
464de4bebcSJens Wiklander 	return -1;
474de4bebcSJens Wiklander }
484de4bebcSJens Wiklander 
494de4bebcSJens Wiklander /*
504de4bebcSJens Wiklander  * printf and puts - stdio printf support
514de4bebcSJens Wiklander  *
524de4bebcSJens Wiklander  * 'printf()' and 'puts()' traces have the 'info' trace level.
534de4bebcSJens Wiklander  */
544de4bebcSJens Wiklander int printf(const char *fmt, ...)
554de4bebcSJens Wiklander {
564de4bebcSJens Wiklander 	char to_format[MAX_PRINT_SIZE];
574de4bebcSJens Wiklander 	va_list ap;
584de4bebcSJens Wiklander 	int s;
594de4bebcSJens Wiklander 
6044202a48SPascal Brand 	if (trace_get_level() < TRACE_PRINTF_LEVEL)
614de4bebcSJens Wiklander 		return 0;
624de4bebcSJens Wiklander 
634de4bebcSJens Wiklander 	va_start(ap, fmt);
64b0c596acSJerome Forissier 	s = vsnprintf(to_format, sizeof(to_format), fmt, ap);
654de4bebcSJens Wiklander 	va_end(ap);
664de4bebcSJens Wiklander 
67b0c596acSJerome Forissier 	if (s < 0)
684de4bebcSJens Wiklander 		return s;
694de4bebcSJens Wiklander 
70ba21727aSJerome Forissier 	trace_ext_puts(to_format);
714de4bebcSJens Wiklander 
724de4bebcSJens Wiklander 	return s;
734de4bebcSJens Wiklander }
744de4bebcSJens Wiklander 
754de4bebcSJens Wiklander int puts(const char *str)
764de4bebcSJens Wiklander {
776246cc9dSJerome Forissier 	if (trace_get_level() >= TRACE_PRINTF_LEVEL) {
78bfc6487bSJerome Forissier 		trace_ext_puts(str);
796246cc9dSJerome Forissier 		trace_ext_puts("\n");
806246cc9dSJerome Forissier 	}
814de4bebcSJens Wiklander 	return 1;
824de4bebcSJens Wiklander }
834de4bebcSJens Wiklander 
84dc454609SJerome Forissier int putchar(int c)
85dc454609SJerome Forissier {
86dc454609SJerome Forissier 	char str[2] = { (char)c, '\0' };
87dc454609SJerome Forissier 
88dc454609SJerome Forissier 	if (trace_get_level() >= TRACE_PRINTF_LEVEL)
89dc454609SJerome Forissier 		trace_ext_puts(str);
90dc454609SJerome Forissier 	/*
91dc454609SJerome Forissier 	 * From the putchar() man page:
92dc454609SJerome Forissier 	 * "fputc(), putc() and putchar() return the character written as an
93dc454609SJerome Forissier 	 * unsigned char cast to an int or EOF on error."
94dc454609SJerome Forissier 	 */
95dc454609SJerome Forissier 	return (int)(unsigned char)c;
96dc454609SJerome Forissier }
97dc454609SJerome Forissier 
984de4bebcSJens Wiklander #else
994de4bebcSJens Wiklander 
1004de4bebcSJens Wiklander int printf(const char *fmt __unused, ...)
1014de4bebcSJens Wiklander {
1024de4bebcSJens Wiklander 	return 0;
1034de4bebcSJens Wiklander }
1044de4bebcSJens Wiklander 
1054de4bebcSJens Wiklander int puts(const char *str __unused)
1064de4bebcSJens Wiklander {
1074de4bebcSJens Wiklander 	return 0;
1084de4bebcSJens Wiklander }
1094de4bebcSJens Wiklander 
110dc454609SJerome Forissier int putchar(int c)
111dc454609SJerome Forissier {
112dc454609SJerome Forissier 	return (int)(unsigned char)c;
113dc454609SJerome Forissier }
114dc454609SJerome Forissier 
1154de4bebcSJens Wiklander #endif
116