blob: 0a292e4b3cacde1f69abc35298485b28bed42fe2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#!/bin/bash
# inject_tracker.sh - find the libcuda tracker slot the stuck cdt is polling,
# translate its page through the guest pagemap, pin the mapping in the service.
set -u
cd "$(dirname "$(readlink -f "$0")")/../.."
OUT=$(timeout 100 ./scripts/vgpu_vm.py exec --timeout 90 'PID=$(pgrep -x cdt | head -1); B=$(sudo grep libcuda.so.570.144 /proc/$PID/maps | head -1 | cut -d- -f1); sudo timeout -s KILL 70 gdb -p $PID -batch -ex "set pagination off" -ex "set confirm off" -ex "break *(long)(0x$B+0x3c7970)" -ex "continue" -ex "set \$p2 = *(unsigned long*)(\$rdi+0x20)" -ex "set \$vp = *(unsigned long*)(\$p2+0x10)" -ex "printf \"VALPTR=0x%lx EXPECTED=%lu PID=%d\n\", \$vp, \$rsi, $PID" -ex "detach" 2>&1; sudo kill -CONT $PID' 2>/dev/null)
LINE=$(echo "$OUT" | grep "VALPTR=" | head -1)
VALPTR_HEX=$(echo "$LINE" | sed -n 's/.*VALPTR=0x\([0-9a-f]*\).*/\1/p')
PID=$(echo "$LINE" | sed -n 's/.*PID=\([0-9]*\).*/\1/p')
[ -n "$VALPTR_HEX" ] || { echo "NO VALPTR FOUND"; echo "$OUT" | tail -3; exit 1; }
echo "valptr=0x$VALPTR_HEX pid=$PID"
PA=$(timeout 40 ./scripts/vgpu_vm.py exec --timeout 35 "sudo python3 -c \"
import os
pid=$PID
va=0x$VALPTR_HEX
fd=os.open('/proc/%d/pagemap'%pid, os.O_RDONLY)
os.lseek(fd, (va//4096)*8, 0)
e=int.from_bytes(os.read(fd,8),'little')
os.close(fd)
pfn=e & ((1<<55)-1)
print('PA=0x%x'%((pfn<<12)|(va&0xfff)))
\"" 2>/dev/null | grep -o 'PA=0x[0-9a-f]*' | head -1 | sed 's/^PA=//')
[ -n "$PA" ] || { echo "NO PA FOUND"; exit 1; }
echo "target pa=$PA"
sudo sh -c "echo 0x$VALPTR_HEX,$PA > /sys/module/vgsp/parameters/sema_map_add" || exit 1
sleep 1
sudo dmesg -T | grep "injected mapping" | tail -1
|