1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2014, STMicroelectronics International N.V. 4 * Copyright (c) 2020, Arm Limited 5 */ 6 7 #include <stdio.h> 8 #include <stdarg.h> 9 #include <string.h> 10 #include <string_ext.h> 11 #include <trace.h> 12 #include <util.h> 13 #include <utee_syscalls.h> 14 15 #ifdef __LDELF__ 16 #include <ldelf_syscalls.h> 17 #endif 18 19 #if TRACE_LEVEL > 0 20 21 void trace_ext_puts(const char *str) 22 { 23 #ifdef __LDELF__ 24 _ldelf_log(str, strlen(str)); 25 #else 26 _utee_log(str, strlen(str)); 27 #endif 28 } 29 30 int trace_ext_get_thread_id(void) 31 { 32 return -1; 33 } 34 35 /* 36 * printf and puts - stdio printf support 37 * 38 * 'printf()' and 'puts()' traces have the 'info' trace level. 39 */ 40 int printf(const char *fmt, ...) 41 { 42 char to_format[MAX_PRINT_SIZE]; 43 va_list ap; 44 int s; 45 46 if (trace_get_level() < TRACE_PRINTF_LEVEL) 47 return 0; 48 49 va_start(ap, fmt); 50 s = vsnprintf(to_format, sizeof(to_format), fmt, ap); 51 va_end(ap); 52 53 if (s < 0) 54 return s; 55 56 trace_ext_puts(to_format); 57 58 return s; 59 } 60 61 int puts(const char *str) 62 { 63 if (trace_get_level() >= TRACE_PRINTF_LEVEL) { 64 trace_ext_puts(str); 65 trace_ext_puts("\n"); 66 } 67 return 1; 68 } 69 70 int putchar(int c) 71 { 72 char str[2] = { (char)c, '\0' }; 73 74 if (trace_get_level() >= TRACE_PRINTF_LEVEL) 75 trace_ext_puts(str); 76 /* 77 * From the putchar() man page: 78 * "fputc(), putc() and putchar() return the character written as an 79 * unsigned char cast to an int or EOF on error." 80 */ 81 return (int)(unsigned char)c; 82 } 83 84 #else 85 86 void trace_ext_puts(const char *str __unused) 87 { 88 } 89 90 int printf(const char *fmt __unused, ...) 91 { 92 return 0; 93 } 94 95 int puts(const char *str __unused) 96 { 97 return 0; 98 } 99 100 int putchar(int c) 101 { 102 return (int)(unsigned char)c; 103 } 104 105 #endif 106