blob: 7c2360118aacd05e6f9ed14e9cfa0824daac5332 [file] [log] [blame]
Hanno Beckerc809ff62021-01-12 06:54:04 +00001/*
2 * Copyright The Mbed TLS Contributors
3 * SPDX-License-Identifier: Apache-2.0
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * This file is part of mbed TLS (https://tls.mbed.org)
18 */
19
20/**
Hanno Becker61d7eed2021-03-05 05:09:37 +000021 * \file mps_trace.h
Hanno Beckerc809ff62021-01-12 06:54:04 +000022 *
23 * \brief Tracing module for MPS
24 */
25
Hanno Becker984fbde2021-01-28 09:02:18 +000026#ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
27#define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
Hanno Beckerc809ff62021-01-12 06:54:04 +000028
29#include "common.h"
Hanno Beckerc518c3b2021-01-28 07:08:08 +000030#include "mps_common.h"
31#include "mps_trace.h"
Hanno Beckerc809ff62021-01-12 06:54:04 +000032
Hanno Beckerb9100162021-01-12 09:46:03 +000033#if defined(MBEDTLS_PLATFORM_C)
34#include "mbedtls/platform.h"
35#else
36#include <stdio.h>
37#define mbedtls_printf printf
38#define mbedtls_vsnprintf vsnprintf
39#endif /* MBEDTLS_PLATFORM_C */
40
Hanno Becker984fbde2021-01-28 09:02:18 +000041#if defined(MBEDTLS_MPS_ENABLE_TRACE)
Hanno Beckerc809ff62021-01-12 06:54:04 +000042
Hanno Beckerb9100162021-01-12 09:46:03 +000043/*
44 * Adapt this to enable/disable tracing output
45 * from the various layers of the MPS.
46 */
47
Hanno Becker984fbde2021-01-28 09:02:18 +000048#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1
49#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2
50#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3
51#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4
52#define MBEDTLS_MPS_TRACE_ENABLE_READER
53#define MBEDTLS_MPS_TRACE_ENABLE_WRITER
Hanno Beckerb9100162021-01-12 09:46:03 +000054
55/*
56 * To use the existing trace module, only change
Hanno Becker984fbde2021-01-28 09:02:18 +000057 * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the
Hanno Beckerb9100162021-01-12 09:46:03 +000058 * rest of this file.
59 */
60
61typedef enum
62{
Dave Rodgmanb7468252021-04-07 12:44:02 +010063 MBEDTLS_MPS_TRACE_TYPE_COMMENT,
64 MBEDTLS_MPS_TRACE_TYPE_CALL,
65 MBEDTLS_MPS_TRACE_TYPE_ERROR,
66 MBEDTLS_MPS_TRACE_TYPE_RETURN
Hanno Becker984fbde2021-01-28 09:02:18 +000067} mbedtls_mps_trace_type;
Hanno Beckerb9100162021-01-12 09:46:03 +000068
Hanno Becker984fbde2021-01-28 09:02:18 +000069#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
70#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
71#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
72#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
73#define MBEDTLS_MPS_TRACE_BIT_WRITER 5
74#define MBEDTLS_MPS_TRACE_BIT_READER 6
Hanno Beckerb9100162021-01-12 09:46:03 +000075
Hanno Becker984fbde2021-01-28 09:02:18 +000076#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
77#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1 )
Hanno Beckerb9100162021-01-12 09:46:03 +000078#else
Hanno Becker984fbde2021-01-28 09:02:18 +000079#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
Hanno Beckerb9100162021-01-12 09:46:03 +000080#endif
81
Hanno Becker984fbde2021-01-28 09:02:18 +000082#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
83#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2 )
Hanno Beckerb9100162021-01-12 09:46:03 +000084#else
Hanno Becker984fbde2021-01-28 09:02:18 +000085#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0
Hanno Beckerb9100162021-01-12 09:46:03 +000086#endif
87
Hanno Becker984fbde2021-01-28 09:02:18 +000088#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3)
89#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3 )
Hanno Beckerb9100162021-01-12 09:46:03 +000090#else
Hanno Becker984fbde2021-01-28 09:02:18 +000091#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0
Hanno Beckerb9100162021-01-12 09:46:03 +000092#endif
93
Hanno Becker984fbde2021-01-28 09:02:18 +000094#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4)
95#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4 )
Hanno Beckerb9100162021-01-12 09:46:03 +000096#else
Hanno Becker984fbde2021-01-28 09:02:18 +000097#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0
Hanno Beckerb9100162021-01-12 09:46:03 +000098#endif
99
Hanno Becker984fbde2021-01-28 09:02:18 +0000100#if defined(MBEDTLS_MPS_TRACE_ENABLE_READER)
101#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER )
Hanno Beckerb9100162021-01-12 09:46:03 +0000102#else
Hanno Becker984fbde2021-01-28 09:02:18 +0000103#define MBEDTLS_MPS_TRACE_MASK_READER 0
Hanno Beckerb9100162021-01-12 09:46:03 +0000104#endif
105
Hanno Becker984fbde2021-01-28 09:02:18 +0000106#if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER)
107#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER )
Hanno Beckerb9100162021-01-12 09:46:03 +0000108#else
Hanno Becker984fbde2021-01-28 09:02:18 +0000109#define MBEDTLS_MPS_TRACE_MASK_WRITER 0
Hanno Beckerb9100162021-01-12 09:46:03 +0000110#endif
111
Hanno Becker984fbde2021-01-28 09:02:18 +0000112#define MBEDTLS_MPS_TRACE_MASK ( MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \
113 MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \
114 MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \
115 MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \
116 MBEDTLS_MPS_TRACE_MASK_READER | \
117 MBEDTLS_MPS_TRACE_MASK_WRITER )
Hanno Beckerb9100162021-01-12 09:46:03 +0000118
119/* We have to avoid globals because E-ACSL chokes on them...
120 * Wrap everything in stub functions. */
Hanno Becker984fbde2021-01-28 09:02:18 +0000121int mbedtls_mps_trace_get_depth( void );
122void mbedtls_mps_trace_inc_depth( void );
123void mbedtls_mps_trace_dec_depth( void );
Hanno Beckerb9100162021-01-12 09:46:03 +0000124
Hanno Becker984fbde2021-01-28 09:02:18 +0000125void mbedtls_mps_trace_color( int id );
126void mbedtls_mps_trace_indent( int level, mbedtls_mps_trace_type ty );
Hanno Beckerb9100162021-01-12 09:46:03 +0000127
Hanno Becker984fbde2021-01-28 09:02:18 +0000128void mbedtls_mps_trace_print_msg( int id, int line, const char *format, ... );
Hanno Beckerb9100162021-01-12 09:46:03 +0000129
Hanno Becker984fbde2021-01-28 09:02:18 +0000130#define MBEDTLS_MPS_TRACE( type, ... ) \
131 do { \
132 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
133 break; \
134 mbedtls_mps_trace_indent( mbedtls_mps_trace_get_depth(), type ); \
135 mbedtls_mps_trace_color( mbedtls_mps_trace_id ); \
136 mbedtls_mps_trace_print_msg( mbedtls_mps_trace_id, __LINE__, __VA_ARGS__ ); \
137 mbedtls_mps_trace_color( 0 ); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000138 } while( 0 )
139
Hanno Becker984fbde2021-01-28 09:02:18 +0000140#define MBEDTLS_MPS_TRACE_INIT( ... ) \
141 do { \
142 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
143 break; \
Dave Rodgmanb7468252021-04-07 12:44:02 +0100144 MBEDTLS_MPS_TRACE( MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__ ); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000145 mbedtls_mps_trace_inc_depth(); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000146 } while( 0 )
147
Hanno Becker984fbde2021-01-28 09:02:18 +0000148#define MBEDTLS_MPS_TRACE_END( val ) \
149 do { \
150 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
151 break; \
Dave Rodgmanb7468252021-04-07 12:44:02 +0100152 MBEDTLS_MPS_TRACE( MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \
Hanno Becker984fbde2021-01-28 09:02:18 +0000153 (int) (val), -((unsigned)(val)) ); \
154 mbedtls_mps_trace_dec_depth(); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000155 } while( 0 )
156
Hanno Becker984fbde2021-01-28 09:02:18 +0000157#define MBEDTLS_MPS_TRACE_RETURN( val ) \
Hanno Beckerb9100162021-01-12 09:46:03 +0000158 do { \
159 /* Breaks tail recursion. */ \
160 int ret__ = val; \
Hanno Becker984fbde2021-01-28 09:02:18 +0000161 MBEDTLS_MPS_TRACE_END( ret__ ); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000162 return( ret__ ); \
163 } while( 0 )
Hanno Beckerc809ff62021-01-12 06:54:04 +0000164
165#else /* MBEDTLS_MPS_TRACE */
166
Hanno Becker984fbde2021-01-28 09:02:18 +0000167#define MBEDTLS_MPS_TRACE( type, ... ) do { } while( 0 )
168#define MBEDTLS_MPS_TRACE_INIT( ... ) do { } while( 0 )
169#define MBEDTLS_MPS_TRACE_END do { } while( 0 )
Hanno Beckerc809ff62021-01-12 06:54:04 +0000170
Hanno Becker984fbde2021-01-28 09:02:18 +0000171#define MBEDTLS_MPS_TRACE_RETURN( val ) return( val );
Hanno Beckerc809ff62021-01-12 06:54:04 +0000172
173#endif /* MBEDTLS_MPS_TRACE */
174
Hanno Becker984fbde2021-01-28 09:02:18 +0000175#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */