cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

record+probe_libc_inet_pton.sh (3115B)


      1#!/bin/sh
      2# probe libc's inet_pton & backtrace it with ping
      3
      4# Installs a probe on libc's inet_pton function, that will use uprobes,
      5# then use 'perf trace' on a ping to localhost asking for just one packet
      6# with the a backtrace 3 levels deep, check that it is what we expect.
      7# This needs no debuginfo package, all is done using the libc ELF symtab
      8# and the CFI info in the binaries.
      9
     10# SPDX-License-Identifier: GPL-2.0
     11# Arnaldo Carvalho de Melo <acme@kernel.org>, 2017
     12
     13. $(dirname $0)/lib/probe.sh
     14
     15libc=$(grep -w libc /proc/self/maps | head -1 | sed -r 's/.*[[:space:]](\/.*)/\1/g')
     16nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254
     17
     18event_pattern='probe_libc:inet_pton(\_[[:digit:]]+)?'
     19
     20add_libc_inet_pton_event() {
     21
     22	event_name=$(perf probe -f -x $libc -a inet_pton 2>&1 | tail -n +2 | head -n -5 | \
     23			grep -P -o "$event_pattern(?=[[:space:]]\(on inet_pton in $libc\))")
     24
     25	if [ $? -ne 0 -o -z "$event_name" ] ; then
     26		printf "FAIL: could not add event\n"
     27		return 1
     28	fi
     29}
     30
     31trace_libc_inet_pton_backtrace() {
     32
     33	expected=`mktemp -u /tmp/expected.XXX`
     34
     35	echo "ping[][0-9 \.:]+$event_name: \([[:xdigit:]]+\)" > $expected
     36	echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
     37	case "$(uname -m)" in
     38	s390x)
     39		eventattr='call-graph=dwarf,max-stack=4'
     40		echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
     41		echo "(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
     42		echo "main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected
     43		;;
     44	ppc64|ppc64le)
     45		eventattr='max-stack=4'
     46		echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
     47		echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
     48		echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected
     49		;;
     50	*)
     51		eventattr='max-stack=3'
     52		echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
     53		echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected
     54		;;
     55	esac
     56
     57	perf_data=`mktemp -u /tmp/perf.data.XXX`
     58	perf_script=`mktemp -u /tmp/perf.script.XXX`
     59	perf record -e $event_name/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1
     60	perf script -i $perf_data > $perf_script
     61
     62	exec 3<$perf_script
     63	exec 4<$expected
     64	while read line <&3 && read -r pattern <&4; do
     65		[ -z "$pattern" ] && break
     66		echo $line
     67		echo "$line" | egrep -q "$pattern"
     68		if [ $? -ne 0 ] ; then
     69			printf "FAIL: expected backtrace entry \"%s\" got \"%s\"\n" "$pattern" "$line"
     70			return 1
     71		fi
     72	done
     73
     74	# If any statements are executed from this point onwards,
     75	# the exit code of the last among these will be reflected
     76	# in err below. If the exit code is 0, the test will pass
     77	# even if the perf script output does not match.
     78}
     79
     80delete_libc_inet_pton_event() {
     81
     82	if [ -n "$event_name" ] ; then
     83		perf probe -q -d $event_name
     84	fi
     85}
     86
     87# Check for IPv6 interface existence
     88ip a sh lo | fgrep -q inet6 || exit 2
     89
     90skip_if_no_perf_probe && \
     91add_libc_inet_pton_event && \
     92trace_libc_inet_pton_backtrace
     93err=$?
     94rm -f ${perf_data} ${perf_script} ${expected}
     95delete_libc_inet_pton_event
     96exit $err