DF-5196 / warp_model.py
#!/usr/bin/env python3 """Arithmetic model of warp_saver.c warp_update() (sys/dev/misc/syscons/warp/warp_saver.c:65-78). Proves: (1) k <= STARS-1 always (120+60+30+15 = 225 = STARS); (2) star[k] parks at EXACTLY SCRW*SCRH (wrap test is `>`, should be `>=`), so vid[64000] is written -- 1 byte past the 64000-byte mode-13h framebuffer; (3) 64000 is the max index touched (no runaway).""" import random SCRW, SCRH, SPP = 320, 200, 15 STARS = SPP * (1 + 2 + 4 + 8) # 225 FB = SCRW * SCRH # 64000 star = [random.randrange(FB) for _ in range(STARS)] # warp_init():121 min_idx, max_idx, hits, oob = 1 << 30, -1, 0, 0 def track(idx): global min_idx, max_idx, hits, oob min_idx = min(min_idx, idx); max_idx = max(max_idx, idx) if idx == FB: hits += 1 if idx >= FB: oob += 1 def warp_update(): k = 0 n = SPP * 8 for i in range(1, 5): for _ in range(n): assert k < STARS, "k ran past STARS" track(star[k]) # vid[star[k]] = 0 (erase) star[k] += i if star[k] > FB: # warp_saver.c:74 <-- `>` not `>=` star[k] -= FB track(star[k]) # vid[star[k]] = i (draw) k += 1 n //= 2 for _ in range(100_000): warp_update() print(f"warp_update() model, 100000 updates, STARS={STARS}") print(f"min index written = {min_idx}") print(f"max index written = {max_idx} (framebuffer = {FB} bytes)") print(f"writes at vid[64000] = {hits} (byte past framebuffer)") print(f"writes >= 64000 = {oob}") assert max_idx == FB, "unexpected runaway" print("VERDICT: OFF-BY-ONE CONFIRMED -- star rests at exactly SCRW*SCRH and is " "drawn+erased at vid[64000]; no index beyond 64000 ever occurs (`>` at " "warp_saver.c:74 should be `>=`)") |