xref: /linux/tools/perf/tests/shell/data_file_offset_diagnostics.sh (revision 3d5e48944e824bddc20d7b874e784f7b279636fe)
1*078fc043SArnaldo Carvalho de Melo#!/bin/bash
2*078fc043SArnaldo Carvalho de Melo# Test that perf report includes file offsets and event type names in diagnostic messages.
3*078fc043SArnaldo Carvalho de Melo# SPDX-License-Identifier: GPL-2.0
4*078fc043SArnaldo Carvalho de Melo#
5*078fc043SArnaldo Carvalho de Melo# The file_offset diagnostic series adds "at offset 0x...: TYPE (N)"
6*078fc043SArnaldo Carvalho de Melo# to all skip/stop/error messages.  This test corrupts an event's size
7*078fc043SArnaldo Carvalho de Melo# field in a perf.data file, then verifies the resulting warning
8*078fc043SArnaldo Carvalho de Melo# includes the file offset and event type.
9*078fc043SArnaldo Carvalho de Melo
10*078fc043SArnaldo Carvalho de Meloerr=0
11*078fc043SArnaldo Carvalho de Melo
12*078fc043SArnaldo Carvalho de Melocleanup() {
13*078fc043SArnaldo Carvalho de Melo	[ -n "${perfdata}" ] && rm -f "${perfdata}" "${perfdata}.old"
14*078fc043SArnaldo Carvalho de Melo	rm -f "${corrupted}" "${stderrfile}"
15*078fc043SArnaldo Carvalho de Melo	trap - EXIT TERM INT
16*078fc043SArnaldo Carvalho de Melo}
17*078fc043SArnaldo Carvalho de Melotrap 'cleanup; exit 1' TERM INT
18*078fc043SArnaldo Carvalho de Melotrap cleanup EXIT
19*078fc043SArnaldo Carvalho de Melo
20*078fc043SArnaldo Carvalho de Meloperfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
21*078fc043SArnaldo Carvalho de Melocorrupted=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
22*078fc043SArnaldo Carvalho de Melostderrfile=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
23*078fc043SArnaldo Carvalho de Melo
24*078fc043SArnaldo Carvalho de Meloif ! perf record -o "${perfdata}" -- perf test -w noploop 2>/dev/null; then
25*078fc043SArnaldo Carvalho de Melo	echo "Skip: perf record failed"
26*078fc043SArnaldo Carvalho de Melo	cleanup
27*078fc043SArnaldo Carvalho de Melo	exit 2
28*078fc043SArnaldo Carvalho de Melofi
29*078fc043SArnaldo Carvalho de Melo
30*078fc043SArnaldo Carvalho de Melo# Find the file offset of the first MMAP2 event via perf report -D.
31*078fc043SArnaldo Carvalho de Melo# Format: "timestamp 0xOFFSET [0xSIZE]: PERF_RECORD_MMAP2 ..."
32*078fc043SArnaldo Carvalho de Melommap2_line=$(perf report -D -i "${perfdata}" 2>/dev/null | grep "PERF_RECORD_MMAP2" | head -1)
33*078fc043SArnaldo Carvalho de Meloif [ -z "${mmap2_line}" ]; then
34*078fc043SArnaldo Carvalho de Melo	echo "Skip: no MMAP2 events found in perf.data"
35*078fc043SArnaldo Carvalho de Melo	cleanup
36*078fc043SArnaldo Carvalho de Melo	exit 2
37*078fc043SArnaldo Carvalho de Melofi
38*078fc043SArnaldo Carvalho de Melo
39*078fc043SArnaldo Carvalho de Melommap2_offset=$(echo "${mmap2_line}" | awk '{print $2}')
40*078fc043SArnaldo Carvalho de Melommap2_offset_dec=$((mmap2_offset))
41*078fc043SArnaldo Carvalho de Melo
42*078fc043SArnaldo Carvalho de Melo# Copy the file and corrupt the MMAP2 event's size field.
43*078fc043SArnaldo Carvalho de Melo# perf_event_header layout: type(u32) misc(u16) size(u16)
44*078fc043SArnaldo Carvalho de Melo# Set size to 16 — below the MMAP2 minimum, which triggers
45*078fc043SArnaldo Carvalho de Melo# the "event size too small" warning.
46*078fc043SArnaldo Carvalho de Melo#
47*078fc043SArnaldo Carvalho de Melo# perf.data uses native byte order, so write the u16 in the
48*078fc043SArnaldo Carvalho de Melo# host's endianness to work on both LE and BE architectures.
49*078fc043SArnaldo Carvalho de Melocp "${perfdata}" "${corrupted}"
50*078fc043SArnaldo Carvalho de Meloif printf '\x01\x02' | od -A n -t x2 | grep -q "0201"; then
51*078fc043SArnaldo Carvalho de Melo	# Little-endian
52*078fc043SArnaldo Carvalho de Melo	printf '\x10\x00'
53*078fc043SArnaldo Carvalho de Meloelse
54*078fc043SArnaldo Carvalho de Melo	# Big-endian
55*078fc043SArnaldo Carvalho de Melo	printf '\x00\x10'
56*078fc043SArnaldo Carvalho de Melofi | dd of="${corrupted}" bs=1 seek=$((mmap2_offset_dec + 6)) conv=notrunc 2>/dev/null
57*078fc043SArnaldo Carvalho de Melo
58*078fc043SArnaldo Carvalho de Meloperf report -i "${corrupted}" --stdio > /dev/null 2> "${stderrfile}"
59*078fc043SArnaldo Carvalho de Melo
60*078fc043SArnaldo Carvalho de Melo# Check that warnings include "at offset 0x..."
61*078fc043SArnaldo Carvalho de Meloif grep -q "at offset 0x" "${stderrfile}"; then
62*078fc043SArnaldo Carvalho de Melo	echo "File offset in diagnostics [Success]"
63*078fc043SArnaldo Carvalho de Meloelse
64*078fc043SArnaldo Carvalho de Melo	echo "File offset in diagnostics [Failed: no 'at offset 0x...' found]"
65*078fc043SArnaldo Carvalho de Melo	echo "  stderr was:"
66*078fc043SArnaldo Carvalho de Melo	head -5 "${stderrfile}"
67*078fc043SArnaldo Carvalho de Melo	err=1
68*078fc043SArnaldo Carvalho de Melofi
69*078fc043SArnaldo Carvalho de Melo
70*078fc043SArnaldo Carvalho de Melo# Check that the event type name and numeric id appear: "MMAP2 (10)"
71*078fc043SArnaldo Carvalho de Meloif grep -q "MMAP2 (10)" "${stderrfile}"; then
72*078fc043SArnaldo Carvalho de Melo	echo "Event type name in diagnostics [Success]"
73*078fc043SArnaldo Carvalho de Meloelse
74*078fc043SArnaldo Carvalho de Melo	echo "Event type name in diagnostics [Failed: no 'MMAP2 (10)' found]"
75*078fc043SArnaldo Carvalho de Melo	echo "  stderr was:"
76*078fc043SArnaldo Carvalho de Melo	head -5 "${stderrfile}"
77*078fc043SArnaldo Carvalho de Melo	err=1
78*078fc043SArnaldo Carvalho de Melofi
79*078fc043SArnaldo Carvalho de Melo
80*078fc043SArnaldo Carvalho de Melo# Check that the reported offset matches the actual corruption point
81*078fc043SArnaldo Carvalho de Meloif grep -q "at offset ${mmap2_offset}:" "${stderrfile}"; then
82*078fc043SArnaldo Carvalho de Melo	echo "Correct offset reported [Success]"
83*078fc043SArnaldo Carvalho de Meloelse
84*078fc043SArnaldo Carvalho de Melo	echo "Correct offset reported [Failed: expected offset ${mmap2_offset}]"
85*078fc043SArnaldo Carvalho de Melo	echo "  stderr was:"
86*078fc043SArnaldo Carvalho de Melo	head -5 "${stderrfile}"
87*078fc043SArnaldo Carvalho de Melo	err=1
88*078fc043SArnaldo Carvalho de Melofi
89*078fc043SArnaldo Carvalho de Melo
90*078fc043SArnaldo Carvalho de Melocleanup
91*078fc043SArnaldo Carvalho de Meloexit ${err}
92