mps_trace.h 5.4 KB

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