6#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_MSG_H_ 
    7#define ZEPHYR_INCLUDE_LOGGING_LOG_MSG_H_ 
   19#define alloca __builtin_alloca 
   29#define LOG_MSG2_DEBUG 0 
   30#define LOG_MSG2_DBG(...) IF_ENABLED(LOG_MSG2_DEBUG, (printk(__VA_ARGS__))) 
   32#ifdef CONFIG_LOG_TIMESTAMP_64BIT 
   45#define Z_LOG_MSG2_LOG 0 
   47#define LOG_MSG2_GENERIC_HDR \ 
   71#if (INTPTR_MAX > INT32_MAX) && !CONFIG_LOG_TIMESTAMP_64BIT 
   81#define Z_LOG_MSG2_ALIGNMENT CBPRINTF_PACKAGE_ALIGNMENT 
   83#define Z_LOG_MSG2_PADDING \ 
   84        ((sizeof(struct log_msg_hdr) % Z_LOG_MSG2_ALIGNMENT) > 0 ? \ 
   85        (Z_LOG_MSG2_ALIGNMENT - (sizeof(struct log_msg_hdr) % Z_LOG_MSG2_ALIGNMENT)) : \ 
  100BUILD_ASSERT(
sizeof(
struct log_msg) % Z_LOG_MSG2_ALIGNMENT == 0,
 
  101             "Log msg size must aligned");
 
  125        Z_LOG_MSG2_MODE_RUNTIME,
 
  130        Z_LOG_MSG2_MODE_FROM_STACK,
 
  136        Z_LOG_MSG2_MODE_ZERO_COPY,
 
  139#define Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, _plen, _dlen) \ 
  143        .type = Z_LOG_MSG2_LOG, \ 
  144        .domain = _domain_id, \ 
  146        .package_len = _plen, \ 
  151#define Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt) \ 
  152        (CBPRINTF_PACKAGE_FIRST_RO_STR_CNT(_cstr_cnt) | \ 
  153        (IS_ENABLED(CONFIG_LOG_MSG_APPEND_RO_STRING_LOC) ? \ 
  154         CBPRINTF_PACKAGE_ADD_STRING_IDXS : 0)) 
  156#ifdef CONFIG_LOG_USE_VLA 
  157#define Z_LOG_MSG2_ON_STACK_ALLOC(ptr, len) \ 
  158        long long _ll_buf[ceiling_fraction(len, sizeof(long long))]; \ 
  159        long double _ld_buf[ceiling_fraction(len, sizeof(long double))]; \ 
  160        ptr = (sizeof(long double) == Z_LOG_MSG2_ALIGNMENT) ? \ 
  161                        (struct log_msg *)_ld_buf : (struct log_msg *)_ll_buf; \ 
  162        if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \ 
  164                memset(ptr, 0, len); \ 
  172#define Z_LOG_MSG2_ON_STACK_ALLOC(ptr, len) \ 
  173        long long _ll_buf32[32 / sizeof(long long)]; \ 
  174        long long _ll_buf48[48 / sizeof(long long)]; \ 
  175        long long _ll_buf64[64 / sizeof(long long)]; \ 
  176        long long _ll_buf128[128 / sizeof(long long)]; \ 
  177        long long _ll_buf256[256 / sizeof(long long)]; \ 
  178        long double _ld_buf32[32 / sizeof(long double)]; \ 
  179        long double _ld_buf48[48 / sizeof(long double)]; \ 
  180        long double _ld_buf64[64 / sizeof(long double)]; \ 
  181        long double _ld_buf128[128 / sizeof(long double)]; \ 
  182        long double _ld_buf256[256 / sizeof(long double)]; \ 
  183        if (sizeof(long double) == Z_LOG_MSG2_ALIGNMENT) { \ 
  184                ptr = (len > 128) ? (struct log_msg *)_ld_buf256 : \ 
  185                        ((len > 64) ? (struct log_msg *)_ld_buf128 : \ 
  186                        ((len > 48) ? (struct log_msg *)_ld_buf64 : \ 
  187                        ((len > 32) ? (struct log_msg *)_ld_buf48 : \ 
  188                                      (struct log_msg *)_ld_buf32)));\ 
  190                ptr = (len > 128) ? (struct log_msg *)_ll_buf256 : \ 
  191                        ((len > 64) ? (struct log_msg *)_ll_buf128 : \ 
  192                        ((len > 48) ? (struct log_msg *)_ll_buf64 : \ 
  193                        ((len > 32) ? (struct log_msg *)_ll_buf48 : \ 
  194                                      (struct log_msg *)_ll_buf32)));\ 
  196        if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \ 
  198                memset(ptr, 0, len); \ 
  202#define Z_LOG_MSG2_ALIGN_OFFSET \ 
  203        offsetof(struct log_msg, data) 
  205#define Z_LOG_MSG2_LEN(pkg_len, data_len) \ 
  206        (offsetof(struct log_msg, data) + pkg_len + (data_len)) 
  208#define Z_LOG_MSG2_ALIGNED_WLEN(pkg_len, data_len) \ 
  209        ceiling_fraction(ROUND_UP(Z_LOG_MSG2_LEN(pkg_len, data_len), \ 
  210                                  Z_LOG_MSG2_ALIGNMENT), \ 
  222#define Z_LOG_ARM64_VLA_PROTECT() compiler_barrier() 
  224#define Z_LOG_MSG2_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, _dlen, ...) \ 
  227        uint32_t flags = Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt) | \ 
  228                         CBPRINTF_PACKAGE_ADD_RW_STR_POS; \ 
  229        if (GET_ARG_N(1, __VA_ARGS__) == NULL) { \ 
  232                CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG2_ALIGN_OFFSET, flags, \ 
  235        struct log_msg *_msg; \ 
  236        Z_LOG_MSG2_ON_STACK_ALLOC(_msg, Z_LOG_MSG2_LEN(_plen, 0)); \ 
  237        Z_LOG_ARM64_VLA_PROTECT(); \ 
  239                CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, \ 
  240                                        _plen, Z_LOG_MSG2_ALIGN_OFFSET, flags, \ 
  243        struct log_msg_desc _desc = \ 
  244                Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, \ 
  245                                           (uint32_t)_plen, _dlen); \ 
  246        LOG_MSG2_DBG("creating message on stack: package len: %d, data len: %d\n", \
 
  247                        _plen, (int)(_dlen)); \
 
  248        z_log_msg_static_create((void *)_source, _desc, _msg->data, _data); \
 
  251#ifdef CONFIG_LOG_SPEED 
  252#define Z_LOG_MSG2_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, _level, ...) do { \ 
  254        CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG2_ALIGN_OFFSET, \ 
  255                                Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt), \ 
  257        size_t _msg_wlen = Z_LOG_MSG2_ALIGNED_WLEN(_plen, 0); \ 
  258        struct log_msg *_msg = z_log_msg_alloc(_msg_wlen); \ 
  259        struct log_msg_desc _desc = \ 
  260                Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, (uint32_t)_plen, 0); \ 
  261        LOG_MSG2_DBG("creating message zero copy: package len: %d, msg: %p\n", \
 
  264                CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, _plen, \
 
  265                                        Z_LOG_MSG2_ALIGN_OFFSET, \
 
  266                                        Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt), \
 
  269        z_log_msg_finalize(_msg, (void *)_source, _desc, NULL); \
 
  275#define Z_LOG_MSG2_SIMPLE_CREATE(...) 
  281#define Z_LOG_FMT_ARGS_2(_name, ...) \ 
  282        COND_CODE_1(CONFIG_LOG_FMT_SECTION, \ 
  283                (COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \ 
  284                   (_name), (_name, GET_ARGS_LESS_N(1, __VA_ARGS__)))), \ 
  296#define Z_LOG_FMT_ARGS(_name, ...) \ 
  297        COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \ 
  299                (Z_LOG_FMT_ARGS_2(_name, ##__VA_ARGS__))) 
  301#if defined(CONFIG_LOG_USE_TAGGED_ARGUMENTS) 
  303#define Z_LOG_FMT_TAGGED_ARGS_2(_name, ...) \ 
  304        COND_CODE_1(CONFIG_LOG_FMT_SECTION, \ 
  305                    (_name, Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \ 
  306                                                   GET_ARGS_LESS_N(1, __VA_ARGS__))), \ 
  307                    (GET_ARG_N(1, __VA_ARGS__), \ 
  308                     Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \ 
  309                                            GET_ARGS_LESS_N(1, __VA_ARGS__)))) 
  321#define Z_LOG_FMT_TAGGED_ARGS(_name, ...) \ 
  322        COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \ 
  323                (Z_CBPRINTF_TAGGED_ARGS(0)), \ 
  324                (Z_LOG_FMT_TAGGED_ARGS_2(_name, ##__VA_ARGS__))) 
  326#define Z_LOG_FMT_RUNTIME_ARGS(...) \ 
  327        Z_LOG_FMT_TAGGED_ARGS(__VA_ARGS__) 
  331#define Z_LOG_FMT_RUNTIME_ARGS(...) \ 
  332        Z_LOG_FMT_ARGS(__VA_ARGS__) 
  339#define Z_LOG_MSG2_STR_VAR_IN_SECTION(_name, ...) \ 
  340        COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \ 
  342                    (static const char _name[] \ 
  343                        __attribute__((__section__(".log_strings"))) = \
 
  344                        GET_ARG_N(1, __VA_ARGS__);))
 
  353#define Z_LOG_MSG2_STR_VAR(_name, ...) \ 
  354        IF_ENABLED(CONFIG_LOG_FMT_SECTION, \ 
  355                   (Z_LOG_MSG2_STR_VAR_IN_SECTION(_name, ##__VA_ARGS__))) 
  396#if defined(CONFIG_LOG_ALWAYS_RUNTIME) || \ 
  397        (!defined(CONFIG_LOG) && \ 
  398                (!TOOLCHAIN_HAS_PRAGMA_DIAG || !TOOLCHAIN_HAS_C_AUTO_TYPE)) 
  399#define Z_LOG_MSG2_CREATE2(_try_0cpy, _mode,  _cstr_cnt, _domain_id, _source,\ 
  400                          _level, _data, _dlen, ...) \ 
  402        Z_LOG_MSG2_STR_VAR(_fmt, ##__VA_ARGS__) \ 
  403        z_log_msg_runtime_create(_domain_id, (void *)_source, \ 
  404                                  _level, (uint8_t *)_data, _dlen,\ 
  405                                  Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt) | \ 
  406                                  (IS_ENABLED(CONFIG_LOG_USE_TAGGED_ARGUMENTS) ? \ 
  407                                   CBPRINTF_PACKAGE_ARGS_ARE_TAGGED : 0), \ 
  408                                  Z_LOG_FMT_RUNTIME_ARGS(_fmt, ##__VA_ARGS__));\ 
  409        _mode = Z_LOG_MSG2_MODE_RUNTIME; \ 
  412#define Z_LOG_MSG2_CREATE3(_try_0cpy, _mode,  _cstr_cnt, _domain_id, _source,\ 
  413                          _level, _data, _dlen, ...) \ 
  415        Z_LOG_MSG2_STR_VAR(_fmt, ##__VA_ARGS__); \ 
  416        bool has_rw_str = CBPRINTF_MUST_RUNTIME_PACKAGE( \ 
  417                                        Z_LOG_MSG2_CBPRINTF_FLAGS(_cstr_cnt), \ 
  419        if (IS_ENABLED(CONFIG_LOG_SPEED) && _try_0cpy && ((_dlen) == 0) && !has_rw_str) {\ 
  420                LOG_MSG2_DBG("create zero-copy message\n");\
 
  421                Z_LOG_MSG2_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, \
 
  422                                        _level, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
 
  423                _mode = Z_LOG_MSG2_MODE_ZERO_COPY; \
 
  425                LOG_MSG2_DBG("create on stack message\n");\
 
  426                Z_LOG_MSG2_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, \
 
  427                                        _dlen, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
 
  428                _mode = Z_LOG_MSG2_MODE_FROM_STACK; \
 
  433#if defined(__cplusplus) 
  434#define Z_AUTO_TYPE auto 
  436#define Z_AUTO_TYPE __auto_type 
  442#define Z_LOG_LOCAL_ARG_NAME(idx, arg) COND_CODE_0(idx, (arg), (_v##idx)) 
  445#define Z_LOG_LOCAL_ARG_CREATE(idx, arg) \ 
  446        COND_CODE_0(idx, (), (Z_AUTO_TYPE Z_LOG_LOCAL_ARG_NAME(idx, arg) = (arg) + 0)) 
  452#define Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, _cstr_cnt,  _domain_id, _source, \ 
  453                           _level, _data, _dlen, ...) \ 
  455        _Pragma("GCC diagnostic push") \
 
  456        _Pragma("GCC diagnostic ignored \"-Wpointer-arith\"") \
 
  457        FOR_EACH_IDX(Z_LOG_LOCAL_ARG_CREATE, (;), __VA_ARGS__); \
 
  458        _Pragma("GCC diagnostic pop") \
 
  459        Z_LOG_MSG2_CREATE3(_try_0cpy, _mode,  _cstr_cnt, _domain_id, _source,\
 
  460                           _level, _data, _dlen, \
 
  461                           FOR_EACH_IDX(Z_LOG_LOCAL_ARG_NAME, (,), __VA_ARGS__)); \
 
  468#define Z_LOG_MSG2_CREATE(_try_0cpy, _mode,  _domain_id, _source,\ 
  469                          _level, _data, _dlen, ...) \ 
  470        Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, UTIL_CAT(Z_LOG_FUNC_PREFIX_, _level), \ 
  471                           _domain_id, _source, _level, _data, _dlen, \ 
  472                           Z_LOG_STR(_level, __VA_ARGS__)) 
  495void z_log_msg_finalize(
struct log_msg *
msg, 
const void *source,
 
  508__syscall 
void z_log_msg_static_create(
const void *source,
 
  533__syscall 
void z_log_msg_runtime_vcreate(
uint8_t domain_id, 
const void *source,
 
  535                                          size_t dlen, 
uint32_t package_flags,
 
  560static inline void z_log_msg_runtime_create(
uint8_t domain_id,
 
  563                                             size_t dlen, 
uint32_t package_flags,
 
  564                                             const char *fmt, ...)
 
  569        z_log_msg_runtime_vcreate(domain_id, source, level,
 
  570                                   data, dlen, package_flags, fmt, ap);
 
  576        return msg->generic.type == Z_LOG_MSG2_LOG;
 
  600        if (z_log_item_is_msg(generic_msg)) {
 
  617        return msg->hdr.desc.domain;
 
  628        return msg->hdr.desc.level;
 
  639        return msg->hdr.source;
 
  650        return msg->hdr.timestamp;
 
  663        *len = 
msg->hdr.desc.data_len;
 
  665        return msg->data + 
msg->hdr.desc.package_len;
 
  678        *len = 
msg->hdr.desc.package_len;
 
static const void * log_msg_get_source(struct log_msg *msg)
Get message source data.
Definition: log_msg.h:637
 
#define LOG_MSG2_GENERIC_HDR
Definition: log_msg.h:47
 
static uint8_t log_msg_get_level(struct log_msg *msg)
Get log message level.
Definition: log_msg.h:626
 
static uint8_t log_msg_get_domain(struct log_msg *msg)
Get log message domain ID.
Definition: log_msg.h:615
 
static uint32_t log_msg_generic_get_wlen(const union mpsc_pbuf_generic *item)
Get length of the log item.
Definition: log_msg.h:596
 
static uint32_t log_msg_get_total_wlen(const struct log_msg_desc desc)
Get total length (in 32 bit words) of a log message.
Definition: log_msg.h:585
 
static uint8_t * log_msg_get_package(struct log_msg *msg, size_t *len)
Get string package.
Definition: log_msg.h:676
 
static log_timestamp_t log_msg_get_timestamp(struct log_msg *msg)
Get timestamp.
Definition: log_msg.h:648
 
static uint8_t * log_msg_get_data(struct log_msg *msg, size_t *len)
Get data buffer.
Definition: log_msg.h:661
 
uint32_t log_timestamp_t
Definition: log_msg.h:35
 
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
 
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
 
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
 
uint32_t domain
Definition: log_msg.h:53
 
uint32_t package_len
Definition: log_msg.h:55
 
uint32_t level
Definition: log_msg.h:54
 
uint32_t reserved
Definition: log_msg.h:57
 
uint32_t data_len
Definition: log_msg.h:56
 
Definition: log_msg.h:107
 
struct log_msg_desc desc
Definition: log_msg.h:67
 
log_timestamp_t timestamp
Definition: log_msg.h:76
 
const void * source
Definition: log_msg.h:75
 
uint8_t data[]
Definition: log_msg.h:94
 
uint8_t padding[((sizeof(struct log_msg_hdr) % CBPRINTF_PACKAGE_ALIGNMENT) > 0 ?(CBPRINTF_PACKAGE_ALIGNMENT -(sizeof(struct log_msg_hdr) % CBPRINTF_PACKAGE_ALIGNMENT)) :0)]
Definition: log_msg.h:93
 
struct log_msg_hdr hdr
Definition: log_msg.h:89
 
Constant data associated with the source of log messages.
Definition: log_instance.h:16
 
Dynamic data associated with the source of log messages.
Definition: log_instance.h:29
 
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
 
static void msg(uint64_t c64)
Definition: main.c:17
 
Definition: log_msg.h:111
 
union mpsc_pbuf_generic buf
Definition: log_msg.h:112
 
struct log_msg log
Definition: log_msg.h:114
 
struct log_msg_generic_hdr generic
Definition: log_msg.h:113
 
const struct log_source_const_data * fixed
Definition: log_msg.h:61
 
struct log_source_dynamic_data * dynamic
Definition: log_msg.h:62
 
void * raw
Definition: log_msg.h:63
 
Generic packet header.
Definition: mpsc_packet.h:49