roadmap: detector twins FUN_180535880/180536f90 decoded, per-stub dispatch tables

This commit is contained in:
2026-08-17 20:40:18 +03:00
parent b1b4f2bdf7
commit 8e08ecf7e5
+37
View File
@@ -268,3 +268,40 @@
- План: разметить таблицу → извлечь байты функций 0x18004xxxx (+0x18000a160..0x180074740)
→ objdump 0x180000000-adjust → транскрипция в dsp/detect.cpp → верификация SNR 19.8 дБ.
- Непустые ранее известные ядра (0x180040cc0..0x180041700) = 8 функций = полный алгоритм детектора.
### B.6 — ДЕТЕКТОР ПОЛНОСТЬЮ ДЕШИФРОВАН (2026-08-17) — dispatch-модель ИСПРАВЛЕНА
- **ИСПРАВЛЕНИЕ dispatch**: у КАЖДОГО стаба СВОЯ таблица (не одна общая 0x182616008).
Все стабы читают ОДИН глобальный индекс `DAT_1826159a0` (в дампе = 4, константа), но
каждый берёт свой слот из своей таблицы (RIP-rel `48 63 05/4c 8d 15/41 ff 24 c2`).
`/tmp/dispatch_map.txt` (223 записи одной таблицы) — УСТАРЕЛ для вызовов детектора.
- **Карта стабов FUN_180535880 (float-детектор)**: `0x180001d00`→tbl`0x182616008``0x180040d40`
(AVX-memset); `0x1800019a0`→tbl`0x182615b88``0x180004200``0x181a63fe0` (fill float N штук
значением из xmm0: rcx=bits, rdx=dst, r8d=N; ветка больших через 0x180017580);
`0x1800021e0`→tbl`0x182616688``0x1800130e0`; `0x1800018b0`→tbl`0x182615a48``0x180003040``0x181a557c0`;
`0x180001af0`→tbl`0x182615d48``0x180005a20`; `0x180001dc0`→tbl`0x182616108``0x18000ad60`
(комплексное умножение `vfmaddsub213ps`); `0x180001fd0`→tbl`0x1826163c8``0x18000f620`
(векторная FMA-аккумуляция `out[i]=out[i]+xmm1*in[i]`, AVX2, развёртка по 8);
`0x180001e20`→tbl`0x182616188``0x18000b820``0x181a775a0`.
- **FUN_180536f90 = DOUBLE-БЛИЗНЕЦ FUN_180535880** (тот же 3-итерационный цикл, `movsd`/`shl 4`
против `movss`/`shl 3`): `0x180001a30``0x180004d60`; `0x1800022d0``0x180015300``0x180040d40`;
`0x180001e80``0x18000c7e0`; `0x180001910``0x1800034c0``0x181a62d00`; `0x180001ac0``0x180005720`;
`0x180001e50``0x18000bba0`; `0x180002150``0x180012320` (double-FMA-аккум);
`0x180001f40``0x18000df20``0x181a78060`.
- **Алгоритм FUN_180535880** (rcx=this, rdx=r15=out, r8={double* A, double* B} по 3 double,
r9→[rsp+0x20], [rsp+0xf0]=N): читает A[0..2]/B[0..2], cvtpd2ps→стек [0x28..0x40];
r13=2N, r12=r15+N*8, rbp=r15+2N*8. Цикл i=0..2:
- i=0: memset r15 (N qword) значением (A0,0); memset r12 (N qword) значением (B0,0);
- i=1: rbx=r15+3N*8; fill rbx (N float) константой 0x1824c3ea4; затем 0x1800021e0(rbx,r9,this,N),
0x1800018b0(this,N), 0x180001af0(this,rbp,N);
- i=2: 0x180001dc0(this,rbp,rbp,N) = комплексное умножение rbp на самого себя;
- (после каждого i): rbp += A[i]*r15 (0x180001fd0, 2N float) и rbp += B[i]*r12;
- после цикла: 0x180001e20(r12,r15,this,N).
- **Ключевые ядра (реальные .text/0x181a*)**: `0x180040d40`=AVX memset по qword-паттерну (798б);
`0x181a63fe0`=fill N*4 байт широковещательным 32-бит значением (AVX2, up to 0x8000);
`0x18000f620`=FMA-аккум (scalar+ymm+tail, возврат -8/-6 при null/0);
`0x18000ad60`=комплексное умножение (vfmaddsub213ps, цепочки xmm/ymm, маска-зоны 0x20 байт);
`0x180005a20`=обёртка больших chunk`ов (0x7fffffe0 по 8байт) вокруг 0x18001a5a0.
- **Конечные артефакты**: `/tmp/det/det_535880.bin/.dis` (1668б, 435 стр), `det_536f90.bin/.dis`
(1935б, 582 стр), `r_*/f_*/p_*` для всех ядер, `sizes.json`.
- **Следующий шаг**: транскрипция обоих близнецов в dsp/detect.cpp (или dsp/detector.cpp)
с точным порядком float/double операций + комплексного умножения rbp; верификация SNR 19.8 дБ.