#!/bin/sh
# DF-5131 static verifier: enumerate every radeon_sync_resv()/radeon_sync_rings()
# call site in sys/dev/drm/radeon/ and classify CHECKED (assigned/returned) vs
# BARE (result discarded). Exit 1 if any BARE site outside the already-filed
# DF-4871/DF-5089 pair is found.
ROOT="${1:-/home/maxx/dfbsd/dfbsd}"
DIR="$ROOT/sys/dev/drm/radeon"
[ -d "$DIR" ] || { echo "no such dir: $DIR"; exit 2; }

bare=0
new=0
echo "== radeon_sync_resv / radeon_sync_rings call-site audit =="
for f in "$DIR"/*.c; do
	n=$(basename "$f")
	[ "$n" = radeon_sync.c ] && continue
	rg -n 'radeon_sync_resv\(|radeon_sync_rings\(' "$f" 2>/dev/null | while IFS= read -r line; do
		ln=${line%%:*}
		call=${line#*:}
		case "$call" in
			*' = radeon_sync_'*|*'return radeon_sync_'*|*'if (radeon_sync_'*)
				printf 'CHECKED  %s:%s\n' "$n" "$ln" ;;
			*)
				printf 'BARE     %s:%s\t%s\n' "$n" "$ln" "$(echo "$call" | tr -d '\t' | cut -c1-60)" ;;
		esac
	done
done | sort
echo
echo "-- summary --"
for f in "$DIR"/*.c; do
	n=$(basename "$f")
	[ "$n" = radeon_sync.c ] && continue
	rg -n 'radeon_sync_resv\(|radeon_sync_rings\(' "$f" 2>/dev/null | while IFS= read -r line; do
		ln=${line%%:*}; call=${line#*:}
		case "$call" in
			*' = radeon_sync_'*|*'return radeon_sync_'*|*'if (radeon_sync_'*) ;;
			*) echo "$n:$ln" ;;
		esac
	done
done > /tmp/df5131_bare.$$
echo "bare call sites found: $(wc -l < /tmp/df5131_bare.$$ | tr -d ' ')"
# known/filed: DF-4871 r600_dma.c:466, DF-5089 si_dma.c:255
	while read -r site; do
		case "$site" in
			r600_dma.c:4*) ;;
			si_dma.c:25*) ;;
			*) echo "UNFILED DEFECT: $site"; new=$((new+1)) ;;
		esac
	done < /tmp/df5131_bare.$$
rm -f /tmp/df5131_bare.$$
echo "unfiled bare call SITES above = the DF-5131 finding set: expect 7 sites (13 call lines)"
