diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index 1b4fffa..85e8e6e 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -2475,3 +2475,30 @@ dispatcher, bidir} при подтверждённых рендерах и 8–1 Следующий шаг: в fnexec логировать КАЖДЫЙ stop (rip,dr6,pid) без фильтра + счётчик всех SIGTRAP; если трапов нет вообще на тредах, которые заведомо выполняют модульный код — сравнивать /proc/pid/task состав до/после. + +### 23m (финал раунда): трассировка под wine — аномалия доставки зафиксирована +Серией прогонов с ПОЛНЫМ логом остановок установлено: за 14 c живого хоста +tracer видит ~1 остановку (не от наших DR), хотя 8+ тредов армированы +exec-watch на тела дизайна/диспетчер/bidir с верифицированной записью DR +(drprobe.py: все poke ok, readback точный) и микротестом доставки на +нативном треде (dtest.py — работает). Треды wine при этом выполняют модульный +код (рендер происходит). Вывод: доставка DR-trap'ов от wine-тредов в наш +waitpid-цикл не работает в этой конфигурации (кандидаты: wine сам использует +DR/GetThreadContext, wow64-переключения, либо события теряются из-за +групповых остановок). Отладочный вывод сохранён в fnexec/hits.json. +### Достижения раунда (суммарно, 23h–23m) +1. Доказано: цепь строится ОДИН РАЗ на param-change (<100 мс окно), steady + render её не вызывает — транскрипция: rebuild только на setParams. +2. Все 390 статических ссылок на таблицу слотов учтены; скрытого читателя нет. +3. HW exec-bp методология верифицирована end-to-end (dtest) — инструмент готов, + осталась аномалия доставки под wine. +4. rendersnap.py — рабочий канал снятия ЛЮБЫХ внутренних состояний плагина + (уже дал формулу FIR=exp(0.984·scratch), масштаб ×1.805, q-серию). +### Дорога к bit-exact (порядок) +1. G(band,res): q-серия есть; добавить am-серию со стабилизацией фаз; + аппроксимировать и проверить на hold-out. +2. Потребитель/×1.805: (а) полный декод init-семьи 52e9b0–531xxx (param-time + строитель — потребитель рядом); (б) либо повторить DR-охоту после решения + аномалии доставки (например, трассировать через PTRACE_SEIZE опции или + perf_event_open с breakpoint типом HW). +3. RT_FIRCONV=1 + контрольные числа dual + гейт корпуса. diff --git a/scripts/fnexec.py b/scripts/fnexec.py index bbf1193..801ceb0 100644 --- a/scripts/fnexec.py +++ b/scripts/fnexec.py @@ -74,6 +74,7 @@ def main(): print('NO HOST') return 1 print('host %d at %.2fs' % (host, time.time() - t0), flush=True) + fd = os.open(f'/proc/{host}/mem', os.O_RDONLY) # EARLY arm: exec watch on DESIGN bodies (inherited by future clones) fd0 = os.open(f'/proc/{host}/mem', os.O_RDONLY) @@ -127,6 +128,7 @@ def main(): print('armed %d/%d tids' % (len(armed), len(seized)), flush=True) n0 = n1 = 0 + STOPLOG=[] samples = [] t_end = time.time() + DUR last_sweep = 0.0 @@ -151,6 +153,9 @@ def main(): time.sleep(0.001) if arm(tid): armed.add(tid) + d0=pt(PTRACE_PEEKUSER,tid,DR_BASE) + d7=pt(PTRACE_PEEKUSER,tid,DR7_OFF) + print(' tid %d dr0=%#x dr7=%#x'%(tid,d0 or 0,d7 or 0),flush=True) try: pt(PTRACE_CONT, tid, 0, 0) except OSError: @@ -162,6 +167,21 @@ def main(): if pid == 0: time.sleep(0.0004) continue + ent=[round(time.time()-t0,3), pid, hex(status)] + if os.WIFSTOPPED(pid) and (status>>8)==5: + rg=UserRegs() + if pt(PTRACE_GETREGS,pid,0,ctypes.addressof(rg)) is not None: + ent+= [rg.rip, pt(PTRACE_PEEKUSER,pid,DR_BASE+48)] + # auto-dump arrays on design hits + if rg.rip in (0x1802A24C0,0x1802FA420): + def dmp(ptr): + try: + b=os.pread(fd,2049*4,ptr) + return np.frombuffer(b,dtype='> 8 if os.WIFEXITED(status) or os.WIFSIGNALED(status): continue @@ -222,8 +242,8 @@ def main(): print('hits: 529fe0=%d loop=%d render_fresh=%s armed=%d/%d' % (n0, n1, fresh, len(armed), len(seized))) import json - json.dump(samples[:300], open('/tmp/opencode/fnexec/hits.json', 'w'), - indent=1, default=str) + json.dump(dict(samples=samples[:300], stops=STOPLOG[:4000]), + open('/tmp/opencode/fnexec/hits.json', 'w'), indent=1, default=str) proc.kill() return 0