Skip to content

build: add ARMv7 Cascadia recovery producers - #82

Open
shaynelegault wants to merge 7 commits into
OrchardLinux:mainfrom
shaynelegault:p105/04-armv7-recovery
Open

shaynelegault wants to merge 7 commits into
OrchardLinux:mainfrom
shaynelegault:p105/04-armv7-recovery

Conversation

@shaynelegault

@shaynelegault shaynelegault commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

ARMv7 builds can resolve native recovery tools and assemble a board-selected Cascadia payload through Orchard's producers. Input records carry the selected architecture, kernel image, loader and tools. ARM64 consumers retain their shared defaults.

The loader validates its checksummed configuration, captures the relocation fields, flushes caches and disables the inherited MMU before copying the initramfs into reserved physical RAM. Assembly clears the watchdog before stack setup. Entry and decompressor bounds remain checked.

Recovery binds the host USB handoff to the observed device and template, then checks the live FDT compatible and Linux boot ID through serial bootstrap and SSH. P105 stages ECM and serial with SFTL modular and manually activated. Python staging excludes versioned config-* directories, whose build-support objects otherwise trip the runtime ELF checks. Runtime executables and extension modules retain the strict architecture and ABI checks.

Validation at 8af730ea:

  • The producer and recovery-tool suites passed 27 focused cases. A regression reproduces the Python ET_REL object that stopped the current native release build. The repaired selector also processed its real ARMv7 base archive, excluding the build-support directory and accepting all 91 ELF files in the resolved runtime closure.
  • The unchanged loader passed its earlier Linux fixture suite, including the protected high-RAM validation case and exact 19,124,158-byte initramfs relocation. Prior head 3efd9e12 passed the complete 697-case local suite with one platform skip. The new exact-head run 42328712306 passed both complete Python suites and native smoke.

P105 hardware qualification remains pending. Host 51ce3cbe transferred both the full public image 2dd9027b382c0b7e2c5e1065a73d14832611e860dbcd801d7fedc551285cabb6 and its 32,580-byte loader/configuration prefix, with endpoint identity checked between transfers. That image produced no visible text or Linux USB. The preserved legacy loader/kernel/recovery pair reached Linux USB and boot text through the same raw iBEC and kloader.

A private diagnostic image (f34eeab02c1d8cb98379bc5acad21cdfcfac727a7c120da5a62b4744724ff9f0) added guarded framebuffer markers to the public loader. Its kernel, DTB, initramfs and configuration matched the public image before host identity binding. The owner observed all seven checkpoints, including the final green marker after initramfs relocation, immediately before the kernel branch. Linux USB still timed out. Runtime-bound image and trigger hashes were recomputed successfully. This locates the observed progress through the loader; kernel execution and the remaining startup failure are unresolved. The diagnostic remains private, and qualification of the submitted image remains pending.

The diagnostic issued zero Linux runtime or storage-helper commands, with NAND programming compiled out. After the owner returned to iOS, five bounded native reads verified the LwVM pair and CRC, the unchanged Linux header, and 40 GiB Data geometry. Temporary entry files were already absent and the connection closed.

The public startup still needs USB serial and authenticated SSH checks on P105. The current native recovery and desktop archives assembled successfully and passed their audits. Omarchy-A #29 still awaits maintainer approval for its GitHub workflow and its own device checks.

The on-device launcher has its own qualification in #84. Minimal Linux #6 and Omarchy-A #29 accompany the distribution contract. Public P105 installation stays gated. P105 is the owner's test board; Henrik or other owners cover other devices.

Proposed changelog text awaits owner approval: ARMv7: build Cascadia recovery payloads and native tools through the distribution producers.

Select ARM/v7 or ARM64 tool recipes explicitly and keep their outputs in
separate caches. Pin Debian's ARMHF BusyBox package and verify each finished
tool's ELF architecture and static linkage. Native builds require a host
whose architecture matches the selected target.

Assisted-by: LLM
Use board-owned handoff data to compile the ARM32 staging loader. Preserve
Cascadia's cache/MMU handoff and require executable code at the upload
address. A checked configuration places the supplied external initramfs
in reserved RAM before entering Linux through its edited DTB.

Bound the zImage decompressor workspace and preserve the kernel bytes.
Add synthetic layout tests and a Linux fixture that exercises the actual
loader C copy and rejection paths. Source provenance is recorded in NOTICE.
The external-initramfs handoff still requires physical qualification.

Assisted-by: LLM
Resolve one root architecture's per-platform loader and target tools through
Orchard's producer contract. Preserve explicit board selection for Cascadia
and stage ARM EABI5 hard-float Python dependency closures. Platform layers
use the declared kernel image and validate the requested root ISA.

Route RAM and recovery assembly through the declared payload format, bind
Cascadia DTBs to their selected board, and keep Pongo inputs on their own
boot path. Existing ARM64 default arguments remain supported. Document the
producer contract and exercise cache separation and architecture refusal.

Assisted-by: LLM
Carry a descriptor-selected host USB identity policy through the checked Cascadia bootargs, bind each upload to its selected hardware and a fresh attempt, and revalidate that provenance in RAM. ARM64 recovery keeps its existing ADT identity path.

Stage declared USB dependencies and defer manual storage modules until the host has serial and authenticated SSH. Reject manual drivers built into the kernel or selected as USB dependencies before assembly.

Validated with 666 unit tests (one Linux-only skip) and independent cross-layer review. Physical P105 qualification remains pending.

Assisted-by: LLM
@shaynelegault
shaynelegault force-pushed the p105/04-armv7-recovery branch from 3b7226e to 95933b7 Compare November 6, 2026 20:41
Clear the profile watchdog before reading the checked handoff configuration. Rejected payloads now remain available for inspection instead of resetting while the loader waits.

Cover the rejected-config path in the Linux runtime fixture.

Assisted-by: LLM
Validate the uploaded image before touching reserved high RAM. Capture its checked relocation fields, flush the inherited caches, and disable the MMU before copying the initrd through physical addresses. This removes the dependency on an inherited iBEC mapping for the destination.

Clear the watchdog in assembly before stack setup. Exercise protected high RAM during validation and check word and tail copies through the complete P105 initrd size.

Assisted-by: LLM
Python config directories carry development objects such as python.o. These relocatable files lack executable float-ABI flags and stop ARMv7 recovery assembly when copied with the standard library. Exclude the versioned config directories while retaining the strict ELF checks for runtime executables and extension modules.

Assisted-by: LLM
@shaynelegault
shaynelegault marked this pull request as ready for review November 7, 2026 05:07
stuart902 pushed a commit to stuart902/orchard that referenced this pull request Nov 9, 2026
Select ARM/v7 or ARM64 tool recipes explicitly and keep their outputs in
separate caches. Pin Debian's ARMHF BusyBox package and verify each finished
tool's ELF architecture and static linkage. Native builds require a host
whose architecture matches the selected target.

Assisted-by: LLM

(cherry picked from commit 8d859a3, OrchardLinux#82)
stuart902 pushed a commit to stuart902/orchard that referenced this pull request Nov 9, 2026
Use board-owned handoff data to compile the ARM32 staging loader. Preserve
Cascadia's cache/MMU handoff and require executable code at the upload
address. A checked configuration places the supplied external initramfs
in reserved RAM before entering Linux through its edited DTB.

Bound the zImage decompressor workspace and preserve the kernel bytes.
Add synthetic layout tests and a Linux fixture that exercises the actual
loader C copy and rejection paths. Source provenance is recorded in NOTICE.
The external-initramfs handoff still requires physical qualification.

Assisted-by: LLM

(cherry picked from commit 12928a3, OrchardLinux#82;
left out here: the chips/s5l8942x.toml, devices/p105/device.toml and README notes)
stuart902 pushed a commit to stuart902/orchard that referenced this pull request Nov 9, 2026
Platform layers use the declared kernel image and the platform's own early
storage modules (an empty list for built-in storage), and check the root
architecture they are asked for. Static recovery tools are built per
architecture into separate cache entries; the Cascadia loader is built from
the board's profile; RAM payloads of a Cascadia platform are assembled for
one selected board through the Cascadia producer, without Pongo. The ELF
reader handles ELF32 and ELF64 alike.

Assisted-by: LLM

Adapted from commit 02dcc19
(OrchardLinux#82). Left out here: board selection for distribution
builds (orchard.inputs --device, selects-device), per-board platform layers,
the recovery's runtime staging and its producer-contract text. arm64 platform
layers keep their platform.json and receipt unchanged; the ARMv7 layer holds
every board's DTB.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant