From b6e7fdc289f27e71b13a7059d6f3a3c4d077c2bf Mon Sep 17 00:00:00 2001 From: Matiq Date: Wed, 26 Aug 2026 15:46:31 +0300 Subject: [PATCH] 24mm13-add3: live per-stage dumps (CIN/COUT/AIN/AOUT); op-A confirmed b=|z| pairs; cascade input is accumulated signed state, NOT exp(scr) --- handoff/NOTES_LEVEL.md | 15 +++++++++ scripts/wine_ptrace_trace.py | 61 ++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index 739e49e..5058e14 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -4347,3 +4347,18 @@ for i: E[i] = fma(re,re, im*im), где re=bands[2i], im=bands[2i+1] Решение с гарантией: добавить в tracer брейкпоинты вход/выход 529c60 и вход/выход 16140 — точные состояния bands/track до и после каждого блока. (Инфраструктура готова, адреса известны; следующий раунд.) + +### 24mm13-доп3: пер-стадийные дампы живьём — op A подтверждён, вход каскада ≠ exp(scr) +Трассировщик получил брейкпоинты CIN/COUT (вход/выход 529c60) и +AIN/AOUT (вход/выход 16140, возврат 332c). Живые факты (comb_b1234): +``` +AIN: a(rcx)=кривая состояния, ЗНАКОВАЯ, |max|=57.6 (НЕ exp(scr)!) + b(rdx)=единичный буфер (init 1.0) +AOUT: a — без изменений (16140 вход не трогает) + b[i] = |z_i| ТОЧНО (пары a[2i],a[2i+1]) — магнитуды подтверждены +CIN/COUT: track между входом и выходом каскада меняется предсказуемо. +``` +⇒ Вход детектора — НАКОПЛЕННОЕ СОСТОЯНИЕ (знаковая кривая с амплитудами +до десятков), а не текущий спектр. Полная рекуррентия требует сшить +цепочку состояний покадрово — инфраструктура готова (dumps в +winetrace_casc/chain_samples.pkl, kind∈{CIN,COUT,AIN,AOUT,COPY,EXP,DF0}). diff --git a/scripts/wine_ptrace_trace.py b/scripts/wine_ptrace_trace.py index 612f2d1..97954bf 100644 --- a/scripts/wine_ptrace_trace.py +++ b/scripts/wine_ptrace_trace.py @@ -33,6 +33,10 @@ BP_DIV = 0x1803a06a0 BP_DC40 = 0x1800dc40 BP_EXPVAR = 0x1802dc0e0 BP_FN = 0x180529fe0 +BP_CIN = 0x180529c60 +BP_COUT = 0x180529ee1 +BP_AIN = 0x180016140 +BP_AOUT = 0x18000332c CTX_SLOTS = {'scr': 0x540628, 'trk': 0x540688, 'cur': 0x540678, 'fir_ptr': 0x540668} @@ -275,7 +279,9 @@ def main(): for name, addr in (('COPY', BP_COPY), ('EXP', BP_EXP), ('DF0', BP_DF0), ('DF0RET', BP_DF0RET), ('TRACKSAVE', BP_TRACKSAVE), ('DIV', BP_DIV), ('DC40', BP_DC40), - ('EXPVAR', BP_EXPVAR), ('FN', BP_FN)): + ('EXPVAR', BP_EXPVAR), ('FN', BP_FN), + ('CIN', BP_CIN), ('COUT', BP_COUT), + ('AIN', BP_AIN), ('AOUT', BP_AOUT)): if not mapped(addr): print('!! %s@%#x не смапплен — пропуск' % (nm_ := name, addr), flush=True) continue @@ -292,9 +298,11 @@ def main(): samples = [] hits = {'COPY': 0, 'EXP': 0, 'DF0': 0, 'DF0RET': 0, 'TRACKSAVE': 0, - 'DIV': 0, 'DC40': 0, 'EXPVAR': 0, 'FN': 0} + 'DIV': 0, 'DC40': 0, 'EXPVAR': 0, 'FN': 0, + 'CIN': 0, 'COUT': 0, 'AIN': 0, 'AOUT': 0} track_by_tid = {} track_dumps = [] + regs_by_tid = {} t_start = time.time() def snapshot_slots(rec): @@ -402,6 +410,55 @@ def main(): continue if kind == 'DF0': track_by_tid[pid] = regs.rdx + if kind in ('CIN','COUT'): + key='cin_%d'%pid if kind=='CIN' else 'cout_%d'%pid + if kind=='CIN': + regs_by_tid[pid]=dict(rdx=regs.rdx,r12=regs.r12, + rcx=regs.rcx) + rec_s={'kind':kind,'tid':pid,'t':round(time.time()-t_start,4)} + try: + bp=regs_by_tid.get(pid,{}) + trk=bp.get('rdx',0) + if trk>0x10000: + rec_s['trk']=rd_f32(trk,4100) + # все кривые bands из таблицы ctx+0x540678 (до 4 полос) + for bi in range(4): + p=rd_q(ctx+0x540678+8*bi) + if p>0x10000: + rec_s['bands%d'%bi]=rd_f32(p,2050) + except OSError as e: + rec_s['err']=str(e) + samples.append(rec_s); hits[kind]+=1 + poke(pid, site, (peek(pid, site) & ~0xFF) | obyte) + regs.rip = site + setregs(pid, regs) + pt(PTRACE_SINGLESTEP, pid, 0, 0) + os.waitpid(pid, __WALL) + poke(pid, site, (peek(pid, site) & ~0xFF) | 0xCC) + pt(PTRACE_CONT, pid, 0, 0) + continue + if kind in ('AIN','AOUT'): + key='a_%d'%pid + if kind=='AIN': + regs_by_tid[pid]=dict(rcx=regs.rcx,rdx=regs.rdx) + rec_s={'kind':kind,'tid':pid,'t':round(time.time()-t_start,4)} + try: + bp=regs_by_tid.get(pid,{}) + for nm,kk in (('a',bp.get('rcx',0)),('b',bp.get('rdx',0))): + if kk>0x10000: + rec_s[nm]=rd_f32(kk,4100) + rec_s['n']=regs.r8&0xFFFFFFFF if kind=='AIN' else None + except OSError as e: + rec_s['err']=str(e) + samples.append(rec_s); hits[kind]+=1 + poke(pid, site, (peek(pid, site) & ~0xFF) | obyte) + regs.rip = site + setregs(pid, regs) + pt(PTRACE_SINGLESTEP, pid, 0, 0) + os.waitpid(pid, __WALL) + poke(pid, site, (peek(pid, site) & ~0xFF) | 0xCC) + pt(PTRACE_CONT, pid, 0, 0) + continue if kind == 'DF0RET': tp = track_by_tid.get(pid) rec_r = {'kind': 'DF0RET', 'tid': pid,