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.
83 lines
7.4 KiB
Markdown
83 lines
7.4 KiB
Markdown
# 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](BLOBS.md). qhypstub — open source (github.com/msm8916-mainline/qhypstub), можно собрать самому;
|
||
наш бинарник взят из того же набора, что на JZ02, его точная upstream-ревизия не установлена — сверяйте sha256.
|