1.本文借用spi案例进行kprobe的使用讲解
设备上利用cat /proc/kallsyms | grep "dspi_fifo_write"命令获取到dspi_fifo_write函数的起始地址为ffffffc0086c7130 t dspi_fifo_write,
然后利用aarch64-none-linux-gnu-objdump -D /home/zeekr/code/test/vmlinux | grep “ffffffc0086c7130” -A 100命令得到部分汇编代码如下所示
ffffffc0086c7130 <dspi_fifo_write>:
ffffffc0086c7130: d503201f nop
ffffffc0086c7134: d503201f nop
ffffffc0086c7138: d503233f paciasp
ffffffc0086c713c: a9bc7bfd stp x29, x30, [sp, #-64]!
ffffffc0086c7140: d5384101 mrs x1, sp_el0
ffffffc0086c7144: 910003fd mov x29, sp
ffffffc0086c7148: a90153f3 stp x19, x20, [sp, #16]
ffffffc0086c714c: aa0003f3 mov x19, x0
ffffffc0086c7150: a9025bf5 stp x21, x22, [sp, #32]
ffffffc0086c7154: f942f022 ldr x2, [x1, #1504]
ffffffc0086c7158: f9001fe2 str x2, [sp, #56]
ffffffc0086c715c: d2800002 mov x2, #0x0 // #0
ffffffc0086c7160: f9403c01 ldr x1, [x0, #120]
ffffffc0086c7164: a943d815 ldp x21, x22, [x0, #56]
ffffffc0086c7168: b9400834 ldr w20, [x1, #8]
ffffffc0086c716c: 97fffc6a bl ffffffc0086c6314 <dspi_setup_accel>
ffffffc0086c7170: b940aa60 ldr w0, [x19, #168]
ffffffc0086c7174: f9402e62 ldr x2, [x19, #88]
ffffffc0086c7178: 0b547e83 add w3, w20, w20, lsr #31
ffffffc0086c717c: 93407c04 sxtw x4, w0
ffffffc0086c7180: 7100101f cmp w0, #0x4
ffffffc0086c7184: 13017c63 asr w3, w3, #1
ffffffc0086c7188: aa1503e1 mov x1, x21
ffffffc0086c718c: 1a940074 csel w20, w3, w20, eq // eq = none
ffffffc0086c7190: b94036c3 ldr w3, [x22, #52]
ffffffc0086c7194: 9ac40842 udiv x2, x2, x4
ffffffc0086c7198: 6b02029f cmp w20, w2
ffffffc0086c719c: 1a82b294 csel w20, w20, w2, lt // lt = tstop
ffffffc0086c71a0: 1b147c02 mul w2, w0, w20
ffffffc0086c71a4: 0b020060 add w0, w3, w2
将汇编代码与dspi_fifo_write函数对应起来执行
cd /sys/kernel/debug/tracing/
echo ‘p dspi_fifo_write+168 %x2’ > /sys/kernel/debug/tracing/kprobe_events,
168为offset,即为num_fifo_entries相对dspi_fifo_write函数起始位置的偏移,x2为当时存储num_fifo_entries值的寄存器(这部分需要参考汇编理解)
echo 1 > tracing_on
echo 1 > events/kprobes/p_dspi_fifo_write_168/enable
然后执行/opt/zkos/userdata/spidev_test -D /dev/spidev1.0 -v -p 123456 & /opt/zkos/userdata/spidev_test -D /dev/spidev5.0 -v -p 654321命令出发探测点
利用cat trace命令看到
cat trace
tracer: nop
entries-in-buffer/entries-written: 2/2 #P:4
_-------=> irqs-off
/ _------=> need-resched
| / _-----=> need-resched-lazy
|| / _----=> hardirq/softirq
||| / _—=> preempt-depth
|||| / _–=> preempt-lazy-depth
||||| / _-=> migrate-disable
|||||| / delay
TASK-PID CPU# ||||||| TIMESTAMP FUNCTION
| | | ||||||| | |
spidev_test-435 [001] d...1.. 168.511663: p_dspi_fifo_write_168: (dspi_fifo_write+0xa8/0x1e4) arg1=0x6
spidev_test-438 [001] d...1.. 180.229441: p_dspi_fifo_write_168: (dspi_fifo_write+0xa8/0x1e4) arg1=0x6
其中arg1即为num_fifo_entries值