LCOV - code coverage report
Current view: top level - zephyr/tracing - tracing_macros.h Hit Total Coverage
Test: new.info Lines: 11 12 91.7 %
Date: 2025-01-02 12:14:04

          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 1.14