1 /*******************************************************************************
2 * Copyright (C) 2018 Cadence Design Systems, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to use this Software with Cadence processor cores only and
7 * not with any other processors and platforms, subject to
8 * the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included
11 * in all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 ******************************************************************************/
22 
23 #include "xf.h"
24 #include <sys/time.h>
25 
26 #if XF_TRACE
27 /*******************************************************************************
28  * Local data definitions
29  ******************************************************************************/
30 
31 /* ...tracing lock */
32 static pthread_mutex_t  xf_trace_mutex;
33 
34 /*******************************************************************************
35  * Tracing facility
36  ******************************************************************************/
37 
38 /* ...timestamp function */
xf_timenow(void)39 static u32 xf_timenow(void)
40 {
41     struct timeval          tv;
42 
43     /* ...get current time value */
44     gettimeofday(&tv, NULL);
45 
46     /* ...wrap over every 100 seconds */
47     return (u32)((tv.tv_sec % 100) * 1000000 + tv.tv_usec);
48 }
49 
50 /* ...tracing initialization */
xf_trace_init(const char * banner)51 void xf_trace_init(const char *banner)
52 {
53     /* ...initialize tracing lock */
54     pthread_mutex_init(&xf_trace_mutex, NULL);
55 
56     /* ...output banner */
57     xf_trace(banner);
58 }
59 
60 /* ...tracing primitive */
xf_trace(const char * format,...)61 int xf_trace(const char *format, ...)
62 {
63     va_list     args;
64     static char buf[256];
65     char       *b = buf;
66 
67     /* ...get global tracing lock */
68     pthread_mutex_lock(&xf_trace_mutex);
69 
70     /* ...output timestamp */
71     b += sprintf(b, "[%08u] ", xf_timenow());
72 
73     /* ...output format string */
74     va_start(args, format);
75     b += vsprintf(b, format, args);
76     va_end(args);
77 
78     /* ...put terminator */
79     *b = '\0';
80 
81     /* ...output prepared string */
82     __xf_puts(buf);
83 
84     /* ...release tracing lock */
85     pthread_mutex_unlock(&xf_trace_mutex);
86 
87     return 0;
88 }
89 
90 #endif  /* XF_TRACE */
91