Files
dolphin/docs/Wii_Starlet_Bootstrap.md
T
Yaya48 54f5a74bbf Track exact StarletOS bootstrap integration and checkpoint provenance
Recover 16 modified and 6 previously untracked integration files. All 22 source SHA-256s match the pre-publication StarletOS snapshot. Add handoff instructions, byte-preserving attributes and private backup exclusion. This commit publishes existing behavior; it does not claim a new full build or hardware qualification. The two preceding local commits and staged files were screened before publication.
2026-10-03 16:27:07 +02:00

4.8 KiB

Starlet Rust bootstrap in this Dolphin fork

This fork can load the Phase 01 Revolution IOS ELF directly into Starlet SRAM. The loader uses the ELF's two PT_LOAD segments, zeroes their uninitialized tails, starts the ARM core at 0xffff0000 in big-endian supervisor mode, and publishes REV_TRACE lines in the IOS log. No boot0, keys, or NAND dump is needed for the standalone probe.

Fast development loop

Build the Rust ELF from starlet-ios-rust:

cargo build --release

Configure this Dolphin fork with ENABLE_TESTS=ON, then build StarletBootstrapProbe. Run the build commands from an x64 Native Tools Command Prompt (or after vcvars64.bat). For the local MSVC configuration:

cmake --build .starlet_msvc2 --target StarletBootstrapProbe
powershell -NoProfile -ExecutionPolicy Bypass -File .\Run-Wii-Starlet-Bootstrap.ps1

The script defaults to the sibling Rust repository's release ELF. It prints every trace line, the stopping PC, and the ARM instruction count; it exits nonzero for a missing marker, fault, or invalid ELF. -JIT exercises the fork's ARM JIT.

To check the panic path without replacing the ordinary release artifact:

cd ..\starlet-ios-rust
cargo build --release --features panic-smoke --target-dir target/panic-smoke
cd ..\dolphin
powershell -NoProfile -ExecutionPolicy Bypass -File .\Run-Wii-Starlet-Bootstrap.ps1 `
  -ELF '../starlet-ios-rust/target/panic-smoke/armebv5te-none-eabi/release/revolution-ios-bootstrap' `
  -ExpectedOutcome Panic

To exercise a Rust fatal check and a synchronous ARM exception, derive two diagnostic ELF copies from the release artifact:

cd ..\starlet-ios-rust
py -3 tools/make_smoke_elf.py target/armebv5te-none-eabi/release/revolution-ios-bootstrap target/phase01-smoke
cd ..\dolphin
powershell -NoProfile -ExecutionPolicy Bypass -File .\Run-Wii-Starlet-Bootstrap.ps1 `
  -ELF '../starlet-ios-rust/target/phase01-smoke/fatal-data.elf' -ExpectedOutcome Fatal
powershell -NoProfile -ExecutionPolicy Bypass -File .\Run-Wii-Starlet-Bootstrap.ps1 `
  -ELF '../starlet-ios-rust/target/phase01-smoke/undefined-entry.elf' -ExpectedOutcome Fault

Each command also accepts -JIT and -FullDolphin. The fatal image changes only the loaded .data probe, producing REV:FATAL:DATA. The exception image replaces the reset branch with an undefined instruction; the fault record reports code 1 and raw LR/SPSR. Both passed in the standalone probe and full Dolphin, with interpreter and JIT, on 2026-09-23. The source release ELF remains unchanged.

The probe uses the actual ARMCore and StarletMemory implementations. It initializes the high SRAM mapping, runs 4096-cycle slices, checks __fault_code, and decodes REV_TRACE. It does not start Broadway, graphics, USB, or a Wii title. The two ELF parser unit tests run with:

cmake --build .starlet_msvc2 --target tests
.starlet_msvc2\Binaries\Tests\tests.exe --gtest_filter=BootstrapELFTest.*

Full Dolphin run

Set Dolphin.General.WiiStarletBootstrapELF to the absolute ELF path and Dolphin.Core.WiiIOSLLE=True. This bypasses the boot0/keys/NAND dump initialization in StarletMemory and starts the loaded program at its ELF entry. To run through DolphinNoGUI using the existing .starlet_user3 Wii profile:

powershell -NoProfile -ExecutionPolicy Bypass -File .\Run-Wii-Starlet-Bootstrap.ps1 -FullDolphin

This mode launches the Wii System Menu title only to initialize the full emulator; the Starlet runtime is the supplied Rust ELF. It uses the Null video backend and headless platform, reads new IOS log lines, and stops its own process after the expected marker. A populated Wii user profile is required for this full frontend path. The standalone probe is the reproducible path for the Phase 01 CPU and SRAM contract.

The accepted ELF is ELF32, big-endian ARM ET_EXEC, entry 0xffff0000, with exactly one executable segment at 0xffff0000 (up to 64 KiB) and one writable segment at 0xfffe0000 (up to 16 KiB). It must expose REV_TRACE, __fault_code, __fault_lr, and __fault_spsr in the data segment's loaded memory span. Rejected images never write to SRAM.

The Rust code reaches REV:BOOT:IDLE in both interpreter and JIT; the panic-smoke image reaches REV:PANIC, and the diagnostic images reach fatal and fault states. All four outcomes pass through the full DolphinNoGUI path. An initial incremental MSVC build crashed before the first slice because HW.cpp still allocated the old Starlet class size; AddressSanitizer identified the overflow. A forced rebuild fixed it, and Starlet::Create now keeps allocation in the same translation unit as the class definition. The CMake configuration also corrects a French MSVC /showIncludes prefix that made Ninja record zero header dependencies. After rebuilding HW.cpp, Ninja records Starlet.h as a dependency.