6#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_MSG_H_
7#define ZEPHYR_INCLUDE_LOGGING_LOG_MSG_H_
20#define alloca __builtin_alloca
30#define LOG_MSG_DEBUG 0
31#define LOG_MSG_DBG(...) IF_ENABLED(LOG_MSG_DEBUG, (printk(__VA_ARGS__)))
33#ifdef CONFIG_LOG_TIMESTAMP_64BIT
46#define Z_LOG_MSG_LOG 0
48#define Z_LOG_MSG_PACKAGE_BITS 11
50#define Z_LOG_MSG_MAX_PACKAGE BIT_MASK(Z_LOG_MSG_PACKAGE_BITS)
52#define LOG_MSG_GENERIC_HDR \
75#if (INTPTR_MAX > INT32_MAX) && !defined(CONFIG_LOG_TIMESTAMP_64BIT)
82#if defined(CONFIG_LOG_THREAD_ID_PREFIX)
85#if defined(CONFIG_LOG_CORE_ID_PREFIX)
90#define Z_LOG_MSG_ALIGNMENT CBPRINTF_PACKAGE_ALIGNMENT
92#define Z_LOG_MSG_PADDING \
93 ((sizeof(struct log_msg_hdr) % Z_LOG_MSG_ALIGNMENT) > 0 ? \
94 (Z_LOG_MSG_ALIGNMENT - (sizeof(struct log_msg_hdr) % Z_LOG_MSG_ALIGNMENT)) : \
110 "Log msg size must aligned");
134 Z_LOG_MSG_MODE_RUNTIME,
139 Z_LOG_MSG_MODE_FROM_STACK,
145 Z_LOG_MSG_MODE_ZERO_COPY,
148 Z_LOG_MSG_MODE_SIMPLE,
151#define Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, _plen, _dlen) \
155 .type = Z_LOG_MSG_LOG, \
156 .domain = (_domain_id), \
158 .package_len = (_plen), \
159 .data_len = (_dlen), \
162#define Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) \
163 (CBPRINTF_PACKAGE_FIRST_RO_STR_CNT(_cstr_cnt) | \
164 (IS_ENABLED(CONFIG_LOG_MSG_APPEND_RO_STRING_LOC) ? \
165 CBPRINTF_PACKAGE_ADD_STRING_IDXS : 0))
167#ifdef CONFIG_LOG_USE_VLA
168#define Z_LOG_MSG_ON_STACK_ALLOC(ptr, len) \
169 long long _ll_buf[DIV_ROUND_UP(len, sizeof(long long))]; \
170 long double _ld_buf[DIV_ROUND_UP(len, sizeof(long double))]; \
171 (ptr) = (sizeof(long double) == Z_LOG_MSG_ALIGNMENT) ? \
172 (struct log_msg *)_ld_buf : (struct log_msg *)_ll_buf; \
173 if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
175 memset((ptr), 0, (len)); \
183#define Z_LOG_MSG_ON_STACK_ALLOC(ptr, len) \
184 long long _ll_buf32[32 / sizeof(long long)]; \
185 long long _ll_buf48[48 / sizeof(long long)]; \
186 long long _ll_buf64[64 / sizeof(long long)]; \
187 long long _ll_buf128[128 / sizeof(long long)]; \
188 long long _ll_buf256[256 / sizeof(long long)]; \
189 long double _ld_buf32[32 / sizeof(long double)]; \
190 long double _ld_buf48[48 / sizeof(long double)]; \
191 long double _ld_buf64[64 / sizeof(long double)]; \
192 long double _ld_buf128[128 / sizeof(long double)]; \
193 long double _ld_buf256[256 / sizeof(long double)]; \
194 if (sizeof(long double) == Z_LOG_MSG_ALIGNMENT) { \
195 ptr = (len > 128) ? (struct log_msg *)_ld_buf256 : \
196 ((len > 64) ? (struct log_msg *)_ld_buf128 : \
197 ((len > 48) ? (struct log_msg *)_ld_buf64 : \
198 ((len > 32) ? (struct log_msg *)_ld_buf48 : \
199 (struct log_msg *)_ld_buf32)));\
201 ptr = (len > 128) ? (struct log_msg *)_ll_buf256 : \
202 ((len > 64) ? (struct log_msg *)_ll_buf128 : \
203 ((len > 48) ? (struct log_msg *)_ll_buf64 : \
204 ((len > 32) ? (struct log_msg *)_ll_buf48 : \
205 (struct log_msg *)_ll_buf32)));\
207 if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
209 memset((ptr), 0, (len)); \
213#define Z_LOG_MSG_ALIGN_OFFSET \
214 offsetof(struct log_msg, data)
216#define Z_LOG_MSG_LEN(pkg_len, data_len) \
217 (offsetof(struct log_msg, data) + (pkg_len) + (data_len))
219#define Z_LOG_MSG_ALIGNED_WLEN(pkg_len, data_len) \
220 DIV_ROUND_UP(ROUND_UP(Z_LOG_MSG_LEN(pkg_len, data_len), \
221 Z_LOG_MSG_ALIGNMENT), \
233#define Z_LOG_ARM64_VLA_PROTECT() compiler_barrier()
235#define _LOG_MSG_SIMPLE_XXXX0 1
236#define _LOG_MSG_SIMPLE_XXXX1 1
237#define _LOG_MSG_SIMPLE_XXXX2 1
240#define LOG_MSG_SIMPLE_ARG_CNT_CHECK(...) \
241 COND_CODE_1(UTIL_CAT(_LOG_MSG_SIMPLE_XXXX, NUM_VA_ARGS_LESS_1(__VA_ARGS__)), (1), (0))
244#define LOG_MSG_SIMPLE_ARG_TYPE_CHECK_0(fmt) 1
245#define LOG_MSG_SIMPLE_ARG_TYPE_CHECK_1(fmt, arg) Z_CBPRINTF_IS_WORD_NUM(arg)
246#define LOG_MSG_SIMPLE_ARG_TYPE_CHECK_2(fmt, arg0, arg1) \
247 Z_CBPRINTF_IS_WORD_NUM(arg0) && Z_CBPRINTF_IS_WORD_NUM(arg1)
253#define LOG_MSG_SIMPLE_ARG_TYPE_CHECK(...) \
254 UTIL_CAT(LOG_MSG_SIMPLE_ARG_TYPE_CHECK_, NUM_VA_ARGS_LESS_1(__VA_ARGS__))(__VA_ARGS__)
268#define LOG_MSG_SIMPLE_CHECK(...) \
269 COND_CODE_1(CONFIG_64BIT, (0), (\
270 COND_CODE_1(LOG_MSG_SIMPLE_ARG_CNT_CHECK(__VA_ARGS__), ( \
271 LOG_MSG_SIMPLE_ARG_TYPE_CHECK(__VA_ARGS__)), (0))))
274#define Z_LOG_MSG_SIMPLE_CREATE_1(_source, _level, ...) \
275 z_log_msg_simple_create_1(_source, _level, GET_ARG_N(1, __VA_ARGS__), \
276 (uint32_t)(uintptr_t)GET_ARG_N(2, __VA_ARGS__))
280#define Z_LOG_MSG_SIMPLE_CREATE_2(_source, _level, ...) \
281 z_log_msg_simple_create_2(_source, _level, GET_ARG_N(1, __VA_ARGS__), \
282 (uint32_t)(uintptr_t)GET_ARG_N(2, __VA_ARGS__), \
283 (uint32_t)(uintptr_t)GET_ARG_N(3, __VA_ARGS__))
294#define Z_LOG_MSG_SIMPLE_FUNC2(arg_cnt, _source, _level, ...) \
295 COND_CODE_0(arg_cnt, \
296 (z_log_msg_simple_create_0(_source, _level, GET_ARG_N(1, __VA_ARGS__))), \
297 (COND_CODE_1(arg_cnt, ( \
298 Z_LOG_MSG_SIMPLE_CREATE_1(_source, _level, __VA_ARGS__, dummy) \
300 Z_LOG_MSG_SIMPLE_CREATE_2(_source, _level, __VA_ARGS__, dummy, dummy) \
313#define LOG_MSG_SIMPLE_FUNC(_source, _level, ...) \
314 Z_LOG_MSG_SIMPLE_FUNC2(NUM_VA_ARGS_LESS_1(__VA_ARGS__), _source, _level, __VA_ARGS__)
326#define Z_LOG_MSG_SIMPLE_ARGS_CREATE(_domain_id, _source, _level, ...) \
327 IF_ENABLED(LOG_MSG_SIMPLE_ARG_CNT_CHECK(__VA_ARGS__), (\
328 LOG_MSG_SIMPLE_FUNC(_source, _level, __VA_ARGS__); \
331#define Z_LOG_MSG_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, _dlen, ...) \
334 uint32_t _options = Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) | \
335 CBPRINTF_PACKAGE_ADD_RW_STR_POS; \
336 if (is_null_no_warn((void *)GET_ARG_N(1, __VA_ARGS__))) { \
339 CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG_ALIGN_OFFSET, _options, \
348 struct log_msg *_msg; \
349 Z_LOG_MSG_ON_STACK_ALLOC(_msg, Z_LOG_MSG_LEN(_plen, 0)); \
350 Z_LOG_ARM64_VLA_PROTECT(); \
352 CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, \
353 _plen, Z_LOG_MSG_ALIGN_OFFSET, _options, \
356 struct log_msg_desc _desc = \
357 Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, \
358 (uint32_t)_plen, _dlen); \
359 LOG_MSG_DBG("creating message on stack: package len: %d, data len: %d\n", \
360 _plen, (int)(_dlen)); \
361 z_log_msg_static_create((void *)(_source), _desc, _msg->data, (_data)); \
364#ifdef CONFIG_LOG_SPEED
365#define Z_LOG_MSG_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, _level, ...) do { \
367 CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG_ALIGN_OFFSET, \
368 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
370 size_t _msg_wlen = Z_LOG_MSG_ALIGNED_WLEN(_plen, 0); \
371 struct log_msg *_msg = z_log_msg_alloc(_msg_wlen); \
372 struct log_msg_desc _desc = \
373 Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, (uint32_t)_plen, 0); \
374 LOG_MSG_DBG("creating message zero copy: package len: %d, msg: %p\n", \
377 CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, _plen, \
378 Z_LOG_MSG_ALIGN_OFFSET, \
379 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
382 z_log_msg_finalize(_msg, (void *)_source, _desc, NULL); \
388#define Z_LOG_MSG_SIMPLE_CREATE(...)
394#define Z_LOG_FMT_ARGS_2(_name, ...) \
395 COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
396 (COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
397 (_name), (_name, GET_ARGS_LESS_N(1, __VA_ARGS__)))), \
409#define Z_LOG_FMT_ARGS(_name, ...) \
410 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
412 (Z_LOG_FMT_ARGS_2(_name, ##__VA_ARGS__)))
414#if defined(CONFIG_LOG_USE_TAGGED_ARGUMENTS)
416#define Z_LOG_FMT_TAGGED_ARGS_2(_name, ...) \
417 COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
418 (_name, Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
419 GET_ARGS_LESS_N(1, __VA_ARGS__))), \
420 (GET_ARG_N(1, __VA_ARGS__), \
421 Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
422 GET_ARGS_LESS_N(1, __VA_ARGS__))))
434#define Z_LOG_FMT_TAGGED_ARGS(_name, ...) \
435 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
436 (Z_CBPRINTF_TAGGED_ARGS(0)), \
437 (Z_LOG_FMT_TAGGED_ARGS_2(_name, ##__VA_ARGS__)))
439#define Z_LOG_FMT_RUNTIME_ARGS(...) \
440 Z_LOG_FMT_TAGGED_ARGS(__VA_ARGS__)
444#define Z_LOG_FMT_RUNTIME_ARGS(...) \
445 Z_LOG_FMT_ARGS(__VA_ARGS__)
452#define Z_LOG_MSG_STR_VAR_IN_SECTION(_name, ...) \
453 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
455 (static const char _name[] \
456 __in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
457 GET_ARG_N(1, __VA_ARGS__);))
466#define Z_LOG_MSG_STR_VAR(_name, ...) \
467 IF_ENABLED(CONFIG_LOG_FMT_SECTION, \
468 (Z_LOG_MSG_STR_VAR_IN_SECTION(_name, ##__VA_ARGS__)))
509#if defined(CONFIG_LOG_ALWAYS_RUNTIME) || !defined(CONFIG_LOG)
510#define Z_LOG_MSG_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
511 _level, _data, _dlen, ...) \
513 Z_LOG_MSG_STR_VAR(_fmt, ##__VA_ARGS__) \
514 z_log_msg_runtime_create((_domain_id), (void *)(_source), \
515 (_level), (uint8_t *)(_data), (_dlen),\
516 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) | \
517 (IS_ENABLED(CONFIG_LOG_USE_TAGGED_ARGUMENTS) ? \
518 CBPRINTF_PACKAGE_ARGS_ARE_TAGGED : 0), \
519 Z_LOG_FMT_RUNTIME_ARGS(_fmt, ##__VA_ARGS__));\
520 (_mode) = Z_LOG_MSG_MODE_RUNTIME; \
523#define Z_LOG_MSG_CREATE3(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
524 _level, _data, _dlen, ...) \
526 Z_LOG_MSG_STR_VAR(_fmt, ##__VA_ARGS__); \
527 bool has_rw_str = CBPRINTF_MUST_RUNTIME_PACKAGE( \
528 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
530 if (IS_ENABLED(CONFIG_LOG_SPEED) && (_try_0cpy) && ((_dlen) == 0) && !has_rw_str) {\
531 LOG_MSG_DBG("create zero-copy message\n");\
532 Z_LOG_MSG_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, \
533 _level, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
534 (_mode) = Z_LOG_MSG_MODE_ZERO_COPY; \
536 IF_ENABLED(UTIL_AND(IS_ENABLED(CONFIG_LOG_SIMPLE_MSG_OPTIMIZE), \
537 UTIL_AND(UTIL_NOT(_domain_id), UTIL_NOT(_cstr_cnt))), \
539 bool can_simple = LOG_MSG_SIMPLE_CHECK(__VA_ARGS__); \
540 if (can_simple && ((_dlen) == 0) && !k_is_user_context()) { \
541 compiler_barrier(); \
542 LOG_MSG_DBG("create fast message\n"); \
543 Z_LOG_MSG_SIMPLE_ARGS_CREATE(_domain_id, _source, _level, \
544 Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
545 _mode = Z_LOG_MSG_MODE_SIMPLE; \
550 LOG_MSG_DBG("create on stack message\n");\
551 Z_LOG_MSG_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, \
552 _dlen, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
553 (_mode) = Z_LOG_MSG_MODE_FROM_STACK; \
558#if defined(__cplusplus)
559#define Z_AUTO_TYPE auto
561#define Z_AUTO_TYPE __auto_type
567#define Z_LOG_LOCAL_ARG_NAME(idx, arg) COND_CODE_0(idx, (arg), (_v##idx))
570#define Z_LOG_LOCAL_ARG_CREATE(idx, arg) \
571 COND_CODE_0(idx, (), (Z_AUTO_TYPE Z_LOG_LOCAL_ARG_NAME(idx, arg) = Z_ARGIFY(arg)))
577#define Z_LOG_MSG_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source, \
578 _level, _data, _dlen, ...) \
580 FOR_EACH_IDX(Z_LOG_LOCAL_ARG_CREATE, (;), __VA_ARGS__); \
581 Z_LOG_MSG_CREATE3(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
582 _level, _data, _dlen, \
583 FOR_EACH_IDX(Z_LOG_LOCAL_ARG_NAME, (,), __VA_ARGS__)); \
588#define Z_LOG_MSG_CREATE(_try_0cpy, _mode, _domain_id, _source,\
589 _level, _data, _dlen, ...) \
590 Z_LOG_MSG_CREATE2(_try_0cpy, _mode, UTIL_CAT(Z_LOG_FUNC_PREFIX_, _level), \
591 _domain_id, _source, _level, _data, _dlen, \
592 Z_LOG_STR(_level, __VA_ARGS__))
615void z_log_msg_finalize(
struct log_msg *msg,
const void *source,
624__syscall
void z_log_msg_simple_create_0(
const void *source,
uint32_t level,
634__syscall
void z_log_msg_simple_create_1(
const void *source,
uint32_t level,
645__syscall
void z_log_msg_simple_create_2(
const void *source,
uint32_t level,
658__syscall
void z_log_msg_static_create(
const void *source,
683void z_log_msg_runtime_vcreate(
uint8_t domain_id,
const void *source,
685 size_t dlen,
uint32_t package_flags,
710static inline void z_log_msg_runtime_create(
uint8_t domain_id,
713 size_t dlen,
uint32_t package_flags,
714 const char *fmt, ...)
719 z_log_msg_runtime_vcreate(domain_id, source, level,
720 data, dlen, package_flags, fmt, ap);
750 if (z_log_item_is_msg(generic_msg)) {
819#if defined(CONFIG_LOG_THREAD_ID_PREFIX)
835#if defined(CONFIG_LOG_CORE_ID_PREFIX)
836 return msg->
hdr.core_id;
877#include <zephyr/syscalls/log_msg.h>
static const void * log_msg_get_source(struct log_msg *msg)
Get message source data.
Definition log_msg.h:787
int16_t log_msg_get_source_id(struct log_msg *msg)
Get log message source ID.
static uint8_t log_msg_get_level(struct log_msg *msg)
Get log message level.
Definition log_msg.h:776
static void * log_msg_get_tid(struct log_msg *msg)
Get Thread ID.
Definition log_msg.h:817
static uint8_t log_msg_get_domain(struct log_msg *msg)
Get log message domain ID.
Definition log_msg.h:765
static uint8_t log_msg_get_core_id(struct log_msg *msg)
Get Core ID.
Definition log_msg.h:833
static uint32_t log_msg_generic_get_wlen(const union mpsc_pbuf_generic *item)
Get length of the log item.
Definition log_msg.h:746
#define LOG_MSG_GENERIC_HDR
Definition log_msg.h:52
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:735
static uint8_t * log_msg_get_package(struct log_msg *msg, size_t *len)
Get string package.
Definition log_msg.h:866
static log_timestamp_t log_msg_get_timestamp(struct log_msg *msg)
Get timestamp.
Definition log_msg.h:806
static uint8_t * log_msg_get_data(struct log_msg *msg, size_t *len)
Get data buffer.
Definition log_msg.h:851
#define NULL
Definition iar_missing_defs.h:20
uint32_t log_timestamp_t
Definition log_msg.h:36
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__INT16_TYPE__ int16_t
Definition stdint.h:73
uint32_t domain
Definition log_msg.h:58
uint32_t package_len
Definition log_msg.h:60
uint32_t level
Definition log_msg.h:59
uint32_t data_len
Definition log_msg.h:61
uint32_t type
Definition log_msg.h:117
struct log_msg_desc desc
Definition log_msg.h:71
log_timestamp_t timestamp
Definition log_msg.h:80
const void * source
Definition log_msg.h:79
uint8_t data[]
Definition log_msg.h:103
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:102
struct log_msg_hdr hdr
Definition log_msg.h:98
Constant data associated with the source of log messages.
Definition log_instance.h:17
Dynamic data associated with the source of log messages.
Definition log_instance.h:23
union mpsc_pbuf_generic buf
Definition log_msg.h:121
struct log_msg log
Definition log_msg.h:123
struct log_msg_generic_hdr generic
Definition log_msg.h:122
const struct log_source_const_data * fixed
Definition log_msg.h:65
struct log_source_dynamic_data * dynamic
Definition log_msg.h:66
void * raw
Definition log_msg.h:67
Generic packet header.
Definition mpsc_packet.h:49