xref: /aosp_15_r20/external/mbedtls/library/mps_trace.h (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  Copyright The Mbed TLS Contributors
3*62c56f98SSadaf Ebrahimi  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
4*62c56f98SSadaf Ebrahimi  */
5*62c56f98SSadaf Ebrahimi 
6*62c56f98SSadaf Ebrahimi /**
7*62c56f98SSadaf Ebrahimi  * \file mps_trace.h
8*62c56f98SSadaf Ebrahimi  *
9*62c56f98SSadaf Ebrahimi  * \brief Tracing module for MPS
10*62c56f98SSadaf Ebrahimi  */
11*62c56f98SSadaf Ebrahimi 
12*62c56f98SSadaf Ebrahimi #ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
13*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
14*62c56f98SSadaf Ebrahimi 
15*62c56f98SSadaf Ebrahimi #include "common.h"
16*62c56f98SSadaf Ebrahimi #include "mps_common.h"
17*62c56f98SSadaf Ebrahimi #include "mps_trace.h"
18*62c56f98SSadaf Ebrahimi 
19*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
20*62c56f98SSadaf Ebrahimi 
21*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_ENABLE_TRACE)
22*62c56f98SSadaf Ebrahimi 
23*62c56f98SSadaf Ebrahimi /*
24*62c56f98SSadaf Ebrahimi  * Adapt this to enable/disable tracing output
25*62c56f98SSadaf Ebrahimi  * from the various layers of the MPS.
26*62c56f98SSadaf Ebrahimi  */
27*62c56f98SSadaf Ebrahimi 
28*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1
29*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2
30*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3
31*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4
32*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_READER
33*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_WRITER
34*62c56f98SSadaf Ebrahimi 
35*62c56f98SSadaf Ebrahimi /*
36*62c56f98SSadaf Ebrahimi  * To use the existing trace module, only change
37*62c56f98SSadaf Ebrahimi  * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the
38*62c56f98SSadaf Ebrahimi  * rest of this file.
39*62c56f98SSadaf Ebrahimi  */
40*62c56f98SSadaf Ebrahimi 
41*62c56f98SSadaf Ebrahimi typedef enum {
42*62c56f98SSadaf Ebrahimi     MBEDTLS_MPS_TRACE_TYPE_COMMENT,
43*62c56f98SSadaf Ebrahimi     MBEDTLS_MPS_TRACE_TYPE_CALL,
44*62c56f98SSadaf Ebrahimi     MBEDTLS_MPS_TRACE_TYPE_ERROR,
45*62c56f98SSadaf Ebrahimi     MBEDTLS_MPS_TRACE_TYPE_RETURN
46*62c56f98SSadaf Ebrahimi } mbedtls_mps_trace_type;
47*62c56f98SSadaf Ebrahimi 
48*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
49*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
50*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
51*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
52*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_WRITER  5
53*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_READER  6
54*62c56f98SSadaf Ebrahimi 
55*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
56*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1)
57*62c56f98SSadaf Ebrahimi #else
58*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
59*62c56f98SSadaf Ebrahimi #endif
60*62c56f98SSadaf Ebrahimi 
61*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
62*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2)
63*62c56f98SSadaf Ebrahimi #else
64*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0
65*62c56f98SSadaf Ebrahimi #endif
66*62c56f98SSadaf Ebrahimi 
67*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3)
68*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3)
69*62c56f98SSadaf Ebrahimi #else
70*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0
71*62c56f98SSadaf Ebrahimi #endif
72*62c56f98SSadaf Ebrahimi 
73*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4)
74*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4)
75*62c56f98SSadaf Ebrahimi #else
76*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0
77*62c56f98SSadaf Ebrahimi #endif
78*62c56f98SSadaf Ebrahimi 
79*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_READER)
80*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER)
81*62c56f98SSadaf Ebrahimi #else
82*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_READER 0
83*62c56f98SSadaf Ebrahimi #endif
84*62c56f98SSadaf Ebrahimi 
85*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER)
86*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER)
87*62c56f98SSadaf Ebrahimi #else
88*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_WRITER 0
89*62c56f98SSadaf Ebrahimi #endif
90*62c56f98SSadaf Ebrahimi 
91*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 |       \
92*62c56f98SSadaf Ebrahimi                                 MBEDTLS_MPS_TRACE_MASK_LAYER_2 |       \
93*62c56f98SSadaf Ebrahimi                                 MBEDTLS_MPS_TRACE_MASK_LAYER_3 |       \
94*62c56f98SSadaf Ebrahimi                                 MBEDTLS_MPS_TRACE_MASK_LAYER_4 |       \
95*62c56f98SSadaf Ebrahimi                                 MBEDTLS_MPS_TRACE_MASK_READER  |       \
96*62c56f98SSadaf Ebrahimi                                 MBEDTLS_MPS_TRACE_MASK_WRITER)
97*62c56f98SSadaf Ebrahimi 
98*62c56f98SSadaf Ebrahimi /* We have to avoid globals because E-ACSL chokes on them...
99*62c56f98SSadaf Ebrahimi  * Wrap everything in stub functions. */
100*62c56f98SSadaf Ebrahimi int  mbedtls_mps_trace_get_depth(void);
101*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_inc_depth(void);
102*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_dec_depth(void);
103*62c56f98SSadaf Ebrahimi 
104*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_color(int id);
105*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty);
106*62c56f98SSadaf Ebrahimi 
107*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...);
108*62c56f98SSadaf Ebrahimi 
109*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE(type, ...)                                              \
110*62c56f98SSadaf Ebrahimi     do {                                                                            \
111*62c56f98SSadaf Ebrahimi         if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id)))         \
112*62c56f98SSadaf Ebrahimi         break;                                                                  \
113*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type);            \
114*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_color(mbedtls_mps_trace_id);                            \
115*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \
116*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_color(0);                                               \
117*62c56f98SSadaf Ebrahimi     } while (0)
118*62c56f98SSadaf Ebrahimi 
119*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_INIT(...)                                         \
120*62c56f98SSadaf Ebrahimi     do {                                                                      \
121*62c56f98SSadaf Ebrahimi         if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id)))   \
122*62c56f98SSadaf Ebrahimi         break;                                                            \
123*62c56f98SSadaf Ebrahimi         MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__);        \
124*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_inc_depth();                                        \
125*62c56f98SSadaf Ebrahimi     } while (0)
126*62c56f98SSadaf Ebrahimi 
127*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_END(val)                                        \
128*62c56f98SSadaf Ebrahimi     do {                                                                    \
129*62c56f98SSadaf Ebrahimi         if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
130*62c56f98SSadaf Ebrahimi         break;                                                          \
131*62c56f98SSadaf Ebrahimi         MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)",    \
132*62c56f98SSadaf Ebrahimi                           (int) (val), -((unsigned) (val)));                           \
133*62c56f98SSadaf Ebrahimi         mbedtls_mps_trace_dec_depth();                                      \
134*62c56f98SSadaf Ebrahimi     } while (0)
135*62c56f98SSadaf Ebrahimi 
136*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_RETURN(val)         \
137*62c56f98SSadaf Ebrahimi     do {                                        \
138*62c56f98SSadaf Ebrahimi         /* Breaks tail recursion. */            \
139*62c56f98SSadaf Ebrahimi         int ret__ = val;                        \
140*62c56f98SSadaf Ebrahimi         MBEDTLS_MPS_TRACE_END(ret__);         \
141*62c56f98SSadaf Ebrahimi         return ret__;                        \
142*62c56f98SSadaf Ebrahimi     } while (0)
143*62c56f98SSadaf Ebrahimi 
144*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_MPS_TRACE */
145*62c56f98SSadaf Ebrahimi 
146*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE(type, ...) do { } while (0)
147*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_INIT(...)  do { } while (0)
148*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_END          do { } while (0)
149*62c56f98SSadaf Ebrahimi 
150*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_RETURN(val) return val;
151*62c56f98SSadaf Ebrahimi 
152*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MPS_TRACE */
153*62c56f98SSadaf Ebrahimi 
154*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */
155