Skip to content

Commit

Permalink
s390/boot: Add timestamps to early boot messages
Browse files Browse the repository at this point in the history
When CONFIG_PRINTK_TIME is enabled, add timestamps to boot messages in
the same format as regular printk. Timestamps appear only with earlyprintk
and are stored in the boot messages ring buffer, but are not propagated
to main kernel messages (if earlyprintk is not enabled). This prevents
double timestamps in the output.

Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
  • Loading branch information
Vasily Gorbik authored and Alexander Gordeev committed Jan 26, 2025
1 parent b2a992a commit 70309dc
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 6 deletions.
27 changes: 22 additions & 5 deletions arch/s390/boot/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,12 +190,29 @@ static void boot_console_earlyprintk(const char *buf)
return;
buf = printk_skip_level(buf);
/* print debug messages only when bootdebug is enabled */
if (level == LOGLEVEL_DEBUG && (!bootdebug || !bootdebug_filter_match(buf)))
if (level == LOGLEVEL_DEBUG && (!bootdebug || !bootdebug_filter_match(skip_timestamp(buf))))
return;
if (boot_ignore_loglevel || level < boot_console_loglevel)
sclp_early_printk(buf);
}

static char *add_timestamp(char *buf)
{
#ifdef CONFIG_PRINTK_TIME
union tod_clock *boot_clock = (union tod_clock *)&get_lowcore()->boot_clock;
unsigned long ns = tod_to_ns(get_tod_clock() - boot_clock->tod);
char ts[MAX_NUMLEN];

*buf++ = '[';
buf += strpad(buf, MAX_NUMLEN, as_dec(ts, ns / NSEC_PER_SEC, 0), 5, 0, 0);
*buf++ = '.';
buf += strpad(buf, MAX_NUMLEN, as_dec(ts, (ns % NSEC_PER_SEC) / NSEC_PER_USEC, 0), 6, 1, 0);
*buf++ = ']';
*buf++ = ' ';
#endif
return buf;
}

#define va_arg_len_type(args, lenmod, typemod) \
((lenmod == 'l') ? va_arg(args, typemod long) : \
(lenmod == 'h') ? (typemod short)va_arg(args, typemod int) : \
Expand All @@ -215,10 +232,10 @@ int boot_printk(const char *fmt, ...)
ssize_t len;
int pad;

if (!printk_get_level(fmt)) {
*p++ = KERN_SOH_ASCII;
*p++ = '0' + MESSAGE_LOGLEVEL_DEFAULT;
}
*p++ = KERN_SOH_ASCII;
*p++ = printk_get_level(fmt) ?: '0' + MESSAGE_LOGLEVEL_DEFAULT;
p = add_timestamp(p);
fmt = printk_skip_level(fmt);

va_start(args, fmt);
for (; p < end && *fmt; fmt++) {
Expand Down
11 changes: 11 additions & 0 deletions arch/s390/include/asm/boot_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,15 @@ static inline bool bootdebug_filter_match(const char *buf)
return false;
}

static inline const char *skip_timestamp(const char *buf)
{
#ifdef CONFIG_PRINTK_TIME
const char *p = memchr(buf, ']', strlen(buf));

if (p && p[1] == ' ')
return p + 2;
#endif
return buf;
}

#endif /* _ASM_S390_BOOT_DATA_H */
2 changes: 1 addition & 1 deletion arch/s390/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,7 @@ static void __init print_rb_entry(const char *buf)
char fmt[] = KERN_SOH "0boot: %s";
int level = printk_get_level(buf);

buf = printk_skip_level(buf);
buf = skip_timestamp(printk_skip_level(buf));
if (level == KERN_DEBUG[1] && (!bootdebug || !bootdebug_filter_match(buf)))
return;

Expand Down

0 comments on commit 70309dc

Please sign in to comment.