mps_trace.h 6.0 KB

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