123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- #ifndef ZEPHYR_INCLUDE_LOGGING_LOG_MSG2_H_
- #define ZEPHYR_INCLUDE_LOGGING_LOG_MSG2_H_
- #include <logging/log_instance.h>
- #include <sys/mpsc_packet.h>
- #include <sys/cbprintf.h>
- #include <sys/atomic.h>
- #include <sys/util.h>
- #include <string.h>
- #ifdef __GNUC__
- #ifndef alloca
- #define alloca __builtin_alloca
- #endif
- #else
- #include <alloca.h>
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define LOG_MSG2_DEBUG 0
- #define LOG_MSG2_DBG(...) IF_ENABLED(LOG_MSG2_DEBUG, (printk(__VA_ARGS__)))
- #if CONFIG_LOG_TIMESTAMP_64BIT
- typedef uint64_t log_timestamp_t;
- #else
- typedef uint32_t log_timestamp_t;
- #endif
- #define Z_LOG_MSG2_LOG 0
- #define Z_LOG_MSG2_TRACE 1
- #define LOG_MSG2_GENERIC_HDR \
- MPSC_PBUF_HDR;\
- uint32_t type:1
- struct log_msg2_desc {
- LOG_MSG2_GENERIC_HDR;
- uint32_t domain:3;
- uint32_t level:3;
- uint32_t package_len:10;
- uint32_t data_len:12;
- uint32_t reserved:1;
- };
- struct log_msg2_trace_hdr {
- LOG_MSG2_GENERIC_HDR;
- uint32_t evt_id:5;
- #if CONFIG_LOG_TRACE_SHORT_TIMESTAMP
- uint32_t timestamp:24;
- #else
- log_timestamp_t timestamp;
- #endif
- };
- union log_msg2_source {
- const struct log_source_const_data *fixed;
- struct log_source_dynamic_data *dynamic;
- void *raw;
- };
- struct log_msg2_hdr {
- struct log_msg2_desc desc;
- #if (INTPTR_MAX > INT32_MAX) && !CONFIG_LOG_TIMESTAMP_64BIT
- log_timestamp_t timestamp;
- const void *source;
- #else
- const void *source;
- log_timestamp_t timestamp;
- #endif
- #if defined(__xtensa__) && !defined(CONFIG_LOG_TIMESTAMP_64BIT)
-
- uint32_t padding;
- #endif
- };
- struct log_msg2_trace {
- struct log_msg2_trace_hdr hdr;
- };
- struct log_msg2_trace_ptr {
- struct log_msg2_trace_hdr hdr;
- void *ptr;
- };
- struct log_msg2 {
- struct log_msg2_hdr hdr;
- uint8_t data[];
- };
- struct log_msg2_generic_hdr {
- LOG_MSG2_GENERIC_HDR;
- };
- union log_msg2_generic {
- union mpsc_pbuf_generic buf;
- struct log_msg2_generic_hdr generic;
- struct log_msg2_trace trace;
- struct log_msg2_trace_ptr trace_ptr;
- struct log_msg2 log;
- };
- enum z_log_msg2_mode {
-
- Z_LOG_MSG2_MODE_RUNTIME,
-
- Z_LOG_MSG2_MODE_FROM_STACK,
-
- Z_LOG_MSG2_MODE_ZERO_COPY,
-
- Z_LOG_MSG2_MODE_SYNC
- };
- #define Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, _plen, _dlen) \
- { \
- .valid = 0, \
- .busy = 0, \
- .type = Z_LOG_MSG2_LOG, \
- .domain = _domain_id, \
- .level = _level, \
- .package_len = _plen, \
- .data_len = _dlen, \
- .reserved = 0, \
- }
- #define Z_LOG_MSG2_ALIGNMENT CBPRINTF_PACKAGE_ALIGNMENT
- #if CONFIG_LOG2_USE_VLA
- #define Z_LOG_MSG2_ON_STACK_ALLOC(ptr, len) \
- long long _ll_buf[ceiling_fraction(len, sizeof(long long))]; \
- long double _ld_buf[ceiling_fraction(len, sizeof(long double))]; \
- ptr = (sizeof(long double) == Z_LOG_MSG2_ALIGNMENT) ? \
- (struct log_msg2 *)_ld_buf : (struct log_msg2 *)_ll_buf; \
- if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
- \
- memset(ptr, 0, len); \
- }
- #else /* Z_LOG_MSG2_USE_VLA */
- #define Z_LOG_MSG2_ON_STACK_ALLOC(ptr, len) \
- long long _ll_buf32[32 / sizeof(long long)]; \
- long long _ll_buf48[48 / sizeof(long long)]; \
- long long _ll_buf64[64 / sizeof(long long)]; \
- long long _ll_buf128[128 / sizeof(long long)]; \
- long long _ll_buf256[256 / sizeof(long long)]; \
- long double _ld_buf32[32 / sizeof(long double)]; \
- long double _ld_buf48[48 / sizeof(long double)]; \
- long double _ld_buf64[64 / sizeof(long double)]; \
- long double _ld_buf128[128 / sizeof(long double)]; \
- long double _ld_buf256[256 / sizeof(long double)]; \
- if (sizeof(long double) == Z_LOG_MSG2_ALIGNMENT) { \
- ptr = (len > 128) ? (struct log_msg2 *)_ld_buf256 : \
- ((len > 64) ? (struct log_msg2 *)_ld_buf128 : \
- ((len > 48) ? (struct log_msg2 *)_ld_buf64 : \
- ((len > 32) ? (struct log_msg2 *)_ld_buf48 : \
- (struct log_msg2 *)_ld_buf32)));\
- } else { \
- ptr = (len > 128) ? (struct log_msg2 *)_ll_buf256 : \
- ((len > 64) ? (struct log_msg2 *)_ll_buf128 : \
- ((len > 48) ? (struct log_msg2 *)_ll_buf64 : \
- ((len > 32) ? (struct log_msg2 *)_ll_buf48 : \
- (struct log_msg2 *)_ll_buf32)));\
- } \
- if (IS_ENABLED(CONFIG_LOG_TEST_CLEAR_MESSAGE_SPACE)) { \
- \
- memset(ptr, 0, len); \
- }
- #endif /* Z_LOG_MSG2_USE_VLA */
- #define Z_LOG_MSG2_ALIGN_OFFSET \
- sizeof(struct log_msg2_hdr)
- #define Z_LOG_MSG2_LEN(pkg_len, data_len) \
- (sizeof(struct log_msg2_hdr) + pkg_len + (data_len))
- #define Z_LOG_MSG2_ALIGNED_WLEN(pkg_len, data_len) \
- ceiling_fraction(ROUND_UP(Z_LOG_MSG2_LEN(pkg_len, data_len), \
- Z_LOG_MSG2_ALIGNMENT), \
- sizeof(uint32_t))
- #define Z_LOG_MSG2_SYNC(_domain_id, _source, _level, _data, _dlen, ...) do { \
- int _plen; \
- CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__); \
- struct log_msg2 *_msg; \
- Z_LOG_MSG2_ON_STACK_ALLOC(_msg, Z_LOG_MSG2_LEN(_plen, _dlen)); \
- if (_plen) {\
- CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, _plen, \
- Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__); \
- } \
- struct log_msg2_desc _desc = \
- Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, \
- (uint32_t)_plen, _dlen); \
- z_log_msg2_finalize(_msg, _source, _desc, _data); \
- } while (0)
- #define Z_LOG_MSG2_STACK_CREATE(_domain_id, _source, _level, _data, _dlen, ...)\
- do { \
- int _plen; \
- if (GET_ARG_N(1, __VA_ARGS__) == NULL) { \
- _plen = 0; \
- } else { \
- CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__); \
- } \
- struct log_msg2 *_msg; \
- Z_LOG_MSG2_ON_STACK_ALLOC(_msg, Z_LOG_MSG2_LEN(_plen, 0)); \
- if (_plen) { \
- CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, \
- _plen, Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__);\
- } \
- struct log_msg2_desc _desc = \
- Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, \
- (uint32_t)_plen, _dlen); \
- LOG_MSG2_DBG("creating message on stack: package len: %d, data len: %d\n", \
- _plen, (int)(_dlen)); \
- z_log_msg2_static_create((void *)_source, _desc, _msg->data, _data); \
- } while (0)
- #if CONFIG_LOG_SPEED
- #define Z_LOG_MSG2_SIMPLE_CREATE(_domain_id, _source, _level, ...) do { \
- int _plen; \
- CBPRINTF_STATIC_PACKAGE(NULL, 0, _plen, Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__); \
- size_t _msg_wlen = Z_LOG_MSG2_ALIGNED_WLEN(_plen, 0); \
- struct log_msg2 *_msg = z_log_msg2_alloc(_msg_wlen); \
- struct log_msg2_desc _desc = \
- Z_LOG_MSG_DESC_INITIALIZER(_domain_id, _level, (uint32_t)_plen, 0); \
- LOG_MSG2_DBG("creating message zero copy: package len: %d, msg: %p\n", \
- _plen, _msg); \
- if (_msg) { \
- CBPRINTF_STATIC_PACKAGE(_msg->data, _plen, _plen, \
- Z_LOG_MSG2_ALIGN_OFFSET, \
- 0, __VA_ARGS__); \
- } \
- z_log_msg2_finalize(_msg, (void *)_source, _desc, NULL); \
- } while (0)
- #else
- #define Z_LOG_MSG2_SIMPLE_CREATE(...)
- #endif
- #define Z_LOG_FMT_ARGS_2(_name, ...) \
- COND_CODE_1(CONFIG_LOG2_FMT_SECTION, \
- (COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
- (_name), (_name, GET_ARGS_LESS_N(1, __VA_ARGS__)))), \
- (__VA_ARGS__))
- #define Z_LOG_FMT_ARGS(_name, ...) \
- COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
- (NULL), \
- (Z_LOG_FMT_ARGS_2(_name, ##__VA_ARGS__)))
- #define Z_LOG_MSG2_STR_VAR_IN_SECTION(_name, ...) \
- COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
- (), \
- (static const char _name[] \
- __attribute__((__section__(".log_strings"))) = \
- GET_ARG_N(1, __VA_ARGS__);))
- #define Z_LOG_MSG2_STR_VAR(_name, ...) \
- IF_ENABLED(CONFIG_LOG2_FMT_SECTION, \
- (Z_LOG_MSG2_STR_VAR_IN_SECTION(_name, ##__VA_ARGS__)))
- #if CONFIG_LOG2_ALWAYS_RUNTIME
- #define Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
- _level, _data, _dlen, ...) \
- do {\
- Z_LOG_MSG2_STR_VAR(_fmt, ##__VA_ARGS__) \
- z_log_msg2_runtime_create(_domain_id, (void *)_source, \
- _level, (uint8_t *)_data, _dlen,\
- Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__));\
- _mode = Z_LOG_MSG2_MODE_RUNTIME; \
- } while (0)
- #elif CONFIG_LOG2_MODE_IMMEDIATE /* CONFIG_LOG2_ALWAYS_RUNTIME */
- #define Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
- _level, _data, _dlen, ...) \
- do { \
- Z_LOG_MSG2_STR_VAR(_fmt, ##__VA_ARGS__); \
- if (CBPRINTF_MUST_RUNTIME_PACKAGE(_cstr_cnt, __VA_ARGS__)) { \
- LOG_MSG2_DBG("create runtime message\n");\
- z_log_msg2_runtime_create(_domain_id, (void *)_source, \
- _level, (uint8_t *)_data, _dlen,\
- Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__));\
- _mode = Z_LOG_MSG2_MODE_RUNTIME; \
- } else {\
- Z_LOG_MSG2_SYNC(_domain_id, _source, _level, \
- _data, _dlen, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
- _mode = Z_LOG_MSG2_MODE_SYNC; \
- } \
- } while (0)
- #else /* CONFIG_LOG2_ALWAYS_RUNTIME */
- #define Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, _cstr_cnt, _domain_id, _source,\
- _level, _data, _dlen, ...) \
- do { \
- Z_LOG_MSG2_STR_VAR(_fmt, ##__VA_ARGS__); \
- if (CBPRINTF_MUST_RUNTIME_PACKAGE(_cstr_cnt, __VA_ARGS__)) { \
- LOG_MSG2_DBG("create runtime message\n");\
- z_log_msg2_runtime_create(_domain_id, (void *)_source, \
- _level, (uint8_t *)_data, _dlen,\
- Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__));\
- _mode = Z_LOG_MSG2_MODE_RUNTIME; \
- } else if (IS_ENABLED(CONFIG_LOG_SPEED) && _try_0cpy && ((_dlen) == 0)) {\
- LOG_MSG2_DBG("create zero-copy message\n");\
- Z_LOG_MSG2_SIMPLE_CREATE(_domain_id, _source, \
- _level, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
- _mode = Z_LOG_MSG2_MODE_ZERO_COPY; \
- } else { \
- LOG_MSG2_DBG("create on stack message\n");\
- Z_LOG_MSG2_STACK_CREATE(_domain_id, _source, _level, _data, \
- _dlen, Z_LOG_FMT_ARGS(_fmt, ##__VA_ARGS__)); \
- _mode = Z_LOG_MSG2_MODE_FROM_STACK; \
- } \
- (void)_mode; \
- } while (0)
- #endif /* CONFIG_LOG2_ALWAYS_RUNTIME */
- #define Z_LOG_MSG2_CREATE(_try_0cpy, _mode, _domain_id, _source,\
- _level, _data, _dlen, ...) \
- Z_LOG_MSG2_CREATE2(_try_0cpy, _mode, UTIL_CAT(Z_LOG_FUNC_PREFIX_, _level), \
- _domain_id, _source, _level, _data, _dlen, \
- Z_LOG_STR(_level, __VA_ARGS__))
- #define Z_TRACING_LOG_HDR_INIT(name, id) \
- struct log_msg2_trace name = { \
- .hdr = { \
- .type = Z_LOG_MSG2_TRACE, \
- .valid = 1, \
- .busy = 0, \
- .evt_id = id, \
- } \
- }
- void z_log_msg2_finalize(struct log_msg2 *msg, const void *source,
- const struct log_msg2_desc desc, const void *data);
- __syscall void z_log_msg2_static_create(const void *source,
- const struct log_msg2_desc desc,
- uint8_t *package, const void *data);
- __syscall void z_log_msg2_runtime_vcreate(uint8_t domain_id, const void *source,
- uint8_t level, const void *data,
- size_t dlen, const char *fmt,
- va_list ap);
- static inline void z_log_msg2_runtime_create(uint8_t domain_id,
- const void *source,
- uint8_t level, const void *data,
- size_t dlen, const char *fmt, ...)
- {
- va_list ap;
- va_start(ap, fmt);
- z_log_msg2_runtime_vcreate(domain_id, source, level,
- data, dlen, fmt, ap);
- va_end(ap);
- }
- static inline bool z_log_item_is_msg(union log_msg2_generic *msg)
- {
- return msg->generic.type == Z_LOG_MSG2_LOG;
- }
- static inline uint32_t log_msg2_get_total_wlen(const struct log_msg2_desc desc)
- {
- return Z_LOG_MSG2_ALIGNED_WLEN(desc.package_len, desc.data_len);
- }
- static inline uint32_t log_msg2_generic_get_wlen(const union mpsc_pbuf_generic *item)
- {
- union log_msg2_generic *generic_msg = (union log_msg2_generic *)item;
- if (z_log_item_is_msg(generic_msg)) {
- struct log_msg2 *msg = (struct log_msg2 *)generic_msg;
- return log_msg2_get_total_wlen(msg->hdr.desc);
- }
-
- return 0;
- }
- static inline uint8_t log_msg2_get_domain(struct log_msg2 *msg)
- {
- return msg->hdr.desc.domain;
- }
- static inline uint8_t log_msg2_get_level(struct log_msg2 *msg)
- {
- return msg->hdr.desc.level;
- }
- static inline const void *log_msg2_get_source(struct log_msg2 *msg)
- {
- return msg->hdr.source;
- }
- static inline log_timestamp_t log_msg2_get_timestamp(struct log_msg2 *msg)
- {
- return msg->hdr.timestamp;
- }
- static inline uint8_t *log_msg2_get_data(struct log_msg2 *msg, size_t *len)
- {
- *len = msg->hdr.desc.data_len;
- return msg->data + msg->hdr.desc.package_len;
- }
- static inline uint8_t *log_msg2_get_package(struct log_msg2 *msg, size_t *len)
- {
- *len = msg->hdr.desc.package_len;
- return msg->data;
- }
- #include <syscalls/log_msg2.h>
- #ifdef __cplusplus
- }
- #endif
- #endif /* ZEPHYR_INCLUDE_LOGGING_LOG_MSG2_H_ */
|