162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci
462306a36Sopenharmony_ciusage() {
562306a36Sopenharmony_ci	echo Extract any RCU CPU stall warnings present in specified file.
662306a36Sopenharmony_ci	echo Filter out clocksource lines.  Note that preceding-lines excludes the
762306a36Sopenharmony_ci	echo initial line of the stall warning but trailing-lines includes it.
862306a36Sopenharmony_ci	echo
962306a36Sopenharmony_ci	echo Usage: $(basename $0) dmesg-file [ preceding-lines [ trailing-lines ] ]
1062306a36Sopenharmony_ci	echo
1162306a36Sopenharmony_ci	echo Error: $1
1262306a36Sopenharmony_ci}
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci# Terminate the script, if the argument is missing
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciif test -f "$1" && test -r "$1"
1762306a36Sopenharmony_cithen
1862306a36Sopenharmony_ci	:
1962306a36Sopenharmony_cielse
2062306a36Sopenharmony_ci	usage "Console log file \"$1\" missing or unreadable."
2162306a36Sopenharmony_ci	exit 1
2262306a36Sopenharmony_cifi
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciecho $1
2562306a36Sopenharmony_cipreceding_lines="${2-3}"
2662306a36Sopenharmony_citrailing_lines="${3-10}"
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciawk -v preceding_lines="$preceding_lines" -v trailing_lines="$trailing_lines" '
2962306a36Sopenharmony_cisuffix <= 0 {
3062306a36Sopenharmony_ci	for (i = preceding_lines; i > 0; i--)
3162306a36Sopenharmony_ci		last[i] = last[i - 1];
3262306a36Sopenharmony_ci	last[0] = $0;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cisuffix > 0 {
3662306a36Sopenharmony_ci	print $0;
3762306a36Sopenharmony_ci	suffix--;
3862306a36Sopenharmony_ci	if (suffix <= 0)
3962306a36Sopenharmony_ci		print "";
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cisuffix <= 0 && /detected stall/ {
4362306a36Sopenharmony_ci	for (i = preceding_lines; i >= 0; i--)
4462306a36Sopenharmony_ci		if (last[i] != "")
4562306a36Sopenharmony_ci			print last[i];
4662306a36Sopenharmony_ci	suffix = trailing_lines;
4762306a36Sopenharmony_ci}' < "$1" | tr -d '\015' | grep -v clocksource
4862306a36Sopenharmony_ci
49