@@ -141,6 +141,7 @@ extern "C" {
141141 (0)\
142142 )
143143
144+
144145/**
145146 * @brief Macro for optional injection of function name as first argument of
146147 * formatted string. COND_CODE_0() macro is used to handle no arguments
@@ -151,14 +152,22 @@ extern "C" {
151152 * argument. In order to handle string with no arguments _LOG_Z_EVAL is
152153 * used.
153154 */
154-
155- #define Z_LOG_STR (...) "%s: " GET_ARG_N(1, __VA_ARGS__), \
155+ #define Z_LOG_STR2 (...) "%s: " GET_ARG_N(1, __VA_ARGS__), \
156156 (const char *)__func__\
157157 COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__),\
158158 (),\
159159 (, GET_ARGS_LESS_N(1, __VA_ARGS__))\
160160 )
161161
162+ /**
163+ * @brief Handle optional injection of function name as the first argument.
164+ *
165+ * Additionally, macro is handling the empty message case.
166+ */
167+ #define Z_LOG_STR (...) \
168+ COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
169+ ("%s", (const char *)__func__), \
170+ (Z_LOG_STR2(__VA_ARGS__)))
162171
163172/******************************************************************************/
164173/****************** Internal macros for log frontend **************************/
@@ -259,6 +268,12 @@ void z_log_minimal_printk(const char *fmt, ...);
259268 ##__VA_ARGS__); \
260269} while (false)
261270
271+ #define Z_LOG_TO_VPRINTK (_level , fmt , valist ) do { \
272+ z_log_minimal_printk("%c: ", z_log_minimal_level_to_char(_level)); \
273+ z_log_minimal_vprintk(fmt, valist); \
274+ z_log_minimal_printk("\n"); \
275+ } while (false)
276+
262277static inline char z_log_minimal_level_to_char (int level )
263278{
264279 switch (level ) {
@@ -274,6 +289,9 @@ static inline char z_log_minimal_level_to_char(int level)
274289 return '?' ;
275290 }
276291}
292+
293+ #define Z_LOG_INST (_inst ) COND_CODE_1(CONFIG_LOG, (_inst), NULL)
294+
277295/*****************************************************************************/
278296/****************** Macros for standard logging ******************************/
279297/*****************************************************************************/
@@ -292,8 +310,14 @@ static inline char z_log_minimal_level_to_char(int level)
292310 if (!LOG_CHECK_CTX_LVL_FILTER(is_user_context, _level, filters)) { \
293311 break; \
294312 } \
295- \
296- Z_LOG_INTERNAL(is_user_context, _level, _source, __VA_ARGS__);\
313+ if (IS_ENABLED(CONFIG_LOG2)) { \
314+ int _mode; \
315+ Z_LOG_MSG2_CREATE(!IS_ENABLED(CONFIG_USERSPACE), _mode, \
316+ CONFIG_LOG_DOMAIN_ID, _source, _level, NULL,\
317+ 0, __VA_ARGS__); \
318+ } else { \
319+ Z_LOG_INTERNAL(is_user_context, _level, _source, __VA_ARGS__);\
320+ } \
297321 if (false) { \
298322 /* Arguments checker present but never evaluated.*/ \
299323 /* Placed here to ensure that __VA_ARGS__ are*/ \
@@ -309,7 +333,8 @@ static inline char z_log_minimal_level_to_char(int level)
309333 (void *)__log_current_const_data, \
310334 __VA_ARGS__)
311335
312- #define Z_LOG_INSTANCE (_level , _inst , ...) Z_LOG2(_level, _inst, __VA_ARGS__)
336+ #define Z_LOG_INSTANCE (_level , _inst , ...) \
337+ Z_LOG2(_level, Z_LOG_INST(_inst), __VA_ARGS__)
313338
314339
315340/*****************************************************************************/
@@ -333,8 +358,19 @@ static inline char z_log_minimal_level_to_char(int level)
333358 if (!LOG_CHECK_CTX_LVL_FILTER(is_user_context, _level, filters)) { \
334359 break; \
335360 } \
361+ if (IS_ENABLED(CONFIG_LOG2)) { \
362+ int mode; \
363+ Z_LOG_MSG2_CREATE(!IS_ENABLED(CONFIG_USERSPACE), mode, \
364+ CONFIG_LOG_DOMAIN_ID, _source, _level, \
365+ _data, _len, \
366+ COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
367+ (), \
368+ (COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
369+ ("%s", __VA_ARGS__), (__VA_ARGS__)))));\
370+ break; \
371+ } \
336372 uint16_t src_id = \
337- IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
373+ IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
338374 LOG_DYNAMIC_ID_GET(_source) : LOG_CONST_ID_GET(_source);\
339375 struct log_msg_ids src_level = { \
340376 .level = _level, \
@@ -358,7 +394,7 @@ static inline char z_log_minimal_level_to_char(int level)
358394 _data, _length, __VA_ARGS__)
359395
360396#define Z_LOG_HEXDUMP_INSTANCE (_level , _inst , _data , _length , _str ) \
361- Z_LOG_HEXDUMP2(_level, _inst, _data, _length, _str)
397+ Z_LOG_HEXDUMP2(_level, Z_LOG_INST( _inst) , _data, _length, _str)
362398
363399/*****************************************************************************/
364400/****************** Filtering macros *****************************************/
@@ -619,6 +655,21 @@ void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata,
619655void log_generic (struct log_msg_ids src_level , const char * fmt , va_list ap ,
620656 enum log_strdup_action strdup_action );
621657
658+ /**
659+ * @brief Writes a generic log message to the logging v2.
660+ *
661+ * @note This function is intended to be used when porting other log systems.
662+ *
663+ * @param level Log level..
664+ * @param fmt String to format.
665+ * @param ap Poiner to arguments list.
666+ */
667+ static inline void log2_generic (uint8_t level , const char * fmt , va_list ap )
668+ {
669+ z_log_msg2_runtime_vcreate (CONFIG_LOG_DOMAIN_ID , NULL , level ,
670+ NULL , 0 , fmt , ap );
671+ }
672+
622673/**
623674 * @brief Returns number of arguments visible from format string.
624675 *
@@ -738,33 +789,45 @@ __syscall void z_log_hexdump_from_user(uint32_t src_level_val,
738789/********* Speed optimized for up to three arguments number. ***************/
739790/******************************************************************************/
740791#define Z_LOG_VA (_level , _str , _valist , _argnum , _strdup_action )\
741- __LOG_VA (_level , \
742- (uint16_t )LOG_CURRENT_MODULE_ID (), \
743- LOG_CURRENT_DYNAMIC_DATA_ADDR (), \
744- _str , _valist , _argnum , _strdup_action )
745-
746- #define __LOG_VA (_level , _id , _filter , _str , _valist , _argnum , _strdup_action ) \
747- do { \
748- if (Z_LOG_CONST_LEVEL_CHECK (_level )) { \
749- bool is_user_context = k_is_user_context (); \
750- \
751- if (IS_ENABLED (CONFIG_LOG_MINIMAL )) { \
752- z_log_minimal_printk (_str , _valist ); \
753- } else if (LOG_CHECK_CTX_LVL_FILTER (is_user_context , \
754- _level , _filter )) { \
755- struct log_msg_ids src_level = { \
756- .level = _level , \
757- .domain_id = CONFIG_LOG_DOMAIN_ID , \
758- .source_id = _id \
759- }; \
760- __LOG_INTERNAL_VA (is_user_context , \
761- src_level , \
762- _str , _valist , _argnum , \
763- _strdup_action ); \
764- } else { \
765- } \
766- } \
767- } while (false)
792+ __LOG_VA (_level , \
793+ IS_ENABLED (CONFIG_LOG_RUNTIME_FILTERING ) ? \
794+ (void * )__log_current_dynamic_data : \
795+ (void * )__log_current_const_data , \
796+ _str , _valist , _argnum , _strdup_action )
797+
798+ #define __LOG_VA (_level , _source , _str , _valist , _argnum , _strdup_action ) do { \
799+ if (!Z_LOG_CONST_LEVEL_CHECK (_level )) { \
800+ break ; \
801+ } \
802+ if (IS_ENABLED (CONFIG_LOG_MINIMAL )) { \
803+ Z_LOG_TO_VPRINTK (_level , _str , _valist ); \
804+ break ; \
805+ } \
806+ \
807+ bool is_user_context = k_is_user_context (); \
808+ uint32_t filters = IS_ENABLED (CONFIG_LOG_RUNTIME_FILTERING ) ? \
809+ ((struct log_source_dynamic_data * )(void * )(_source ))-> filters : 0 ;\
810+ if (!LOG_CHECK_CTX_LVL_FILTER (is_user_context , _level , filters )) { \
811+ break ; \
812+ } \
813+ if (IS_ENABLED (CONFIG_LOG2 )) { \
814+ z_log_msg2_runtime_vcreate (CONFIG_LOG_DOMAIN_ID , _source , \
815+ _level , NULL , 0 , _str , _valist ); \
816+ break ; \
817+ } \
818+ uint16_t _id = \
819+ IS_ENABLED (CONFIG_LOG_RUNTIME_FILTERING ) ? \
820+ LOG_DYNAMIC_ID_GET (_source ) : LOG_CONST_ID_GET (_source );\
821+ struct log_msg_ids src_level = { \
822+ .level = _level , \
823+ .domain_id = CONFIG_LOG_DOMAIN_ID , \
824+ .source_id = _id \
825+ }; \
826+ __LOG_INTERNAL_VA (is_user_context , \
827+ src_level , \
828+ _str , _valist , _argnum , \
829+ _strdup_action ); \
830+ } while (false)
768831
769832/**
770833 * @brief Inline function to perform strdup, used in __LOG_INTERNAL_VA macro
0 commit comments