| #!/bin/sh | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # description: Kprobe events - probe points | |
| [ -f kprobe_events ] || exit_unsupported # this is configurable | |
| TARGET_FUNC=create_trace_kprobe | |
| dec_addr() { # hexaddr | |
| printf "%d" "0x"`echo $1 | tail -c 8` | |
| } | |
| set_offs() { # prev target next | |
| A1=`dec_addr $1` | |
| A2=`dec_addr $2` | |
| A3=`dec_addr $3` | |
| TARGET="0x$2" # an address | |
| PREV=`expr $A1 - $A2` # offset to previous symbol | |
| NEXT=+`expr $A3 - $A2` # offset to next symbol | |
| OVERFLOW=+`printf "0x%x" ${PREV}` # overflow offset to previous symbol | |
| } | |
| # We have to decode symbol addresses to get correct offsets. | |
| # If the offset is not an instruction boundary, it cause -EILSEQ. | |
| set_offs `grep -A1 -B1 ${TARGET_FUNC} /proc/kallsyms | cut -f 1 -d " " | xargs` | |
| UINT_TEST=no | |
| # printf "%x" -1 returns (unsigned long)-1. | |
| if [ `printf "%x" -1 | wc -c` != 9 ]; then | |
| UINT_TEST=yes | |
| fi | |
| echo 0 > events/enable | |
| echo > kprobe_events | |
| echo "p:testprobe ${TARGET_FUNC}" > kprobe_events | |
| echo "p:testprobe ${TARGET}" > kprobe_events | |
| echo "p:testprobe ${TARGET_FUNC}${NEXT}" > kprobe_events | |
| ! echo "p:testprobe ${TARGET_FUNC}${PREV}" > kprobe_events | |
| if [ "${UINT_TEST}" = yes ]; then | |
| ! echo "p:testprobe ${TARGET_FUNC}${OVERFLOW}" > kprobe_events | |
| fi | |
| echo > kprobe_events | |
| clear_trace |