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