blob: a13edd87f0bd5a5f0b54d0d167e7ea382f447084 [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 *
Gilles Peskinee820c0a2023-08-03 17:45:20 +02005 * This file is part of Mbed TLS (https://tls.mbed.org)
Hanno Beckerc809ff62021-01-12 06:54:04 +00006 */
7
8/**
Hanno Becker61d7eed2021-03-05 05:09:37 +00009 * \file mps_trace.h
Hanno Beckerc809ff62021-01-12 06:54:04 +000010 *
11 * \brief Tracing module for MPS
12 */
13
Hanno Becker984fbde2021-01-28 09:02:18 +000014#ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
15#define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H
Hanno Beckerc809ff62021-01-12 06:54:04 +000016
17#include "common.h"
Hanno Beckerc518c3b2021-01-28 07:08:08 +000018#include "mps_common.h"
19#include "mps_trace.h"
Hanno Beckerc809ff62021-01-12 06:54:04 +000020
Hanno Beckerb9100162021-01-12 09:46:03 +000021#include "mbedtls/platform.h"
Hanno Beckerb9100162021-01-12 09:46:03 +000022
Hanno Becker984fbde2021-01-28 09:02:18 +000023#if defined(MBEDTLS_MPS_ENABLE_TRACE)
Hanno Beckerc809ff62021-01-12 06:54:04 +000024
Hanno Beckerb9100162021-01-12 09:46:03 +000025/*
26 * Adapt this to enable/disable tracing output
27 * from the various layers of the MPS.
28 */
29
Hanno Becker984fbde2021-01-28 09:02:18 +000030#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1
31#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2
32#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3
33#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4
34#define MBEDTLS_MPS_TRACE_ENABLE_READER
35#define MBEDTLS_MPS_TRACE_ENABLE_WRITER
Hanno Beckerb9100162021-01-12 09:46:03 +000036
37/*
38 * To use the existing trace module, only change
Hanno Becker984fbde2021-01-28 09:02:18 +000039 * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the
Hanno Beckerb9100162021-01-12 09:46:03 +000040 * rest of this file.
41 */
42
Gilles Peskine449bd832023-01-11 14:50:10 +010043typedef enum {
Dave Rodgmanb7468252021-04-07 12:44:02 +010044 MBEDTLS_MPS_TRACE_TYPE_COMMENT,
45 MBEDTLS_MPS_TRACE_TYPE_CALL,
46 MBEDTLS_MPS_TRACE_TYPE_ERROR,
47 MBEDTLS_MPS_TRACE_TYPE_RETURN
Hanno Becker984fbde2021-01-28 09:02:18 +000048} mbedtls_mps_trace_type;
Hanno Beckerb9100162021-01-12 09:46:03 +000049
Hanno Becker984fbde2021-01-28 09:02:18 +000050#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1
51#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2
52#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3
53#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4
54#define MBEDTLS_MPS_TRACE_BIT_WRITER 5
55#define MBEDTLS_MPS_TRACE_BIT_READER 6
Hanno Beckerb9100162021-01-12 09:46:03 +000056
Hanno Becker984fbde2021-01-28 09:02:18 +000057#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1)
Gilles Peskine449bd832023-01-11 14:50:10 +010058#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1)
Hanno Beckerb9100162021-01-12 09:46:03 +000059#else
Hanno Becker984fbde2021-01-28 09:02:18 +000060#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0
Hanno Beckerb9100162021-01-12 09:46:03 +000061#endif
62
Hanno Becker984fbde2021-01-28 09:02:18 +000063#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2)
Gilles Peskine449bd832023-01-11 14:50:10 +010064#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2)
Hanno Beckerb9100162021-01-12 09:46:03 +000065#else
Hanno Becker984fbde2021-01-28 09:02:18 +000066#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0
Hanno Beckerb9100162021-01-12 09:46:03 +000067#endif
68
Hanno Becker984fbde2021-01-28 09:02:18 +000069#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3)
Gilles Peskine449bd832023-01-11 14:50:10 +010070#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3)
Hanno Beckerb9100162021-01-12 09:46:03 +000071#else
Hanno Becker984fbde2021-01-28 09:02:18 +000072#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 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_4)
Gilles Peskine449bd832023-01-11 14:50:10 +010076#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4)
Hanno Beckerb9100162021-01-12 09:46:03 +000077#else
Hanno Becker984fbde2021-01-28 09:02:18 +000078#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 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_READER)
Gilles Peskine449bd832023-01-11 14:50:10 +010082#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER)
Hanno Beckerb9100162021-01-12 09:46:03 +000083#else
Hanno Becker984fbde2021-01-28 09:02:18 +000084#define MBEDTLS_MPS_TRACE_MASK_READER 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_WRITER)
Gilles Peskine449bd832023-01-11 14:50:10 +010088#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +000089#else
Hanno Becker984fbde2021-01-28 09:02:18 +000090#define MBEDTLS_MPS_TRACE_MASK_WRITER 0
Hanno Beckerb9100162021-01-12 09:46:03 +000091#endif
92
Gilles Peskine449bd832023-01-11 14:50:10 +010093#define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \
94 MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \
95 MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \
96 MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \
97 MBEDTLS_MPS_TRACE_MASK_READER | \
98 MBEDTLS_MPS_TRACE_MASK_WRITER)
Hanno Beckerb9100162021-01-12 09:46:03 +000099
100/* We have to avoid globals because E-ACSL chokes on them...
101 * Wrap everything in stub functions. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100102int mbedtls_mps_trace_get_depth(void);
103void mbedtls_mps_trace_inc_depth(void);
104void mbedtls_mps_trace_dec_depth(void);
Hanno Beckerb9100162021-01-12 09:46:03 +0000105
Gilles Peskine449bd832023-01-11 14:50:10 +0100106void mbedtls_mps_trace_color(int id);
107void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty);
Hanno Beckerb9100162021-01-12 09:46:03 +0000108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...);
Hanno Beckerb9100162021-01-12 09:46:03 +0000110
Gilles Peskine449bd832023-01-11 14:50:10 +0100111#define MBEDTLS_MPS_TRACE(type, ...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000112 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
114 break; \
115 mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type); \
116 mbedtls_mps_trace_color(mbedtls_mps_trace_id); \
117 mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \
118 mbedtls_mps_trace_color(0); \
119 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000120
Gilles Peskine449bd832023-01-11 14:50:10 +0100121#define MBEDTLS_MPS_TRACE_INIT(...) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000122 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
124 break; \
125 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000126 mbedtls_mps_trace_inc_depth(); \
Gilles Peskine449bd832023-01-11 14:50:10 +0100127 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000128
Gilles Peskine449bd832023-01-11 14:50:10 +0100129#define MBEDTLS_MPS_TRACE_END(val) \
Hanno Becker984fbde2021-01-28 09:02:18 +0000130 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \
132 break; \
133 MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \
134 (int) (val), -((unsigned) (val))); \
Hanno Becker984fbde2021-01-28 09:02:18 +0000135 mbedtls_mps_trace_dec_depth(); \
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 } while (0)
Hanno Beckerb9100162021-01-12 09:46:03 +0000137
Gilles Peskine449bd832023-01-11 14:50:10 +0100138#define MBEDTLS_MPS_TRACE_RETURN(val) \
Hanno Beckerb9100162021-01-12 09:46:03 +0000139 do { \
140 /* Breaks tail recursion. */ \
141 int ret__ = val; \
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 MBEDTLS_MPS_TRACE_END(ret__); \
143 return ret__; \
144 } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000145
146#else /* MBEDTLS_MPS_TRACE */
147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148#define MBEDTLS_MPS_TRACE(type, ...) do { } while (0)
149#define MBEDTLS_MPS_TRACE_INIT(...) do { } while (0)
150#define MBEDTLS_MPS_TRACE_END do { } while (0)
Hanno Beckerc809ff62021-01-12 06:54:04 +0000151
Gilles Peskine449bd832023-01-11 14:50:10 +0100152#define MBEDTLS_MPS_TRACE_RETURN(val) return val;
Hanno Beckerc809ff62021-01-12 06:54:04 +0000153
154#endif /* MBEDTLS_MPS_TRACE */
155
Hanno Becker984fbde2021-01-28 09:02:18 +0000156#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */