Commit 70309dc7 authored by Vasily Gorbik's avatar Vasily Gorbik Committed by Alexander Gordeev
Browse files

s390/boot: Add timestamps to early boot messages



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: default avatarVasily Gorbik <gor@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent b2a992a5
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -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) :	\
@@ -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++ = 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++) {
+11 −0
Original line number Diff line number Diff line
@@ -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 */
+1 −1
Original line number Diff line number Diff line
@@ -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;