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