diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2020-10-17 15:31:58 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-10-27 20:50:53 +0300 |
commit | d094a0734cee439fc8483118694079c85b1cc3db (patch) | |
tree | b6a5c9e77308a964f09b721252d46443807e53f4 /common | |
parent | 993a06b6144d54ae2ad83cc25c18acb9d1720ad0 (diff) | |
download | u-boot-d094a0734cee439fc8483118694079c85b1cc3db.tar.xz |
log: allow for message continuation
Some drivers use macro pr_cont() for continuing a message sent via printk.
Hence if we want to convert printk messaging to using the logging system,
we must support continuation of log messages too.
As pr_cont() does not provide a message level we need a means of
remembering the last log level.
With the patch a pseudo log level LOGL_CONT as well as a pseudo log
category LOGC_CONT are introduced. Using these results in the application
of the same log level and category as in the previous log message.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/log.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/common/log.c b/common/log.c index 6a59f2ebe5..d830883825 100644 --- a/common/log.c +++ b/common/log.c @@ -191,10 +191,12 @@ static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec) * log_dispatch() - Send a log record to all log devices for processing * * The log record is sent to each log device in turn, skipping those which have - * filters which block the record + * filters which block the record. * - * @rec: Log record to dispatch - * @return 0 (meaning success) + * All log messages created while processing log record @rec are ignored. + * + * @rec: log record to dispatch + * Return: 0 msg sent, 1 msg not sent while already dispatching another msg */ static int log_dispatch(struct log_rec *rec) { @@ -206,7 +208,7 @@ static int log_dispatch(struct log_rec *rec) * as this might result in infinite recursion. */ if (gd->processing_msg) - return 0; + return 1; /* Emit message */ gd->processing_msg = true; @@ -226,6 +228,12 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file, struct log_rec rec; va_list args; + /* Check for message continuation */ + if (cat == LOGC_CONT) + cat = gd->logc_prev; + if (level == LOGL_CONT) + level = gd->logl_prev; + rec.cat = cat; rec.level = level & LOGL_LEVEL_MASK; rec.force_debug = level & LOGL_FORCE_DEBUG; @@ -241,7 +249,10 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file, gd->log_drop_count++; return -ENOSYS; } - log_dispatch(&rec); + if (!log_dispatch(&rec)) { + gd->logc_prev = cat; + gd->logl_prev = level; + } return 0; } @@ -381,6 +392,8 @@ int log_init(void) if (!gd->default_log_level) gd->default_log_level = CONFIG_LOG_DEFAULT_LEVEL; gd->log_fmt = log_get_default_format(); + gd->logc_prev = LOGC_NONE; + gd->logl_prev = LOGL_INFO; return 0; } |