blob: 6f0455f038356f5d31d0632c495baf9d3e209731 [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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010055typedef enum {
Dave Rodgmanb7468252021-04-07 12:44:02 +010056 MBEDTLS_MPS_TRACE_TYPE_COMMENT,
57 MBEDTLS_MPS_TRACE_TYPE_CALL,
58 MBEDTLS_MPS_TRACE_TYPE_ERROR,
59 MBEDTLS_MPS_TRACE_TYPE_RETURN
Hanno Becker984fbde2021-01-28 09:02:18 +000060} mbedtls_mps_trace_type;
Hanno Beckerb9100162021-01-12 09:46:03 +000061
Hanno Becker984fbde2021-01-28 09:02:18 +000062#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
63#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
64#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
65#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
66#define MBEDTLS_MPS_TRACE_BIT_WRITER 5
67#define MBEDTLS_MPS_TRACE_BIT_READER 6
Hanno Beckerb9100162021-01-12 09:46:03 +000068
Hanno Becker984fbde2021-01-28 09:02:18 +000069#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010070#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1)
Hanno Beckerb9100162021-01-12 09:46:03 +000071#else
Hanno Becker984fbde2021-01-28 09:02:18 +000072#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
Hanno Beckerb9100162021-01-12 09:46:03 +000073#endif
74
Hanno Becker984fbde2021-01-28 09:02:18 +000075#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010076#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2)
Hanno Beckerb9100162021-01-12 09:46:03 +000077#else
Hanno Becker984fbde2021-01-28 09:02:18 +000078#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0
Hanno Beckerb9100162021-01-12 09:46:03 +000079#endif
80
Hanno Becker984fbde2021-01-28 09:02:18 +000081#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010082#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3)
Hanno Beckerb9100162021-01-12 09:46:03 +000083#else
Hanno Becker984fbde2021-01-28 09:02:18 +000084#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0
Hanno Beckerb9100162021-01-12 09:46:03 +000085#endif
86
Hanno Becker984fbde2021-01-28 09:02:18 +000087#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010088#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4)
Hanno Beckerb9100162021-01-12 09:46:03 +000089#else
Hanno Becker984fbde2021-01-28 09:02:18 +000090#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0
Hanno Beckerb9100162021-01-12 09:46:03 +000091#endif
92
Hanno Becker984fbde2021-01-28 09:02:18 +000093#if defined(MBEDTLS_MPS_TRACE_ENABLE_READER)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010094#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER)
Hanno Beckerb9100162021-01-12 09:46:03 +000095#else
Hanno Becker984fbde2021-01-28 09:02:18 +000096#define MBEDTLS_MPS_TRACE_MASK_READER 0
Hanno Beckerb9100162021-01-12 09:46:03 +000097#endif
98
Hanno Becker984fbde2021-01-28 09:02:18 +000099#if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100100#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +0000101#else
Hanno Becker984fbde2021-01-28 09:02:18 +0000102#define MBEDTLS_MPS_TRACE_MASK_WRITER 0
Hanno Beckerb9100162021-01-12 09:46:03 +0000103#endif
104
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100105#define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \
106 MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \
107 MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \
108 MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \
109 MBEDTLS_MPS_TRACE_MASK_READER | \
110 MBEDTLS_MPS_TRACE_MASK_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +0000111
112/* We have to avoid globals because E-ACSL chokes on them...
113 * Wrap everything in stub functions. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100114int mbedtls_mps_trace_get_depth(void);
115void mbedtls_mps_trace_inc_depth(void);
116void mbedtls_mps_trace_dec_depth(void);
Hanno Beckerb9100162021-01-12 09:46:03 +0000117
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100118void mbedtls_mps_trace_color(int id);
119void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty);
Hanno Beckerb9100162021-01-12 09:46:03 +0000120
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100121void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...);
Hanno Beckerb9100162021-01-12 09:46:03 +0000122
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123#define MBEDTLS_MPS_TRACE(type, ...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000124 do { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100125 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
126 break; \
127 mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type); \
128 mbedtls_mps_trace_color(mbedtls_mps_trace_id); \
129 mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \
130 mbedtls_mps_trace_color(0); \
131 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000132
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100133#define MBEDTLS_MPS_TRACE_INIT(...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000134 do { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100135 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
136 break; \
137 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000138 mbedtls_mps_trace_inc_depth(); \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100139 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000140
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100141#define MBEDTLS_MPS_TRACE_END(val) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000142 do { \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100143 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
144 break; \
145 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \
146 (int) (val), -((unsigned) (val))); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000147 mbedtls_mps_trace_dec_depth(); \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100148 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000149
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100150#define MBEDTLS_MPS_TRACE_RETURN(val) \
Hanno Beckerb9100162021-01-12 09:46:03 +0000151 do { \
152 /* Breaks tail recursion. */ \
153 int ret__ = val; \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100154 MBEDTLS_MPS_TRACE_END(ret__); \
155 return ret__; \
156 } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000157
158#else /* MBEDTLS_MPS_TRACE */
159
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100160#define MBEDTLS_MPS_TRACE(type, ...) do { } while (0)
161#define MBEDTLS_MPS_TRACE_INIT(...) do { } while (0)
162#define MBEDTLS_MPS_TRACE_END do { } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000163
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100164#define MBEDTLS_MPS_TRACE_RETURN(val) return val;
Hanno Beckerc809ff62021-01-12 06:54:04 +0000165
166#endif /* MBEDTLS_MPS_TRACE */
167
Hanno Becker984fbde2021-01-28 09:02:18 +0000168#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */