1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0 3# description: Kprobe events - probe points 4 5[ -f kprobe_events ] || exit_unsupported # this is configurable 6 7TARGET_FUNC=tracefs_create_dir 8 9dec_addr() { # hexaddr 10 printf "%d" "0x"`echo $1 | tail -c 8` 11} 12 13set_offs() { # prev target next 14 A1=`dec_addr $1` 15 A2=`dec_addr $2` 16 A3=`dec_addr $3` 17 TARGET="0x$2" # an address 18 PREV=`expr $A1 - $A2` # offset to previous symbol 19 NEXT=+`expr $A3 - $A2` # offset to next symbol 20 OVERFLOW=+`printf "0x%x" ${PREV}` # overflow offset to previous symbol 21} 22 23# We have to decode symbol addresses to get correct offsets. 24# If the offset is not an instruction boundary, it cause -EILSEQ. 25set_offs `grep -A1 -B1 ${TARGET_FUNC} /proc/kallsyms | cut -f 1 -d " " | xargs` 26 27UINT_TEST=no 28# printf "%x" -1 returns (unsigned long)-1. 29if [ `printf "%x" -1 | wc -c` != 9 ]; then 30 UINT_TEST=yes 31fi 32 33echo "p:testprobe ${TARGET_FUNC}" > kprobe_events 34echo "p:testprobe ${TARGET}" > kprobe_events 35echo "p:testprobe ${TARGET_FUNC}${NEXT}" > kprobe_events 36! echo "p:testprobe ${TARGET_FUNC}${PREV}" > kprobe_events 37if [ "${UINT_TEST}" = yes ]; then 38! echo "p:testprobe ${TARGET_FUNC}${OVERFLOW}" > kprobe_events 39fi 40