blob: b456b2ffddf51b1bad31df5f3835ea6ba215bd03 [file] [log] [blame]
Hanno Beckerc809ff62021-01-12 06:54:04 +00001/*
2 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00003 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Hanno Beckerc809ff62021-01-12 06:54:04 +00004 */
5
6/**
Hanno Becker61d7eed2021-03-05 05:09:37 +00007 * \file mps_trace.h
Hanno Beckerc809ff62021-01-12 06:54:04 +00008 *
9 * \brief Tracing module for MPS
10 */
11
Hanno Becker984fbde2021-01-28 09:02:18 +000012#ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
13#define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
Hanno Beckerc809ff62021-01-12 06:54:04 +000014
15#include "common.h"
Hanno Beckerc518c3b2021-01-28 07:08:08 +000016#include "mps_common.h"
17#include "mps_trace.h"
Hanno Beckerc809ff62021-01-12 06:54:04 +000018
Hanno Beckerb9100162021-01-12 09:46:03 +000019#include "mbedtls/platform.h"
Hanno Beckerb9100162021-01-12 09:46:03 +000020
Hanno Becker984fbde2021-01-28 09:02:18 +000021#if defined(MBEDTLS_MPS_ENABLE_TRACE)
Hanno Beckerc809ff62021-01-12 06:54:04 +000022
Hanno Beckerb9100162021-01-12 09:46:03 +000023/*
24 * Adapt this to enable/disable tracing output
25 * from the various layers of the MPS.
26 */
27
Hanno Becker984fbde2021-01-28 09:02:18 +000028#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1
29#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2
30#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3
31#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4
32#define MBEDTLS_MPS_TRACE_ENABLE_READER
33#define MBEDTLS_MPS_TRACE_ENABLE_WRITER
Hanno Beckerb9100162021-01-12 09:46:03 +000034
35/*
36 * To use the existing trace module, only change
Hanno Becker984fbde2021-01-28 09:02:18 +000037 * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the
Hanno Beckerb9100162021-01-12 09:46:03 +000038 * rest of this file.
39 */
40
Gilles Peskine449bd832023-01-11 14:50:10 +010041typedef enum {
Dave Rodgmanb7468252021-04-07 12:44:02 +010042 MBEDTLS_MPS_TRACE_TYPE_COMMENT,
43 MBEDTLS_MPS_TRACE_TYPE_CALL,
44 MBEDTLS_MPS_TRACE_TYPE_ERROR,
45 MBEDTLS_MPS_TRACE_TYPE_RETURN
Hanno Becker984fbde2021-01-28 09:02:18 +000046} mbedtls_mps_trace_type;
Hanno Beckerb9100162021-01-12 09:46:03 +000047
Hanno Becker984fbde2021-01-28 09:02:18 +000048#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
49#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
50#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
51#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
52#define MBEDTLS_MPS_TRACE_BIT_WRITER 5
53#define MBEDTLS_MPS_TRACE_BIT_READER 6
Hanno Beckerb9100162021-01-12 09:46:03 +000054
Hanno Becker984fbde2021-01-28 09:02:18 +000055#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
Gilles Peskine449bd832023-01-11 14:50:10 +010056#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1)
Hanno Beckerb9100162021-01-12 09:46:03 +000057#else
Hanno Becker984fbde2021-01-28 09:02:18 +000058#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
Hanno Beckerb9100162021-01-12 09:46:03 +000059#endif
60
Hanno Becker984fbde2021-01-28 09:02:18 +000061#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
Gilles Peskine449bd832023-01-11 14:50:10 +010062#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2)
Hanno Beckerb9100162021-01-12 09:46:03 +000063#else
Hanno Becker984fbde2021-01-28 09:02:18 +000064#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0
Hanno Beckerb9100162021-01-12 09:46:03 +000065#endif
66
Hanno Becker984fbde2021-01-28 09:02:18 +000067#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3)
Gilles Peskine449bd832023-01-11 14:50:10 +010068#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3)
Hanno Beckerb9100162021-01-12 09:46:03 +000069#else
Hanno Becker984fbde2021-01-28 09:02:18 +000070#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0
Hanno Beckerb9100162021-01-12 09:46:03 +000071#endif
72
Hanno Becker984fbde2021-01-28 09:02:18 +000073#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4)
Gilles Peskine449bd832023-01-11 14:50:10 +010074#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4)
Hanno Beckerb9100162021-01-12 09:46:03 +000075#else
Hanno Becker984fbde2021-01-28 09:02:18 +000076#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0
Hanno Beckerb9100162021-01-12 09:46:03 +000077#endif
78
Hanno Becker984fbde2021-01-28 09:02:18 +000079#if defined(MBEDTLS_MPS_TRACE_ENABLE_READER)
Gilles Peskine449bd832023-01-11 14:50:10 +010080#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER)
Hanno Beckerb9100162021-01-12 09:46:03 +000081#else
Hanno Becker984fbde2021-01-28 09:02:18 +000082#define MBEDTLS_MPS_TRACE_MASK_READER 0
Hanno Beckerb9100162021-01-12 09:46:03 +000083#endif
84
Hanno Becker984fbde2021-01-28 09:02:18 +000085#if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER)
Gilles Peskine449bd832023-01-11 14:50:10 +010086#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +000087#else
Hanno Becker984fbde2021-01-28 09:02:18 +000088#define MBEDTLS_MPS_TRACE_MASK_WRITER 0
Hanno Beckerb9100162021-01-12 09:46:03 +000089#endif
90
Gilles Peskine449bd832023-01-11 14:50:10 +010091#define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \
92 MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \
93 MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \
94 MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \
95 MBEDTLS_MPS_TRACE_MASK_READER | \
96 MBEDTLS_MPS_TRACE_MASK_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +000097
98/* We have to avoid globals because E-ACSL chokes on them...
99 * Wrap everything in stub functions. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100100int mbedtls_mps_trace_get_depth(void);
101void mbedtls_mps_trace_inc_depth(void);
102void mbedtls_mps_trace_dec_depth(void);
Hanno Beckerb9100162021-01-12 09:46:03 +0000103
Gilles Peskine449bd832023-01-11 14:50:10 +0100104void mbedtls_mps_trace_color(int id);
105void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty);
Hanno Beckerb9100162021-01-12 09:46:03 +0000106
Gilles Peskine449bd832023-01-11 14:50:10 +0100107void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...);
Hanno Beckerb9100162021-01-12 09:46:03 +0000108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109#define MBEDTLS_MPS_TRACE(type, ...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000110 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
112 break; \
113 mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type); \
114 mbedtls_mps_trace_color(mbedtls_mps_trace_id); \
115 mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \
116 mbedtls_mps_trace_color(0); \
117 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000118
Gilles Peskine449bd832023-01-11 14:50:10 +0100119#define MBEDTLS_MPS_TRACE_INIT(...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000120 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
122 break; \
123 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000124 mbedtls_mps_trace_inc_depth(); \
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000126
Gilles Peskine449bd832023-01-11 14:50:10 +0100127#define MBEDTLS_MPS_TRACE_END(val) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000128 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
130 break; \
131 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \
132 (int) (val), -((unsigned) (val))); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000133 mbedtls_mps_trace_dec_depth(); \
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136#define MBEDTLS_MPS_TRACE_RETURN(val) \
Hanno Beckerb9100162021-01-12 09:46:03 +0000137 do { \
138 /* Breaks tail recursion. */ \
139 int ret__ = val; \
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 MBEDTLS_MPS_TRACE_END(ret__); \
141 return ret__; \
142 } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000143
144#else /* MBEDTLS_MPS_TRACE */
145
Gilles Peskine449bd832023-01-11 14:50:10 +0100146#define MBEDTLS_MPS_TRACE(type, ...) do { } while (0)
147#define MBEDTLS_MPS_TRACE_INIT(...) do { } while (0)
148#define MBEDTLS_MPS_TRACE_END do { } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000149
Gilles Peskine449bd832023-01-11 14:50:10 +0100150#define MBEDTLS_MPS_TRACE_RETURN(val) return val;
Hanno Beckerc809ff62021-01-12 06:54:04 +0000151
152#endif /* MBEDTLS_MPS_TRACE */
153
Hanno Becker984fbde2021-01-28 09:02:18 +0000154#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */