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) && !CONFIG_LOG_TIMESTAMP_64BIT
85#define Z_LOG_MSG_ALIGNMENT CBPRINTF_PACKAGE_ALIGNMENT
87#define Z_LOG_MSG_PADDING \
88 ((sizeof(struct log_msg_hdr) % Z_LOG_MSG_ALIGNMENT) > 0 ? \
89 (Z_LOG_MSG_ALIGNMENT - (sizeof(struct log_msg_hdr) % Z_LOG_MSG_ALIGNMENT)) : \
104BUILD_ASSERT(
sizeof(
struct log_msg) % Z_LOG_MSG_ALIGNMENT == 0,
105 "Log msg size must aligned");
129 Z_LOG_MSG_MODE_RUNTIME,
134 Z_LOG_MSG_MODE_FROM_STACK,
140 Z_LOG_MSG_MODE_ZERO_COPY,
143#define Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, _plen, _dlen) \
147 .type = Z_LOG_MSG_LOG, \
148 .domain = _domain_id, \
150 .package_len = _plen, \
154#define Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) \
155 (CBPRINTF_PACKAGE_FIRST_RO_STR_CNT(_cstr_cnt) | \
156 (IS_ENABLED(CONFIG_LOG_MSG_APPEND_RO_STRING_LOC) ? \
157 CBPRINTF_PACKAGE_ADD_STRING_IDXS : 0))
159#ifdef CONFIG_LOG_USE_VLA
160#define Z_LOG_MSG_ON_STACK_ALLOC(ptr, len) \
161 long long _ll_buf[DIV_ROUND_UP(len, sizeof(long long))]; \
162 long double _ld_buf[DIV_ROUND_UP(len, sizeof(long double))]; \
163 ptr = (sizeof(long double) == Z_LOG_MSG_ALIGNMENT) ? \
164 (struct log_msg *)_ld_buf : (struct log_msg *)_ll_buf; \
165 if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
167 memset(ptr, 0, len); \
175#define Z_LOG_MSG_ON_STACK_ALLOC(ptr, len) \
176 long long _ll_buf32[32 / sizeof(long long)]; \
177 long long _ll_buf48[48 / sizeof(long long)]; \
178 long long _ll_buf64[64 / sizeof(long long)]; \
179 long long _ll_buf128[128 / sizeof(long long)]; \
180 long long _ll_buf256[256 / sizeof(long long)]; \
181 long double _ld_buf32[32 / sizeof(long double)]; \
182 long double _ld_buf48[48 / sizeof(long double)]; \
183 long double _ld_buf64[64 / sizeof(long double)]; \
184 long double _ld_buf128[128 / sizeof(long double)]; \
185 long double _ld_buf256[256 / sizeof(long double)]; \
186 if (sizeof(long double) == Z_LOG_MSG_ALIGNMENT) { \
187 ptr = (len > 128) ? (struct log_msg *)_ld_buf256 : \
188 ((len > 64) ? (struct log_msg *)_ld_buf128 : \
189 ((len > 48) ? (struct log_msg *)_ld_buf64 : \
190 ((len > 32) ? (struct log_msg *)_ld_buf48 : \
191 (struct log_msg *)_ld_buf32)));\
193 ptr = (len > 128) ? (struct log_msg *)_ll_buf256 : \
194 ((len > 64) ? (struct log_msg *)_ll_buf128 : \
195 ((len > 48) ? (struct log_msg *)_ll_buf64 : \
196 ((len > 32) ? (struct log_msg *)_ll_buf48 : \
197 (struct log_msg *)_ll_buf32)));\
199 if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
201 memset(ptr, 0, len); \
205#define Z_LOG_MSG_ALIGN_OFFSET \
206 offsetof(struct log_msg, data)
208#define Z_LOG_MSG_LEN(pkg_len, data_len) \
209 (offsetof(struct log_msg, data) + pkg_len + (data_len))
211#define Z_LOG_MSG_ALIGNED_WLEN(pkg_len, data_len) \
212 DIV_ROUND_UP(ROUND_UP(Z_LOG_MSG_LEN(pkg_len, data_len), \
213 Z_LOG_MSG_ALIGNMENT), \
225#define Z_LOG_ARM64_VLA_PROTECT() compiler_barrier()
227#define Z_LOG_MSG_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, _dlen, ...) \
230 uint32_t _options = Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) | \
231 CBPRINTF_PACKAGE_ADD_RW_STR_POS; \
232 if (GET_ARG_N(1, __VA_ARGS__) == NULL) { \
235 CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG_ALIGN_OFFSET, _options, \
238 struct log_msg *_msg; \
239 Z_LOG_MSG_ON_STACK_ALLOC(_msg, Z_LOG_MSG_LEN(_plen, 0)); \
240 Z_LOG_ARM64_VLA_PROTECT(); \
242 CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, \
243 _plen, Z_LOG_MSG_ALIGN_OFFSET, _options, \
246 struct log_msg_desc _desc = \
247 Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, \
248 (uint32_t)_plen, _dlen); \
249 LOG_MSG_DBG("creating message on stack: package len: %d, data len: %d\n", \
250 _plen, (int)(_dlen)); \
251 z_log_msg_static_create((void *)_source, _desc, _msg->data, _data); \
254#ifdef CONFIG_LOG_SPEED
255#define Z_LOG_MSG_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, _level, ...) do { \
257 CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG_ALIGN_OFFSET, \
258 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
260 size_t _msg_wlen = Z_LOG_MSG_ALIGNED_WLEN(_plen, 0); \
261 struct log_msg *_msg = z_log_msg_alloc(_msg_wlen); \
262 struct log_msg_desc _desc = \
263 Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, (uint32_t)_plen, 0); \
264 LOG_MSG_DBG("creating message zero copy: package len: %d, msg: %p\n", \
267 CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, _plen, \
268 Z_LOG_MSG_ALIGN_OFFSET, \
269 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
272 z_log_msg_finalize(_msg, (void *)_source, _desc, NULL); \
278#define Z_LOG_MSG_SIMPLE_CREATE(...)
284#define Z_LOG_FMT_ARGS_2(_name, ...) \
285 COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
286 (COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
287 (_name), (_name, GET_ARGS_LESS_N(1, __VA_ARGS__)))), \
299#define Z_LOG_FMT_ARGS(_name, ...) \
300 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
302 (Z_LOG_FMT_ARGS_2(_name, ##__VA_ARGS__)))
304#if defined(CONFIG_LOG_USE_TAGGED_ARGUMENTS)
306#define Z_LOG_FMT_TAGGED_ARGS_2(_name, ...) \
307 COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
308 (_name, Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
309 GET_ARGS_LESS_N(1, __VA_ARGS__))), \
310 (GET_ARG_N(1, __VA_ARGS__), \
311 Z_CBPRINTF_TAGGED_ARGS(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
312 GET_ARGS_LESS_N(1, __VA_ARGS__))))
324#define Z_LOG_FMT_TAGGED_ARGS(_name, ...) \
325 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
326 (Z_CBPRINTF_TAGGED_ARGS(0)), \
327 (Z_LOG_FMT_TAGGED_ARGS_2(_name, ##__VA_ARGS__)))
329#define Z_LOG_FMT_RUNTIME_ARGS(...) \
330 Z_LOG_FMT_TAGGED_ARGS(__VA_ARGS__)
334#define Z_LOG_FMT_RUNTIME_ARGS(...) \
335 Z_LOG_FMT_ARGS(__VA_ARGS__)
342#define Z_LOG_MSG_STR_VAR_IN_SECTION(_name, ...) \
343 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
345 (static const char _name[] \
346 __in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
347 GET_ARG_N(1, __VA_ARGS__);))
356#define Z_LOG_MSG_STR_VAR(_name, ...) \
357 IF_ENABLED(CONFIG_LOG_FMT_SECTION, \
358 (Z_LOG_MSG_STR_VAR_IN_SECTION(_name, ##__VA_ARGS__)))
399#if defined(CONFIG_LOG_ALWAYS_RUNTIME) || \
400 (!defined(CONFIG_LOG) && \
401 (!TOOLCHAIN_HAS_PRAGMA_DIAG || !TOOLCHAIN_HAS_C_AUTO_TYPE))
402#define Z_LOG_MSG_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
403 _level, _data, _dlen, ...) \
405 Z_LOG_MSG_STR_VAR(_fmt, ##__VA_ARGS__) \
406 z_log_msg_runtime_create(_domain_id, (void *)_source, \
407 _level, (uint8_t *)_data, _dlen,\
408 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt) | \
409 (IS_ENABLED(CONFIG_LOG_USE_TAGGED_ARGUMENTS) ? \
410 CBPRINTF_PACKAGE_ARGS_ARE_TAGGED : 0), \
411 Z_LOG_FMT_RUNTIME_ARGS(_fmt, ##__VA_ARGS__));\
412 _mode = Z_LOG_MSG_MODE_RUNTIME; \
415#define Z_LOG_MSG_CREATE3(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
416 _level, _data, _dlen, ...) \
418 Z_LOG_MSG_STR_VAR(_fmt, ##__VA_ARGS__); \
419 bool has_rw_str = CBPRINTF_MUST_RUNTIME_PACKAGE( \
420 Z_LOG_MSG_CBPRINTF_FLAGS(_cstr_cnt), \
422 if (IS_ENABLED(CONFIG_LOG_SPEED) && _try_0cpy && ((_dlen) == 0) && !has_rw_str) {\
423 LOG_MSG_DBG("create zero-copy message\n");\
424 Z_LOG_MSG_SIMPLE_CREATE(_cstr_cnt, _domain_id, _source, \
425 _level, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
426 _mode = Z_LOG_MSG_MODE_ZERO_COPY; \
428 LOG_MSG_DBG("create on stack message\n");\
429 Z_LOG_MSG_STACK_CREATE(_cstr_cnt, _domain_id, _source, _level, _data, \
430 _dlen, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
431 _mode = Z_LOG_MSG_MODE_FROM_STACK; \
436#if defined(__cplusplus)
437#define Z_AUTO_TYPE auto
439#define Z_AUTO_TYPE __auto_type
445#define Z_LOG_LOCAL_ARG_NAME(idx, arg) COND_CODE_0(idx, (arg), (_v##idx))
448#define Z_LOG_LOCAL_ARG_CREATE(idx, arg) \
449 COND_CODE_0(idx, (), (Z_AUTO_TYPE Z_LOG_LOCAL_ARG_NAME(idx, arg) = (arg) + 0))
455#define Z_LOG_MSG_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source, \
456 _level, _data, _dlen, ...) \
458 _Pragma("GCC diagnostic push") \
459 _Pragma("GCC diagnostic ignored \"-Wpointer-arith\"") \
460 FOR_EACH_IDX(Z_LOG_LOCAL_ARG_CREATE, (;), __VA_ARGS__); \
461 _Pragma("GCC diagnostic pop") \
462 Z_LOG_MSG_CREATE3(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
463 _level, _data, _dlen, \
464 FOR_EACH_IDX(Z_LOG_LOCAL_ARG_NAME, (,), __VA_ARGS__)); \
471#define Z_LOG_MSG_CREATE(_try_0cpy, _mode, _domain_id, _source,\
472 _level, _data, _dlen, ...) \
473 Z_LOG_MSG_CREATE2(_try_0cpy, _mode, UTIL_CAT(Z_LOG_FUNC_PREFIX_, _level), \
474 _domain_id, _source, _level, _data, _dlen, \
475 Z_LOG_STR(_level, __VA_ARGS__))
498void z_log_msg_finalize(
struct log_msg *
msg,
const void *source,
511__syscall
void z_log_msg_static_create(
const void *source,
536__syscall
void z_log_msg_runtime_vcreate(
uint8_t domain_id,
const void *source,
538 size_t dlen,
uint32_t package_flags,
563static inline void z_log_msg_runtime_create(
uint8_t domain_id,
566 size_t dlen,
uint32_t package_flags,
567 const char *fmt, ...)
572 z_log_msg_runtime_vcreate(domain_id, source, level,
573 data, dlen, package_flags, fmt, ap);
579 return msg->generic.type == Z_LOG_MSG_LOG;
603 if (z_log_item_is_msg(generic_msg)) {
620 return msg->hdr.desc.domain;
631 return msg->hdr.desc.level;
642 return msg->hdr.source;
653 return msg->hdr.timestamp;
666 *len =
msg->hdr.desc.data_len;
668 return msg->data +
msg->hdr.desc.package_len;
681 *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:640
static uint8_t log_msg_get_level(struct log_msg *msg)
Get log message level.
Definition: log_msg.h:629
static uint8_t log_msg_get_domain(struct log_msg *msg)
Get log message domain ID.
Definition: log_msg.h:618
static uint32_t log_msg_generic_get_wlen(const union mpsc_pbuf_generic *item)
Get length of the log item.
Definition: log_msg.h:599
#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:588
static uint8_t * log_msg_get_package(struct log_msg *msg, size_t *len)
Get string package.
Definition: log_msg.h:679
static log_timestamp_t log_msg_get_timestamp(struct log_msg *msg)
Get timestamp.
Definition: log_msg.h:651
static uint8_t * log_msg_get_data(struct log_msg *msg, size_t *len)
Get data buffer.
Definition: log_msg.h:664
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
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
Definition: log_msg.h:111
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:98
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:97
struct log_msg_hdr hdr
Definition: log_msg.h:93
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:30
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:115
union mpsc_pbuf_generic buf
Definition: log_msg.h:116
struct log_msg log
Definition: log_msg.h:118
struct log_msg_generic_hdr generic
Definition: log_msg.h:117
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