blob: 820a1b66c2afe3db15464554012315121ae8ccc1 [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#include "mbedtls/platform.h"
Hanno Beckerb9100162021-01-12 09:46:03 +000034
Hanno Becker984fbde2021-01-28 09:02:18 +000035#if defined(MBEDTLS_MPS_ENABLE_TRACE)
Hanno Beckerc809ff62021-01-12 06:54:04 +000036
Hanno Beckerb9100162021-01-12 09:46:03 +000037/*
38 * Adapt this to enable/disable tracing output
39 * from the various layers of the MPS.
40 */
41
Hanno Becker984fbde2021-01-28 09:02:18 +000042#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1
43#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2
44#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3
45#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4
46#define MBEDTLS_MPS_TRACE_ENABLE_READER
47#define MBEDTLS_MPS_TRACE_ENABLE_WRITER
Hanno Beckerb9100162021-01-12 09:46:03 +000048
49/*
50 * To use the existing trace module, only change
Hanno Becker984fbde2021-01-28 09:02:18 +000051 * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the
Hanno Beckerb9100162021-01-12 09:46:03 +000052 * rest of this file.
53 */
54
55typedef enum
56{
Dave Rodgmanb7468252021-04-07 12:44:02 +010057 MBEDTLS_MPS_TRACE_TYPE_COMMENT,
58 MBEDTLS_MPS_TRACE_TYPE_CALL,
59 MBEDTLS_MPS_TRACE_TYPE_ERROR,
60 MBEDTLS_MPS_TRACE_TYPE_RETURN
Hanno Becker984fbde2021-01-28 09:02:18 +000061} mbedtls_mps_trace_type;
Hanno Beckerb9100162021-01-12 09:46:03 +000062
Hanno Becker984fbde2021-01-28 09:02:18 +000063#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
64#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
65#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
66#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
67#define MBEDTLS_MPS_TRACE_BIT_WRITER 5
68#define MBEDTLS_MPS_TRACE_BIT_READER 6
Hanno Beckerb9100162021-01-12 09:46:03 +000069
Hanno Becker984fbde2021-01-28 09:02:18 +000070#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
71#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1 )
Hanno Beckerb9100162021-01-12 09:46:03 +000072#else
Hanno Becker984fbde2021-01-28 09:02:18 +000073#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
Hanno Beckerb9100162021-01-12 09:46:03 +000074#endif
75
Hanno Becker984fbde2021-01-28 09:02:18 +000076#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
77#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2 )
Hanno Beckerb9100162021-01-12 09:46:03 +000078#else
Hanno Becker984fbde2021-01-28 09:02:18 +000079#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 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_3)
83#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3 )
Hanno Beckerb9100162021-01-12 09:46:03 +000084#else
Hanno Becker984fbde2021-01-28 09:02:18 +000085#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 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_4)
89#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4 )
Hanno Beckerb9100162021-01-12 09:46:03 +000090#else
Hanno Becker984fbde2021-01-28 09:02:18 +000091#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 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_READER)
95#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER )
Hanno Beckerb9100162021-01-12 09:46:03 +000096#else
Hanno Becker984fbde2021-01-28 09:02:18 +000097#define MBEDTLS_MPS_TRACE_MASK_READER 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_WRITER)
101#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER )
Hanno Beckerb9100162021-01-12 09:46:03 +0000102#else
Hanno Becker984fbde2021-01-28 09:02:18 +0000103#define MBEDTLS_MPS_TRACE_MASK_WRITER 0
Hanno Beckerb9100162021-01-12 09:46:03 +0000104#endif
105
Hanno Becker984fbde2021-01-28 09:02:18 +0000106#define MBEDTLS_MPS_TRACE_MASK ( MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \
107 MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \
108 MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \
109 MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \
110 MBEDTLS_MPS_TRACE_MASK_READER | \
111 MBEDTLS_MPS_TRACE_MASK_WRITER )
Hanno Beckerb9100162021-01-12 09:46:03 +0000112
113/* We have to avoid globals because E-ACSL chokes on them...
114 * Wrap everything in stub functions. */
Hanno Becker984fbde2021-01-28 09:02:18 +0000115int mbedtls_mps_trace_get_depth( void );
116void mbedtls_mps_trace_inc_depth( void );
117void mbedtls_mps_trace_dec_depth( void );
Hanno Beckerb9100162021-01-12 09:46:03 +0000118
Hanno Becker984fbde2021-01-28 09:02:18 +0000119void mbedtls_mps_trace_color( int id );
120void mbedtls_mps_trace_indent( int level, mbedtls_mps_trace_type ty );
Hanno Beckerb9100162021-01-12 09:46:03 +0000121
Hanno Becker984fbde2021-01-28 09:02:18 +0000122void mbedtls_mps_trace_print_msg( int id, int line, const char *format, ... );
Hanno Beckerb9100162021-01-12 09:46:03 +0000123
Hanno Becker984fbde2021-01-28 09:02:18 +0000124#define MBEDTLS_MPS_TRACE( type, ... ) \
125 do { \
126 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
127 break; \
128 mbedtls_mps_trace_indent( mbedtls_mps_trace_get_depth(), type ); \
129 mbedtls_mps_trace_color( mbedtls_mps_trace_id ); \
130 mbedtls_mps_trace_print_msg( mbedtls_mps_trace_id, __LINE__, __VA_ARGS__ ); \
131 mbedtls_mps_trace_color( 0 ); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000132 } while( 0 )
133
Hanno Becker984fbde2021-01-28 09:02:18 +0000134#define MBEDTLS_MPS_TRACE_INIT( ... ) \
135 do { \
136 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
137 break; \
Dave Rodgmanb7468252021-04-07 12:44:02 +0100138 MBEDTLS_MPS_TRACE( MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__ ); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000139 mbedtls_mps_trace_inc_depth(); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000140 } while( 0 )
141
Hanno Becker984fbde2021-01-28 09:02:18 +0000142#define MBEDTLS_MPS_TRACE_END( val ) \
143 do { \
144 if( ! ( MBEDTLS_MPS_TRACE_MASK & ( 1u << mbedtls_mps_trace_id ) ) ) \
145 break; \
Dave Rodgmanb7468252021-04-07 12:44:02 +0100146 MBEDTLS_MPS_TRACE( MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \
Hanno Becker984fbde2021-01-28 09:02:18 +0000147 (int) (val), -((unsigned)(val)) ); \
148 mbedtls_mps_trace_dec_depth(); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000149 } while( 0 )
150
Hanno Becker984fbde2021-01-28 09:02:18 +0000151#define MBEDTLS_MPS_TRACE_RETURN( val ) \
Hanno Beckerb9100162021-01-12 09:46:03 +0000152 do { \
153 /* Breaks tail recursion. */ \
154 int ret__ = val; \
Hanno Becker984fbde2021-01-28 09:02:18 +0000155 MBEDTLS_MPS_TRACE_END( ret__ ); \
Hanno Beckerb9100162021-01-12 09:46:03 +0000156 return( ret__ ); \
157 } while( 0 )
Hanno Beckerc809ff62021-01-12 06:54:04 +0000158
159#else /* MBEDTLS_MPS_TRACE */
160
Hanno Becker984fbde2021-01-28 09:02:18 +0000161#define MBEDTLS_MPS_TRACE( type, ... ) do { } while( 0 )
162#define MBEDTLS_MPS_TRACE_INIT( ... ) do { } while( 0 )
163#define MBEDTLS_MPS_TRACE_END do { } while( 0 )
Hanno Beckerc809ff62021-01-12 06:54:04 +0000164
Hanno Becker984fbde2021-01-28 09:02:18 +0000165#define MBEDTLS_MPS_TRACE_RETURN( val ) return( val );
Hanno Beckerc809ff62021-01-12 06:54:04 +0000166
167#endif /* MBEDTLS_MPS_TRACE */
168
Hanno Becker984fbde2021-01-28 09:02:18 +0000169#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */