LCOV - code coverage report
Current view: top level - zephyr/tracing - tracing_macros.h Coverage Total Hit
Test: new.info Lines: 91.7 % 12 11
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2018 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_
       7              : #define ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_
       8              : 
       9              : #include <zephyr/sys/util_macro.h>
      10              : 
      11              : #if !defined(CONFIG_TRACING) && !defined(__DOXYGEN__)
      12              : 
      13              : #define SYS_PORT_TRACING_FUNC(type, func, ...) do { } while (false)
      14              : #define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...) do { } while (false)
      15              : #define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...) do { } while (false)
      16              : #define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...) do { } while (false)
      17              : #define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) do { } while (false)
      18              : #define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) do { } while (false)
      19              : #define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) do { } while (false)
      20              : #define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, ...) do { } while (false)
      21              : #define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) do { } while (false)
      22              : 
      23              : #define SYS_PORT_TRACING_TRACKING_FIELD(type)
      24              : 
      25              : #else
      26              : 
      27              : /**
      28              :  * @brief Tracing utility macros
      29              :  * @defgroup subsys_tracing_macros Tracing utility macros
      30              :  * @ingroup subsys_tracing
      31              :  * @{
      32              :  */
      33              : 
      34              : /** @cond INTERNAL_HIDDEN */
      35              : 
      36              : /*
      37              :  * Helper macros used by the extended tracing system
      38              :  */
      39              : 
      40              : #define _SYS_PORT_TRACING_TYPE_MASK(type) \
      41              :         sys_port_trace_type_mask_ ## type
      42              : #define _SYS_PORT_TRACING_FUNC(name, func) \
      43              :         sys_port_trace_ ## name ## _ ## func
      44              : #define _SYS_PORT_TRACING_FUNC_ENTER(name, func) \
      45              :         sys_port_trace_ ## name ## _ ## func ## _enter
      46              : #define _SYS_PORT_TRACING_FUNC_BLOCKING(name, func) \
      47              :         sys_port_trace_ ## name ## _ ## func ## _blocking
      48              : #define _SYS_PORT_TRACING_FUNC_EXIT(name, func) \
      49              :         sys_port_trace_ ## name ## _ ## func ## _exit
      50              : #define _SYS_PORT_TRACING_OBJ_INIT(name) \
      51              :         sys_port_trace_ ## name ## _init
      52              : #define _SYS_PORT_TRACING_OBJ_FUNC(name, func) \
      53              :         sys_port_trace_ ## name ## _ ## func
      54              : #define _SYS_PORT_TRACING_OBJ_FUNC_ENTER(name, func) \
      55              :         sys_port_trace_ ## name ## _ ## func ## _enter
      56              : #define _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(name, func) \
      57              :         sys_port_trace_ ## name ## _ ## func ## _blocking
      58              : #define _SYS_PORT_TRACING_OBJ_FUNC_EXIT(name, func) \
      59              :         sys_port_trace_ ## name ## _ ## func ## _exit
      60              : 
      61              : /*
      62              :  * Helper macros for the object tracking system
      63              :  */
      64              : 
      65              : #define _SYS_PORT_TRACKING_OBJ_INIT(name) \
      66              :         sys_port_track_ ## name ## _init
      67              : #define _SYS_PORT_TRACKING_OBJ_FUNC(name, func) \
      68              :         sys_port_track_ ## name ## _ ## func
      69              : 
      70              : /*
      71              :  * Object trace macros part of the system for checking if certain
      72              :  * objects should be traced or not depending on the tracing configuration.
      73              :  */
      74              : #if defined(CONFIG_TRACING_THREAD)
      75              :         #define sys_port_trace_type_mask_k_thread(trace_call) trace_call
      76              : #else
      77              :         #define sys_port_trace_type_mask_k_thread(trace_call)
      78              :         #define sys_port_trace_k_thread_is_disabled 1
      79              : #endif
      80              : 
      81              : #if defined(CONFIG_TRACING_WORK)
      82              :         #define sys_port_trace_type_mask_k_work(trace_call) trace_call
      83              :         #define sys_port_trace_type_mask_k_work_queue(trace_call) trace_call
      84              :         #define sys_port_trace_type_mask_k_work_delayable(trace_call) trace_call
      85              :         #define sys_port_trace_type_mask_k_work_poll(trace_call) trace_call
      86              : #else
      87              :         #define sys_port_trace_type_mask_k_work(trace_call)
      88              :         #define sys_port_trace_type_mask_k_work_queue(trace_call)
      89              :         #define sys_port_trace_type_mask_k_work_delayable(trace_call)
      90              :         #define sys_port_trace_type_mask_k_work_poll(trace_call)
      91              : #endif
      92              : 
      93              : #if defined(CONFIG_TRACING_SEMAPHORE)
      94              :         #define sys_port_trace_type_mask_k_sem(trace_call) trace_call
      95              : #else
      96              :         #define sys_port_trace_type_mask_k_sem(trace_call)
      97              : #endif
      98              : 
      99              : #if defined(CONFIG_TRACING_MUTEX)
     100              :         #define sys_port_trace_type_mask_k_mutex(trace_call) trace_call
     101              : #else
     102              :         #define sys_port_trace_type_mask_k_mutex(trace_call)
     103              : #endif
     104              : 
     105              : #if defined(CONFIG_TRACING_CONDVAR)
     106              :         #define sys_port_trace_type_mask_k_condvar(trace_call) trace_call
     107              : #else
     108              :         #define sys_port_trace_type_mask_k_condvar(trace_call)
     109              : #endif
     110              : 
     111              : #if defined(CONFIG_TRACING_QUEUE)
     112              :         #define sys_port_trace_type_mask_k_queue(trace_call) trace_call
     113              : #else
     114              :         #define sys_port_trace_type_mask_k_queue(trace_call)
     115              : #endif
     116              : 
     117              : #if defined(CONFIG_TRACING_FIFO)
     118              :         #define sys_port_trace_type_mask_k_fifo(trace_call) trace_call
     119              : #else
     120              :         #define sys_port_trace_type_mask_k_fifo(trace_call)
     121              : #endif
     122              : 
     123              : #if defined(CONFIG_TRACING_LIFO)
     124              :         #define sys_port_trace_type_mask_k_lifo(trace_call) trace_call
     125              : #else
     126              :         #define sys_port_trace_type_mask_k_lifo(trace_call)
     127              : #endif
     128              : 
     129              : #if defined(CONFIG_TRACING_STACK)
     130              :         #define sys_port_trace_type_mask_k_stack(trace_call) trace_call
     131              : #else
     132              :         #define sys_port_trace_type_mask_k_stack(trace_call)
     133              : #endif
     134              : 
     135              : #if defined(CONFIG_TRACING_MESSAGE_QUEUE)
     136              :         #define sys_port_trace_type_mask_k_msgq(trace_call) trace_call
     137              : #else
     138              :         #define sys_port_trace_type_mask_k_msgq(trace_call)
     139              : #endif
     140              : 
     141              : #if defined(CONFIG_TRACING_MAILBOX)
     142              :         #define sys_port_trace_type_mask_k_mbox(trace_call) trace_call
     143              : #else
     144              :         #define sys_port_trace_type_mask_k_mbox(trace_call)
     145              : #endif
     146              : 
     147              : #if defined(CONFIG_TRACING_PIPE)
     148              :         #define sys_port_trace_type_mask_k_pipe(trace_call) trace_call
     149              : #else
     150              :         #define sys_port_trace_type_mask_k_pipe(trace_call)
     151              : #endif
     152              : 
     153              : #if defined(CONFIG_TRACING_HEAP)
     154              :         #define sys_port_trace_type_mask_k_heap(trace_call) trace_call
     155              :         #define sys_port_trace_type_mask_k_heap_sys(trace_call) trace_call
     156              : #else
     157              :         #define sys_port_trace_type_mask_k_heap(trace_call)
     158              :         #define sys_port_trace_type_mask_k_heap_sys(trace_call)
     159              : #endif
     160              : 
     161              : #if defined(CONFIG_TRACING_MEMORY_SLAB)
     162              :         #define sys_port_trace_type_mask_k_mem_slab(trace_call) trace_call
     163              : #else
     164              :         #define sys_port_trace_type_mask_k_mem_slab(trace_call)
     165              : #endif
     166              : 
     167              : #if defined(CONFIG_TRACING_TIMER)
     168              :         #define sys_port_trace_type_mask_k_timer(trace_call) trace_call
     169              : #else
     170              :         #define sys_port_trace_type_mask_k_timer(trace_call)
     171              : #endif
     172              : 
     173              : #if defined(CONFIG_TRACING_EVENT)
     174              :         #define sys_port_trace_type_mask_k_event(trace_call) trace_call
     175              : #else
     176              :         #define sys_port_trace_type_mask_k_event(trace_call)
     177              : #endif
     178              : 
     179              : #ifndef CONFIG_TRACING_POLLING
     180              :         #define sys_port_trace_k_poll_api_is_disabled 1
     181              :         #define sys_port_trace_k_work_poll_is_disabled 1
     182              : #endif
     183              : 
     184              : #ifndef CONFIG_TRACING_PM
     185              :         #define sys_port_trace_pm_is_disabled 1
     186              : #endif
     187              : 
     188              : #if defined(CONFIG_TRACING_NET_SOCKETS)
     189              :         #define sys_port_trace_type_mask_socket(trace_call) trace_call
     190              : #else
     191              :         #define sys_port_trace_type_mask_socket(trace_call)
     192              : #endif
     193              : 
     194              : #if defined(CONFIG_TRACING_NET_CORE)
     195              :         #define sys_port_trace_type_mask_net(trace_call) trace_call
     196              : #else
     197              :         #define sys_port_trace_type_mask_net(trace_call)
     198              : #endif
     199              : 
     200              : /*
     201              :  * We cannot positively enumerate all traced APIs, as applications may trace
     202              :  * arbitrary custom APIs we know nothing about. Therefore we demand that tracing
     203              :  * of an API must be actively disabled.
     204              :  *
     205              :  * This contrasts with object tracing/tracking as all traceable objects are well
     206              :  * known, see the SYS_PORT_TRACING_TYPE_MASK approach below.
     207              :  */
     208              : #define _SYS_PORT_TRACE_IS_DISABLED(type) sys_port_trace_##type##_is_disabled
     209              : #define _SYS_PORT_TRACE_WRAP(func, ...) do { func(__VA_ARGS__); } while (false)
     210              : #define _SYS_PORT_TRACE_IF_NOT_DISABLED(type, func, ...)                                           \
     211              :         COND_CODE_1(_SYS_PORT_TRACE_IS_DISABLED(type), (),                                         \
     212              :                     (_SYS_PORT_TRACE_WRAP(func, __VA_ARGS__)))
     213              : 
     214              : /** @endcond */
     215              : 
     216              : /**
     217              :  * @brief Checks if an object type should be traced or not.
     218              :  *
     219              :  * @param type Tracing event type/object
     220              :  * @param trace_call Tracing call
     221              :  */
     222            1 : #define SYS_PORT_TRACING_TYPE_MASK(type, trace_call) \
     223              :         _SYS_PORT_TRACING_TYPE_MASK(type)(trace_call)
     224              : 
     225              : /**
     226              :  * @brief Tracing macro for function calls which are not directly
     227              :  * associated with a specific type of object.
     228              :  *
     229              :  * @param type Type of tracing event or object type
     230              :  * @param func Name of the function responsible for the call. This does not need to exactly
     231              :  * match the name of the function but should rather match what the user called in case of
     232              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     233              :  * @param ... Additional parameters relevant to the tracing call
     234              :  */
     235            1 : #define SYS_PORT_TRACING_FUNC(type, func, ...)                                                     \
     236              :         _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC(type, func), __VA_ARGS__)
     237              : 
     238              : /**
     239              :  * @brief Tracing macro for the entry into a function that might or might not return
     240              :  * a value.
     241              :  *
     242              :  * @param type Type of tracing event or object type
     243              :  * @param func Name of the function responsible for the call. This does not need to exactly
     244              :  * match the name of the function but should rather match what the user called in case of
     245              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     246              :  * @param ... Additional parameters relevant to the tracing call
     247              :  */
     248            1 : #define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...)                                               \
     249              :         _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_ENTER(type, func), __VA_ARGS__)
     250              : 
     251              : /**
     252              :  * @brief Tracing macro for when a function blocks during its execution.
     253              :  *
     254              :  * @param type Type of tracing event or object type
     255              :  * @param func Name of the function responsible for the call. This does not need to exactly
     256              :  * match the name of the function but should rather match what the user called in case of
     257              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     258              :  * @param ... Additional parameters relevant to the tracing call
     259              :  */
     260            1 : #define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...)                                            \
     261              :         _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_BLOCKING(type, func),         \
     262              :                                         __VA_ARGS__)
     263              : 
     264              : /**
     265              :  * @brief Tracing macro for when a function ends its execution. Potential return values
     266              :  * can be given as additional arguments.
     267              :  *
     268              :  * @param type Type of tracing event or object type
     269              :  * @param func Name of the function responsible for the call. This does not need to exactly
     270              :  * match the name of the function but should rather match what the user called in case of
     271              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     272              :  * @param ... Additional parameters relevant to the tracing call
     273              :  */
     274            1 : #define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...)                                                \
     275              :         _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_EXIT(type, func), __VA_ARGS__)
     276              : 
     277              : /**
     278              :  * @brief Tracing macro for the initialization of an object.
     279              :  *
     280              :  * @param obj_type The type of object associated with the call (k_thread, k_sem, k_mutex etc.)
     281              :  * @param obj Object
     282              :  */
     283            1 : #define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) \
     284              :         do { \
     285              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     286              :                         _SYS_PORT_TRACING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
     287              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     288              :                         _SYS_PORT_TRACKING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
     289              :         } while (false)
     290              : 
     291              : /**
     292              :  * @brief Tracing macro for simple object function calls often without returns or branching.
     293              :  *
     294              :  * @param obj_type The type of object associated with the call (k_thread, k_sem, k_mutex etc.)
     295              :  * @param func Name of the function responsible for the call. This does not need to exactly
     296              :  * match the name of the function but should rather match what the user called in case of
     297              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     298              :  * @param obj Object
     299              :  * @param ... Additional parameters relevant to the tracing call
     300              :  */
     301            1 : #define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) \
     302              :         do { \
     303              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     304              :                         _SYS_PORT_TRACING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
     305              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     306              :                         _SYS_PORT_TRACKING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
     307              :         } while (false)
     308              : 
     309              : /**
     310              :  * @brief Tracing macro for the entry into a function that might or might not return
     311              :  * a value.
     312              :  *
     313              :  * @param obj_type The type of object associated with the call (k_thread, k_sem, k_mutex etc.)
     314              :  * @param func Name of the function responsible for the call. This does not need to exactly
     315              :  * match the name of the function but should rather match what the user called in case of
     316              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     317              :  * @param obj Object
     318              :  * @param ... Additional parameters relevant to the tracing call
     319              :  */
     320            1 : #define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) \
     321              :         do { \
     322              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     323              :                         _SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func)(obj, ##__VA_ARGS__)); \
     324              :         } while (false)
     325              : 
     326              : /**
     327              :  * @brief Tracing macro for when a function blocks during its execution.
     328              :  *
     329              :  * @param obj_type The type of object associated with the call (k_thread, k_sem, k_mutex etc.)
     330              :  * @param func Name of the function responsible for the call. This does not need to exactly
     331              :  * match the name of the function but should rather match what the user called in case of
     332              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     333              :  * @param obj Object
     334              :  * @param timeout Timeout
     335              :  * @param ... Additional parameters relevant to the tracing call
     336              :  */
     337            1 : #define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, timeout, ...) \
     338              :         do { \
     339              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     340              :                         _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func) \
     341              :                         (obj, timeout, ##__VA_ARGS__)); \
     342              :         } while (false)
     343              : 
     344              : /**
     345              :  * @brief Tracing macro for when a function ends its execution. Potential return values
     346              :  * can be given as additional arguments.
     347              :  *
     348              :  * @param obj_type The type of object associated with the call (k_thread, k_sem, k_mutex etc.)
     349              :  * @param func Name of the function responsible for the call. This does not need to exactly
     350              :  * match the name of the function but should rather match what the user called in case of
     351              :  * system calls etc. That is, we can often omit the z_vrfy/z_impl part of the name.
     352              :  * @param obj Object
     353              :  * @param ... Additional parameters relevant to the tracing call
     354              :  */
     355            1 : #define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) \
     356              :         do { \
     357              :                 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
     358              :                         _SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func)(obj, ##__VA_ARGS__)); \
     359              :         } while (false)
     360              : 
     361              : /**
     362              :  * @brief Field added to kernel objects so they are tracked.
     363              :  *
     364              :  * @param type Type of object being tracked (k_thread, k_sem, etc.)
     365              :  */
     366            1 : #define SYS_PORT_TRACING_TRACKING_FIELD(type) \
     367              :         SYS_PORT_TRACING_TYPE_MASK(type, struct type *_obj_track_next;)
     368              : 
     369              : /** @} */ /* end of subsys_tracing_macros */
     370              : 
     371              : #endif /* CONFIG_TRACING */
     372              : 
     373              : #endif /* ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_ */
        

Generated by: LCOV version 2.0-1