#!/bin/sh
# DF-4064 phase 3: phased cycle:
#  1. `up` arms fxp_stat_timer (fxp_init:1886)
#  2. quiet 1.2s -> timer FIRES (self-rearms); a background M-storm
#     (`ifconfig fxp0` dumps = netisr-held serializer sections) keeps
#     netisr busy so the parked fxp_tick (softclock, same cpu) cannot run
#  3. one `down` stopper entry -> fxp_stop:1577 callout_stop sees the tick
#     INPROG-parked -> sleeps 'costp' holding the serializer; the tick sleeps
#     'slize' wanting that serializer -> permanent AB-BA wedge.
LOG=/root/fxp_race3.log
CON=/dev/console
echo "=== fxp race3 start $(date) ===" > $CON
echo "=== fxp race3 start ===" > $LOG
cyc=0
while [ $cyc -lt 20 ]; do
  cyc=$((cyc+1))
  echo "-- cycle $cyc" > $CON
  ifconfig fxp0 up 2>/dev/null
  ( while :; do ifconfig fxp0 >/dev/null 2>&1; done ) &
  MP=$!
  sleep 1.2
  ifconfig fxp0 down 2>/dev/null &
  sleep 0.6
  if ps -axao wchan 2>/dev/null | grep -q costp; then
    echo "=== WEDGE DETECTED cycle=$cyc (costp) ===" > $CON
    echo "=== WEDGE DETECTED cycle=$cyc ===" >> $LOG
    ps -axao pid,stat,wchan,comm > $CON 2>&1
    ps -axao pid,stat,wchan,comm >> $LOG 2>&1
    echo "=== END WEDGE SNAPSHOT ===" > $CON
    exit 0
  fi
  kill $MP 2>/dev/null
  pkill ifconfig 2>/dev/null
  sleep 0.5
done
echo "=== NO WEDGE in 20 cycles ===" > $CON
echo "=== NO WEDGE in 20 cycles ===" >> $LOG
