1*62c56f98SSadaf Ebrahimi /* 2*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors 3*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 4*62c56f98SSadaf Ebrahimi */ 5*62c56f98SSadaf Ebrahimi 6*62c56f98SSadaf Ebrahimi /** 7*62c56f98SSadaf Ebrahimi * \file mps_trace.h 8*62c56f98SSadaf Ebrahimi * 9*62c56f98SSadaf Ebrahimi * \brief Tracing module for MPS 10*62c56f98SSadaf Ebrahimi */ 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimi #ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H 13*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H 14*62c56f98SSadaf Ebrahimi 15*62c56f98SSadaf Ebrahimi #include "common.h" 16*62c56f98SSadaf Ebrahimi #include "mps_common.h" 17*62c56f98SSadaf Ebrahimi #include "mps_trace.h" 18*62c56f98SSadaf Ebrahimi 19*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h" 20*62c56f98SSadaf Ebrahimi 21*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_ENABLE_TRACE) 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimi /* 24*62c56f98SSadaf Ebrahimi * Adapt this to enable/disable tracing output 25*62c56f98SSadaf Ebrahimi * from the various layers of the MPS. 26*62c56f98SSadaf Ebrahimi */ 27*62c56f98SSadaf Ebrahimi 28*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1 29*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2 30*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3 31*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4 32*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_READER 33*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_ENABLE_WRITER 34*62c56f98SSadaf Ebrahimi 35*62c56f98SSadaf Ebrahimi /* 36*62c56f98SSadaf Ebrahimi * To use the existing trace module, only change 37*62c56f98SSadaf Ebrahimi * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the 38*62c56f98SSadaf Ebrahimi * rest of this file. 39*62c56f98SSadaf Ebrahimi */ 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi typedef enum { 42*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_TYPE_COMMENT, 43*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_TYPE_CALL, 44*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_TYPE_ERROR, 45*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_TYPE_RETURN 46*62c56f98SSadaf Ebrahimi } mbedtls_mps_trace_type; 47*62c56f98SSadaf Ebrahimi 48*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1 49*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2 50*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3 51*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4 52*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_WRITER 5 53*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_BIT_READER 6 54*62c56f98SSadaf Ebrahimi 55*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1) 56*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1) 57*62c56f98SSadaf Ebrahimi #else 58*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0 59*62c56f98SSadaf Ebrahimi #endif 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2) 62*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2) 63*62c56f98SSadaf Ebrahimi #else 64*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0 65*62c56f98SSadaf Ebrahimi #endif 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3) 68*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3) 69*62c56f98SSadaf Ebrahimi #else 70*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0 71*62c56f98SSadaf Ebrahimi #endif 72*62c56f98SSadaf Ebrahimi 73*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4) 74*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4) 75*62c56f98SSadaf Ebrahimi #else 76*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0 77*62c56f98SSadaf Ebrahimi #endif 78*62c56f98SSadaf Ebrahimi 79*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_READER) 80*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER) 81*62c56f98SSadaf Ebrahimi #else 82*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_READER 0 83*62c56f98SSadaf Ebrahimi #endif 84*62c56f98SSadaf Ebrahimi 85*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER) 86*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER) 87*62c56f98SSadaf Ebrahimi #else 88*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK_WRITER 0 89*62c56f98SSadaf Ebrahimi #endif 90*62c56f98SSadaf Ebrahimi 91*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \ 92*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \ 93*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \ 94*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \ 95*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_MASK_READER | \ 96*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_MASK_WRITER) 97*62c56f98SSadaf Ebrahimi 98*62c56f98SSadaf Ebrahimi /* We have to avoid globals because E-ACSL chokes on them... 99*62c56f98SSadaf Ebrahimi * Wrap everything in stub functions. */ 100*62c56f98SSadaf Ebrahimi int mbedtls_mps_trace_get_depth(void); 101*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_inc_depth(void); 102*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_dec_depth(void); 103*62c56f98SSadaf Ebrahimi 104*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_color(int id); 105*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty); 106*62c56f98SSadaf Ebrahimi 107*62c56f98SSadaf Ebrahimi void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...); 108*62c56f98SSadaf Ebrahimi 109*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE(type, ...) \ 110*62c56f98SSadaf Ebrahimi do { \ 111*62c56f98SSadaf Ebrahimi if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ 112*62c56f98SSadaf Ebrahimi break; \ 113*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type); \ 114*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_color(mbedtls_mps_trace_id); \ 115*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \ 116*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_color(0); \ 117*62c56f98SSadaf Ebrahimi } while (0) 118*62c56f98SSadaf Ebrahimi 119*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_INIT(...) \ 120*62c56f98SSadaf Ebrahimi do { \ 121*62c56f98SSadaf Ebrahimi if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ 122*62c56f98SSadaf Ebrahimi break; \ 123*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__); \ 124*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_inc_depth(); \ 125*62c56f98SSadaf Ebrahimi } while (0) 126*62c56f98SSadaf Ebrahimi 127*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_END(val) \ 128*62c56f98SSadaf Ebrahimi do { \ 129*62c56f98SSadaf Ebrahimi if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ 130*62c56f98SSadaf Ebrahimi break; \ 131*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \ 132*62c56f98SSadaf Ebrahimi (int) (val), -((unsigned) (val))); \ 133*62c56f98SSadaf Ebrahimi mbedtls_mps_trace_dec_depth(); \ 134*62c56f98SSadaf Ebrahimi } while (0) 135*62c56f98SSadaf Ebrahimi 136*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_RETURN(val) \ 137*62c56f98SSadaf Ebrahimi do { \ 138*62c56f98SSadaf Ebrahimi /* Breaks tail recursion. */ \ 139*62c56f98SSadaf Ebrahimi int ret__ = val; \ 140*62c56f98SSadaf Ebrahimi MBEDTLS_MPS_TRACE_END(ret__); \ 141*62c56f98SSadaf Ebrahimi return ret__; \ 142*62c56f98SSadaf Ebrahimi } while (0) 143*62c56f98SSadaf Ebrahimi 144*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_MPS_TRACE */ 145*62c56f98SSadaf Ebrahimi 146*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE(type, ...) do { } while (0) 147*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_INIT(...) do { } while (0) 148*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_END do { } while (0) 149*62c56f98SSadaf Ebrahimi 150*62c56f98SSadaf Ebrahimi #define MBEDTLS_MPS_TRACE_RETURN(val) return val; 151*62c56f98SSadaf Ebrahimi 152*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MPS_TRACE */ 153*62c56f98SSadaf Ebrahimi 154*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */ 155