1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun */
4*4882a593Smuzhiyun #include <stdarg.h>
5*4882a593Smuzhiyun #include <stdlib.h>
6*4882a593Smuzhiyun #include <string.h>
7*4882a593Smuzhiyun #include <unistd.h>
8*4882a593Smuzhiyun #include "rkcrypto_trace.h"
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #ifdef ANDROID
11*4882a593Smuzhiyun #include <android/log.h>
12*4882a593Smuzhiyun #include <cutils/properties.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #define RKCRYPTO_TRACE_LEVEL_NAME "vendor.rkcrypto.trace.level"
15*4882a593Smuzhiyun #else
16*4882a593Smuzhiyun #define RKCRYPTO_TRACE_LEVEL_NAME "rkcrypto_trace_level"
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define RKCRYPTO_LOG_TAG "rkcrypto"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun static int trace_level = -1;
22*4882a593Smuzhiyun
rkcrypto_get_trace_level(void)23*4882a593Smuzhiyun static void rkcrypto_get_trace_level(void)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun char pick_value;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun if (trace_level >= TRACE_ERROR && trace_level <= TRACE_VERBOSE)
28*4882a593Smuzhiyun return;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #ifdef ANDROID
31*4882a593Smuzhiyun char property_value[PROPERTY_VALUE_MAX] = {0};
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun if (property_get(RKCRYPTO_TRACE_LEVEL_NAME, property_value, NULL) > 0)
34*4882a593Smuzhiyun pick_value = property_value[0];
35*4882a593Smuzhiyun #else
36*4882a593Smuzhiyun char *env_value = getenv(RKCRYPTO_TRACE_LEVEL_NAME);
37*4882a593Smuzhiyun if (env_value)
38*4882a593Smuzhiyun pick_value = env_value[0];
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun sscanf(&pick_value, "%d", &trace_level);
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun if (trace_level < TRACE_ERROR || trace_level > TRACE_VERBOSE)
43*4882a593Smuzhiyun trace_level = TRACE_INFO;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
rkcrypto_set_trace_level(enum RKCRYPTO_TRACE_LEVEL level)46*4882a593Smuzhiyun RK_RES rkcrypto_set_trace_level(enum RKCRYPTO_TRACE_LEVEL level)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun char ch[2];
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun if (level < TRACE_ERROR || level > TRACE_VERBOSE)
51*4882a593Smuzhiyun return RK_CRYPTO_ERR_PARAMETER;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun sprintf(ch, "%d", level);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #ifdef ANDROID
56*4882a593Smuzhiyun if (property_set(RKCRYPTO_TRACE_LEVEL_NAME, ch)) {
57*4882a593Smuzhiyun __android_log_print(ANDROID_LOG_ERROR, RKCRYPTO_LOG_TAG, "property_set error!");
58*4882a593Smuzhiyun return RK_CRYPTO_ERR_GENERIC;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun if (setenv(RKCRYPTO_TRACE_LEVEL_NAME, ch, 1)) {
62*4882a593Smuzhiyun printf("setenv error!");
63*4882a593Smuzhiyun return RK_CRYPTO_ERR_GENERIC;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun trace_level = -1;
67*4882a593Smuzhiyun return RK_CRYPTO_SUCCESS;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
trace_printf(int level,const char * function,int line,const char * fmt,...)70*4882a593Smuzhiyun void trace_printf(int level, const char *function, int line, const char *fmt, ...)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun rkcrypto_get_trace_level();
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun if (level > trace_level) {
75*4882a593Smuzhiyun return;
76*4882a593Smuzhiyun } else {
77*4882a593Smuzhiyun int i;
78*4882a593Smuzhiyun char buffer[512];
79*4882a593Smuzhiyun va_list args;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun va_start(args, fmt);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun #ifdef ANDROID
84*4882a593Smuzhiyun int android_prio = ANDROID_LOG_INFO;
85*4882a593Smuzhiyun char head[100];
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun switch (level) {
88*4882a593Smuzhiyun case TRACE_ERROR:
89*4882a593Smuzhiyun android_prio = ANDROID_LOG_ERROR;
90*4882a593Smuzhiyun break;
91*4882a593Smuzhiyun case TRACE_INFO:
92*4882a593Smuzhiyun android_prio = ANDROID_LOG_INFO;
93*4882a593Smuzhiyun break;
94*4882a593Smuzhiyun case TRACE_DEBUG:
95*4882a593Smuzhiyun android_prio = ANDROID_LOG_DEBUG;
96*4882a593Smuzhiyun break;
97*4882a593Smuzhiyun case TRACE_VERBOSE:
98*4882a593Smuzhiyun android_prio = ANDROID_LOG_VERBOSE;
99*4882a593Smuzhiyun break;
100*4882a593Smuzhiyun default:
101*4882a593Smuzhiyun break;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun sprintf(head, "%s: [%s, %d]", RKCRYPTO_LOG_TAG, function, line);
105*4882a593Smuzhiyun vsprintf(buffer, fmt, args);
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun if (buffer[0] != '\0') {
108*4882a593Smuzhiyun for (i = strlen(buffer) - 1; i >= 0; i--) {
109*4882a593Smuzhiyun if (buffer[i] != '\n')
110*4882a593Smuzhiyun break;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun buffer[i + 1] = '\0';
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun __android_log_print(android_prio, head, "%s", buffer);
117*4882a593Smuzhiyun #else
118*4882a593Smuzhiyun char linux_prio = 'I';
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun switch (level) {
121*4882a593Smuzhiyun case TRACE_ERROR:
122*4882a593Smuzhiyun linux_prio = 'E';
123*4882a593Smuzhiyun break;
124*4882a593Smuzhiyun case TRACE_INFO:
125*4882a593Smuzhiyun linux_prio = 'I';
126*4882a593Smuzhiyun break;
127*4882a593Smuzhiyun case TRACE_DEBUG:
128*4882a593Smuzhiyun linux_prio = 'D';
129*4882a593Smuzhiyun break;
130*4882a593Smuzhiyun case TRACE_VERBOSE:
131*4882a593Smuzhiyun linux_prio = 'V';
132*4882a593Smuzhiyun break;
133*4882a593Smuzhiyun default:
134*4882a593Smuzhiyun break;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun printf("%c %s: [%s, %d]: ", linux_prio, RKCRYPTO_LOG_TAG, function, line);
138*4882a593Smuzhiyun vsprintf(buffer, fmt, args);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun if (buffer[0] != '\0') {
141*4882a593Smuzhiyun for (i = strlen(buffer) - 1; i >= 0; i--) {
142*4882a593Smuzhiyun if (buffer[i] != '\n')
143*4882a593Smuzhiyun break;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun buffer[i + 1] = '\0';
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun printf("%s\n", buffer);
150*4882a593Smuzhiyun #endif
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun va_end(args);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun
hex_dump(int level,const char * function,int line,const char * buffer_name,const void * buffer,int len)156*4882a593Smuzhiyun void hex_dump(int level, const char *function, int line, const char *buffer_name,
157*4882a593Smuzhiyun const void *buffer, int len)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun trace_printf(level, function, line, "%s(%d): ", buffer_name, len);
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun if (level > trace_level) {
162*4882a593Smuzhiyun return;
163*4882a593Smuzhiyun } else {
164*4882a593Smuzhiyun int i, j, line_count;
165*4882a593Smuzhiyun char ch[4], tmp[64];
166*4882a593Smuzhiyun char *in = (char *)buffer;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun line_count = len / 16;
169*4882a593Smuzhiyun line_count = len % 16 ? line_count + 1 : line_count;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun for (i = 0; i < line_count; i++) {
172*4882a593Smuzhiyun memset(tmp, 0, sizeof(tmp));
173*4882a593Smuzhiyun for (j = 16 * i; j < 16 * (i + 1); j++) {
174*4882a593Smuzhiyun if (j < len)
175*4882a593Smuzhiyun sprintf(ch, "%02x ", in[j]);
176*4882a593Smuzhiyun else
177*4882a593Smuzhiyun sprintf(ch, "-- ");
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun strcat(tmp, ch);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun #ifdef ANDROID
183*4882a593Smuzhiyun __android_log_print(ANDROID_LOG_VERBOSE, RKCRYPTO_LOG_TAG, "%s", tmp);
184*4882a593Smuzhiyun if (i % 16 == 0 && i != 0)
185*4882a593Smuzhiyun __android_log_print(ANDROID_LOG_VERBOSE, RKCRYPTO_LOG_TAG, "\n");
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun #else
188*4882a593Smuzhiyun printf("V %s: %s\n", RKCRYPTO_LOG_TAG, tmp);
189*4882a593Smuzhiyun if (i % 16 == 0 && i != 0)
190*4882a593Smuzhiyun printf("V %s: \n", RKCRYPTO_LOG_TAG);
191*4882a593Smuzhiyun #endif
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun }
195