#!/bin/bash # Watch the vk_frame client and fill the completion-slot u16 (base+0x2e) in # every small /dev/nvidiactl rw-s mapping while it waits. cd /tmp rm -f /tmp/slotfill.log (timeout 120 /tmp/vk_frame 1 64 64 5 /tmp 0 > /tmp/vk76.out 2>&1 &) PID="" for i in $(seq 1 100); do PID=$(pgrep -x vk_frame | head -1); [ -n "$PID" ] && break; sleep 0.1; done echo "pid=$PID" >> /tmp/slotfill.log END=$((SECONDS+60)) while [ $SECONDS -lt $END ]; do [ -d /proc/$PID ] || break for m in $(grep 'nvidiactl' /proc/$PID/maps | awk '$2 ~ /rw-s/ {print $1}'); do lo=${m%-*}; hi=${m#*-} size=$((0x$hi - 0x$lo)) [ $size -gt 65536 ] && continue off=$((0x$lo + 0x2e)) v=$(dd if=/proc/$PID/mem bs=1 skip=$off count=2 2>/dev/null | xxd -p) if [ "$v" = "ffff" ]; then printf '\x00\x00' | dd of=/proc/$PID/mem bs=1 seek=$off count=2 conv=notrunc 2>/dev/null echo "$(date +%s.%N) FILL $m+0x2e was ffff" >> /tmp/slotfill.log fi done sleep 0.2 done echo "done" >> /tmp/slotfill.log echo "=== client ===" cat /tmp/vk76.out echo "=== fills ===" grep -c FILL /tmp/slotfill.log