#!/bin/bash # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2026 Open-IOV contributors # 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