uzbek-plus/docs/BUILD.md
q 105bef466a Project Aurora: mainline ARM64 Linux on JZ08AU (MSM8916) LTE modem
Sanitized research log, build/reproducibility docs, DTS, kernel configs,
patches, initramfs sources, bootchain migration plans and test logs.
B5 direct boot PASS; B6 modem lifecycle in progress.
No dumps, NV/EFS, vendor firmware or device identifiers included.
2026-09-30 17:23:18 +03:00

7.4 KiB
Raw Blame History

BUILD — воспроизводимая пересборка

Всё ниже собирается из публичных исходников + файлов этого репозитория. Готовые бинарники в репозиторий не кладутся; для сверки даны sha256 наших сборок. Где точная команда в проекте не записывалась — это помечено (не записано): функционально эквивалентный результат получится, побайтовое совпадение не гарантируется.

1. lk2nd / lk1st (lk2nd 23.1)

  • Источник: https://github.com/msm8916-mainline/lk2nd.git, tag 23.1, commit e9c8b21735c13dd7ace808b1e35451638f0a0c6d.
  • Toolchain: arm-none-eabi-gcc 14.2.1 20241119 (Debian 15:14.2.rel1-1), GNU Make 4.4.1, DTC 1.7.2.
  • lk2nd для recovery (fastboot, для RAM boot): см. lk2nd-build/BUILD.md
    make -j$(nproc) TOOLCHAIN_PREFIX=arm-none-eabi- LK2ND_DTBS="msm8916-512mb-mtp.dtb" LK2ND_FORCE_FASTBOOT=1 lk2nd-msm8916
    
    LK2ND_DTBS — относительно lk2nd/device/dts/msm8916 (префикс msm8916/ молча даёт образ без QCDT). Наш out/lk2nd.img sha256 555826ea…d782; с нулями до 16 MiB → 0dfa60a0…11e1.
  • lk1st для aboot (текущий, autoboot = без LK2ND_FORCE_FASTBOOT):
    make -j$(nproc) TOOLCHAIN_PREFIX=arm-none-eabi- LK2ND_BUNDLE_DTB=msm8916-512mb-mtp.dtb lk1st-msm8916
    # подписать выход сборки lk1st тестовым ключом: qtestsign (github.com/msm8916-mainline/qtestsign, commit 0eef3b5), режим `-v 3 aboot`
    # (точный путь входного .mbn в проекте не записан — это emmc_appsboot.mbn из каталога сборки lk1st-msm8916)
    # затем дополнить нулями до размера раздела aboot (1 MiB)
    
    Разница с forced-fastboot вариантом — одна строка config.h (b5a/config.diff). Воспроизводимость проверена: FORCE-сборка дала бит-в-бит прошитый ранее образ (e4addbf8). Наши autoboot: unsigned 33c452e4, signed 7b3fb5b3, pad1M 3b8cd266 (b5a/SHA256SUMS, лог b5a/build-autoboot.log).

2. Ядро Linux 7.2.7 arm64

  • Источник: Linux stable v7.2.7, commit f42acb3678424d1e08f6ed27c0d8ba8a125e14d6 (git.kernel.org stable).
  • Патч: linux/patches/rpmsg_wwan_ctrl-port-race.patch (присвоение wwan_port до rpmsg_create_ept; без него — NULL deref в wwan_port_rx при раннем открытии порта).
  • Toolchain: aarch64-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0. Собирать на локальном диске (virtiofs даёт clock skew).
  • Config: полный итоговый .config каждой стадии — linux/artifacts/<stage>/kernel.config (надёжный якорь); история: defconfig + linux/aurora-ramboot1-v2.config, затем по очереди фрагменты aurora-usb1/emmc1/modem1/qmi1/bam1.config (scripts/kconfig/merge_config.sh поверх предыдущего .config; дельты — linux/ramboot-*.config.diff). MODULES=n.
    git -C linux-stable checkout f42acb3678424d1e08f6ed27c0d8ba8a125e14d6
    patch -p1 < linux/patches/rpmsg_wwan_ctrl-port-race.patch
    mkdir out && cp linux/artifacts/ramboot-mm1/kernel.config out/.config
    make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig
    make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image.gz
    
    Ограничение lk2nd: image_size < 30 MiB (DTB кладётся на 0x81E00000). Наш mm1/bam1: Image.gz 9c20a372…, image_size 0x1680000.

3. DTB

linux/dts/msm8916-jz08-aurora-*.dts — наши DTS поверх upstream msm8916.dtsi/msm8916-pm8916.dtsi из того же дерева 7.2.7. Сборка вне дерева: linux/build-dtb.sh <basename> (cpp + dtc, src = дерево ядра). Golden mm1 использует msm8916-jz08-aurora-bam1.dtb (a10056c5…). Отличия стадий — linux/ramboot-*.dts.diff.

4. initramfs

  • busybox: Debian trixie busybox-static 1:1.37.0-6+b9 arm64 (deb sha256 c833be48…).
  • Пакеты Alpine v3.24 aarch64: точные версии и sha256 — linux/initramfs-*/dl/APK-SHA256SUMS (mm1: 36 пакетов: rmtfs 1.3, qrtr, libqmi/qmi-utils 1.38.0_git20260414, ModemManager 1.25.95_git20260527, dbus, polkit, eudev, modemmanager-udev обязателен). Замыкание зависимостей — linux/*-apk-closure*.txt.
  • linebuf.so (построчная буферизация stdout для логов rmtfs): linux/initramfs-qmi1/src/linebuf.c.
  • Наши файлы: init, root/bin/* (modem-up, mm-up, nv-check, qmi-b3, …), root/etc/passwd|group.
  • Сборка: распаковать .apk (tar.gz) в root/, положить busybox и наши файлы, затем gen_init_cpio linux/initramfs-mm1/initramfs.list | gzip -9 -n > initramfs.cpio.gz (точные флаги сжатия не записаны). initramfs.list перечисляет ровно то, что попадает в образ. Наш mm1: 250bf8ee… (11 944 942 B).
  • Принцип init: первым делом blockdev --setro на все mmcblk* (проверка getro=1), modem FAT монтируется только ro, firmware_class.path=/firmware/image; никаких mount/fsck/mkfs/trim на eMMC.

5. Android boot image (для fastboot boot и раздела boot)

Формат v0, page 2048, kernel = Image.gz + appended DTB (cat Image.gz <dtb> > Image.gz-dtb), ramdisk = initramfs.cpio.gz, cmdline earlycon console=ttyMSM0,115200n8 ignore_loglevel loglevel=8 rdinit=/init (linux/artifacts/*/cmdline.txt). Инструмент сборки (не записано; любой mkbootimg v0). Проверка/распаковка: tools/bootimg.py. Наши: golden aurora-mm1.img 38c960ef…, rescue aurora-emmc1.img 93f61ce7… (в boot — он же + нули до 16 MiB = e9579f33…).

6. Образ cache (ext2 + extlinux) — детерминированный

b5b/mkfs-candidate.sh (mke2fs 1.47.2, фиксированные UUID/hash_seed/время) из b5b/components/ (Image.gz-dtb, aurora-mm1.dtb, initramfs.cpio.gz, cmdline.txt) → cache-extlinux-mm1.img 409bbb11…, ровно 134 217 728 B. Ограничения ext2-драйвера lk2nd (rev ≤ 1, без extents/64bit/flex_bg, FDT обязателен, LF + завершающий \n) — NOTES сессия 26. Перед записью прогоните эмулятор сканирования lk2nd: b5b/emu/ (реальный код lk2nd 23.1 + шимы, список исходников srclist).

7. Бинарники bootchain, которые не собираются здесь

DB410c TZ и qhypstub — см. BLOBS.md. qhypstub — open source (github.com/msm8916-mainline/qhypstub), можно собрать самому; наш бинарник взят из того же набора, что на JZ02, его точная upstream-ревизия не установлена — сверяйте sha256.