Files
lumia-emulator/docs/sbl-bringup.md
T
2026-09-12 10:30:18 +00:00

4.6 KiB
Raw Blame History

SBL1 BringUp — статус (2026-09-07)

Цель: выполнить оригинальный SBL1 (RM-1127) в QEMU до баннера SBL1, Start на UART.

Что работает

  • Машина saimaa (qemu/saimaa.c, QEMU 8.2.2 на zern): Cortex-A7×4, DDRLOW/OCIMEM/IMEM/SMEM/RPM/mystrom, UARTDM-стаб, SDHCI+eMMC 8GiB, VFP/NEON вкл (CPACR+NSACR+FPEXC), null-page trap, fault-tolerant векторы.
  • eMMC-образ с реальной GPT RM-1127 (33 раздела, tools/mkimage.py).
  • FFU-разбор (tools/ffu_parse.py, RKH/MSM/OEM/PlatformID, GPT33).
  • .edp-нарезка ELF (tools/edp_carve.py, 10 образов, fw/sbl/ в .gitignore).
  • tools/sbl_patch.py — воспроизводимо генерирует img0_bl..b10.elf из img0.elf.
  • Стаблеты компенсации pop (qemu/stublets.S → 0x08062000): чинят SP, повторы попадают в те же слоты. Слоты в saimaa_machine_init.
  • Указательный maze (0x08062100) + scratch (0x08070000) для struct-цепочек.
  • Трассировка: -d in_asm,cpu,guest_errors,int + GDB (только чтение! continue в batch виснет — использовать interrupt+detach).

Найденное

  • sbl_main (Thumb) = 0x802f63e, баннер SBL1, Start зовётся из 0x802f6ae через bl 0x8016320. Poll IMEM 0x08600944 != 0x53444247 (выходит при 0).
  • В .edp-копии вызовы blx imm ведут в Thumb-код (на HW тоже; QEMU уходит в ARM → патчим в bl, см. sbl_patch.py). Часть вызовов off-by-2/4 (таблица 0x8013aa8, bl 0x8018a780x8018a7c).
  • FFU-копия SBL1 — другая сборка тех же исходников (структура та же, bl вместо blx, полные фреймы). Используется как эталон.
  • PBL-контекст (r4-r12) фабрикуется машиной; таблицы собираются частично.
  • Текущий фронтир (b10 + canonical scaffold): ~20 уровней init, падеж в районе 0x80079xx (див switch по мусорным флагам) — см. свежий трейс.

Запуск

./tools/sbl_patch.py fw/sbl/img0.elf /tmp/p
~/qemu-src/qemu-8.2.2/build/qemu-system-arm \
  -M saimaa,sbl1=/tmp/p/img0_b10.elf,sblmain=0x802f63f -m 512 \
  -display none -monitor none -serial file:/tmp/uart.log \
  -drive file=/tmp/emmc-test.img,if=sd,format=raw

TODO

  1. Добить баннер (см. свежий in_asm-хвост).
  2. Заменить стаблеты настоящим PBL (нужны дампы с живого тела!).
  3. UEFI (img3, EDK2) — отдельный фронт после SBL1.

b18: S7 и цикл delay-helper (2026-09-12)

Механизм зацикливания (b17, доказан Unicorn-harness tools/sbl_uni.py):

  • sbl_main → delay-функция 0x8013B78 (256-итераций table-walk, bl 0x8017AF4 каждую итерацию) → b14 (0x8017AFC: b.w 0x8005B9E) → helper 0x8005BB0 → выход ldr pc,[sp],#0x14 (0x8005BCA) → S3-слот (0x8013BA5, рестарт).
  • Эпилог delay (0x8013BAC: pop {r3-r7,pc}) снимает 0x18 без push; каждый S3-рестарт съедает 0x18 живого стека. Маршрут: слоты → fill (STUBV → pop pc = maze) → pristine IMEM (нули → null-jump → hook_null → maze → stale lr) → переполнение IMEM (0x8610008).
  • Heap SBL (stm в 0x8006684) затирает maze/S6/banner (0, 0x7a, STUBV). QEMU: dstub-overlay [0x08006B80,0x08006C50) (read = снапшот ELF+стабы, write = игнор). Uni: deferred-restore guard (MEM_WRITE-хук срабатывает ДО записи, restore надо делать в hook_code!).
  • Maze-blob: movs r0,#0; lsr ip,lr,#24; cmp #8; bne hang; bx lr (возврат 0 только для lr из DDRLOW 0x08..., иначе hang). Фикс b18: патч BAC (f8bd0a4af3f730b8, b.w S7) + S7-стаблет (52B @ 0x08006C10): cmp r4,#0xff → iterate (0x8013BA5) или done (restore r4/r5/sl/fp, возврат в sbl_main 0x802f681). BAE-путь ([r7]==2) принесён в жертву (r7=0, недостижим). Фронтир b18: sbl_main возвращается, новый код 0x801Bxxx (strb [r7,#2]-паттерн, b17-NOP на 0x801B71E), падеж pop'ом пустого стека у верха IMEM — следующий фронт.