Skip to content

Align the MICOFE build system on Infrabase / SO3 v6.3.0 - #3

Open
daniel-rossier wants to merge 54 commits into
mainfrom
3-alignment-with-so3-624
Open

Align the MICOFE build system on Infrabase / SO3 v6.3.0#3
daniel-rossier wants to merge 54 commits into
mainfrom
3-alignment-with-so3-624

Conversation

@daniel-rossier

@daniel-rossier daniel-rossier commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

This branch carries the migration of the MICOFE build system onto Infrabase, aligned on SO3 v6.3.0, plus the work needed to keep MICOFE's own features running on top of it. 52 commits, 730 files, +34.5k/−39k.

main predates all of it — including PR #1 (Docs/specialize micofe), which was merged into this branch rather than into main.

Build system

  • Migrated to Infrabase and realigned on SO3, in steps: v6.2.0 → v6.2.1-rc → v6.2.4 → v6.2.5 → v6.3.0, with meta-so3 pinning so3/avz to the release tag at each step.
  • build.sh's six modes collapse to the positional SO3 CLI; the socle scripts follow.
  • bitbake runs unprivileged; the privileged steps escalate through sudo -n against a session opened by the front-end scripts.
  • bblayers.conf is generated, meta-toolchain builds the musl toolchain (fetched from a mirror), and the ITS files are rendered from layer templates instead of living next to the outputs.
  • bsp-linux splits into the AVZ + Linux-agency 2-ITB boot, with st.sh detecting EL2 and the guest config name; the bare U-Boot chain is now labelled instead of printing ?.
  • Adopted the SO3 generic fixes: the storage guard, the do_attach_infrabase manifest, the shared header.
  • Build container: dbuild.sh + docker/build-env, so the toolchain and host packages come from a pinned image and the build still runs as the host user.
  • The two-stage initrd is harmonised on the SO3 /init model, for virt64 and rpi4_64.

MICOFE features, preserved and restored

The alignment deliberately keeps what makes this tree MICOFE rather than SO3:

  • The virtualised framebuffer chain end to end: fb_mapper and input_forwarding built and installed as services, the framebuffer/input backend wiring restored, and the damage forced on each refresh tick.
  • The two-stage rootfs, with the agency rebranded to MICOFE (blue banner, boot logs).
  • Capsule logging: syslog-ng back in the agency rootfs, and the logs routed with the S3C prefix.
  • /dev/soo/core created by a SysVinit S30soo script.
  • The SOO agency apps committed in-tree, ME renamed to S3C, the s3c-* capsule apps taken from SO3 v6.2.0 and the legacy ones dropped, and the deploy chain fixed (they install as root — the previous failure was silent).
  • Every script and file copied from a sibling tree keeps its origin copyright plus the Adapted for MICOFE — REDS Institute, HEIG-VD line.

Platforms

  • virt64 — runtime-validated (the default: agency SOO + LVGL).
  • rpi4_64 — the AVZ agency builds end to end; documented as build-validated.

Documentation and branding

Documentation specialised on MICOFE, the build chapter kept in step with each SO3 bump and with the container, all figures centralised into micofe.drawio, the GitHub Pages Sphinx build fixed and linked from the README, Pages workflow actions bumped, and the Hasler Foundation logo added to the acknowledgements.

Last commit: the TEZI feed (f8111d5)

The one place this tree still diverged from all its siblings (so3, edgem1, pos_sol, infrabase): the verdin TEZI file set was published to /var/www/html. That required an nginx document root, a root-owned directory outside the tree, a machine-specific absolute path in a tracked local.conf, and — with a snap-packaged Docker, which cannot bind-mount outside $HOME — publishing from inside the container was impossible. This tree really does use that path (IB_STORAGE_MODE:verdin-imx8mp = "http"), while dbuild.sh claimed the opposite.

IB_HTTP_DEPLOY_PATH now defaults inside the tree (build/deploy/tezi/<platform>), __do_platform_deploy writes image_list.json next to image.json so the feed directory is self-contained, and the new scripts/tezi-feed-serve.sh serves it as your user on IB_HTTP_FEED_PORT (8080). deploy.sh starts it; dbuild.sh starts it on the host after the container exits, since --rm would take a server started inside down with it. Per-machine deviations go in the new untracked build/conf/site.conf.

Testing

For the branch as a whole, the validation is the one recorded in its own history and in doc/: virt64 runtime-validated, rpi4_64 build-validated.

The final commit was validated today, on this host:

  • bitbake -p — 20 recipes, 0 errors; IB_HTTP_DEPLOY_PATH and IB_HTTP_FEED_PORT expand as intended.
  • sh -n on dbuild.sh, deploy.sh and tezi-feed-serve.sh; Python compile of __do_platform_deploy.
  • tezi-feed-serve.sh --status resolves the feed path from local.conf.

Not covered: any Verdin hardware — no board here, so the http install path is not verified end to end. It is the same code already running in the sibling trees.

A note on the merge commit

GitHub first reported this PR as conflicting: main and this branch each carry the same eleven documentation/README/drawio commits under different SHAs (the merge base is the initial import), so four files collided — .gitignore, env.sh, doc/source/glossary.rst, doc/source/index.rst.

On all four, main is the older side, and its only content absent from this branch is text this branch deliberately replaced: the pre-alignment env.sh (PATH appended rather than prepended, meta-torizon in IB_AUX_LAYERS, the IB_UNPRIVILEDGED_* variables that went away when bitbake stopped running as root), a .gitignore missing everything the alignment added, and the pre-rename Mobile Entity wording with the old /root/capsule/ and me_<slotID>.log paths.

It is therefore merged with -s ours: the merge is recorded, and the tree is byte-identical to the alignment commit. An ordinary merge would have auto-combined the files git could reconcile textually and quietly reintroduced that older prose.

daniel-rossier and others added 30 commits June 1, 2026 15:34
Refocus the documentation solely on MICOFE and drop the Infrabase /
EDGEMTech material.

- Move the MICOFE section (micofe, emiso, portainer, syscalls_alignment)
  to the doc source root and rework index.rst as a MICOFE landing page.
- Consolidate all images, including the .drawio source, into
  doc/source/img/; update figure paths accordingly.
- Remove Infrabase-specific chapters (introduction, user_guide, dev_flow,
  coding_conventions, build_system, rootfs, base_extension) and the
  Infrabase/EDGEMTech images; keep the glossary.
- Rebrand conf.py (project, copyright, LaTeX/man targets) to MICOFE and
  drop the now-unused PlantUML extension.
- Replace the GitLab CI (edgem-build image) with a GitHub Actions
  workflow that builds the docs and deploys to GitHub Pages; unignore
  .github so workflows are tracked.
- doc/requirements.txt listed sphinxcontrib-pdfembed, which does not exist
  on PyPI (404), causing the Pages workflow's pip install to fail. Slim the
  file to the only packages the Sphinx config imports (sphinx, sphinx-rtd-theme).
- Add a Documentation section to README.md linking to the GitHub Pages site.
Extracted from the project technical report and shown above the
acknowledgement text on the Introduction page.
Silences the Node.js 20 deprecation warnings:
- actions/checkout v4 -> v6
- actions/setup-python v5 -> v6
- actions/upload-pages-artifact v3 -> v5
- actions/deploy-pages v4 -> v5
Add one page per report figure (architecture, framebuffer-map,
framebuffer-flow, showcase-architecture, multicapsule-composition,
portability-matrix), embedded as images, alongside the existing editable
EMISO diagrams (Overview, emiso-engine, logs). 9 pages total.
Replace MICOFE's standalone build tree with the current Infrabase build
system as carried by SO3 (branch 255: build-system migration + new logo),
pulling in the latest SO3/AVZ evolutions while preserving MICOFE's
capsule + virtualized-framebuffer feature.

Foundation (socle):
- env.sh, scripts/* (build.sh 2-mode -a/-x interface, unprivileged bitbake
  with setup_sudo/sudo_session, new ci-local.sh/updiff.sh/bitbake wrapper),
  meta/classes (sha256 attach guard, pristine-snapshot do_diffcompose),
  new meta-toolchain (musl-toolchain), auto-generated bblayers + auto.conf.
- local.conf: virt64 default = AVZ (virt64_avz_soo_defconfig, CONFIG_SOO=y)
  + Linux agency (virt64_soo_defconfig, ITS virt64_avz) + SO3 capsule
  (virt64_capsule_defconfig, ITS virt64_capsule), EXTRA_OVERRIDES :lvgl:soo.

Recipe layers:
- meta-so3: avz/so3 6.1.0 -> 6.2.0, fetched from github (SRCREV 60f6da75c)
  with the MICOFE-specific patch infrastructure wired for `-c updiff`.
- meta-uboot: portable git-style patch set (e1c_boot two-ITB + FIT crypto)
  + uboot 2024.07 for verdin.
- meta-atf: OP-TEE support (optee recipe, fiptool, ATF imx8mp+avz patch).
- meta-qemu / meta-filesystem: refreshed from upstream.
- meta-linux: kernel + SOO agency patches; re-grafted MICOFE vfbdev/vinput
  BACKEND drivers (Linux-side virtualized framebuffer + input).
- meta-usr: EMISO engine + re-grafted fb_mapper/input_forwarding userspace;
  kept the MICOFE lvgl/kmscube graphics suite.
- meta-bsp: SO3 capsule build + rpi DTBs + verdin boot blobs.
- meta-rootfs: fb_mapper/input_forwarding systemd services + mount overlays;
  enabled BR2_PACKAGE_JSONCPP/LIBHTTPSERVER (EMISO REST deps) in buildroot.

Build files adopted from Infrabase (EDGEMTech) carry a MICOFE/REDS HEIG-VD
adaptation copyright line alongside the original. Validated: `bitbake -p`
parses cleanly (20 recipes); `build.sh -x so3` and `-x avz` build OK.
The base linux patch dir (recipes-linux/linux/files/0001-linux-6.12-r0)
carried three patch files not referenced by its patches.inc — leftovers
from upstream so3: 0021-Makefile.patch, 0022-virt64.dts.patch,
0023-virt64_guest.dts.patch (duplicates of 0005/0002/0004).

With virt64_soo_defconfig the soo bbappend adds its own files dir to
FILESPATH, but the base dir is searched first. The soo set legitimately
ships file://0021-Makefile.patch (soo/drivers/vdummyback/Makefile); the
orphan base 0021-Makefile.patch shadowed it, re-adding the virt64.dtb
lines already applied by 0005-Makefile.patch -> do_patch aborts with
"Reversed (or previously applied) patch detected".

Removing the dead orphans lets do_patch resolve the soo patches correctly.
Verified: build.sh -x linux builds the agency kernel (virt64_soo_defconfig)
end-to-end (Image + virt64/virt64_guest dtbs).

Also gitignore build-attached/generated paths that were not yet covered
(linux/usr/{include/core,include/soo,src/graphic,src/soo,src/lvgl} and
filesystem/u-boot.bin) so they are not accidentally committed.
Align bsp-linux with the so3/edgem1 two-ITB principle: one ITB for AVZ,
one for the Linux agency (loaded together by U-Boot's e1c-boot, AVZ FIT
in x0, agency guest in x1). Previously micofe bundled AVZ + Linux agency
into a single virt64_avz.itb, which did not match the AVZ deploy path
(which stages avz_itb + a separate guest_itb) and broke deploy.

- linux/target/virt64_avz.its: now AVZ-only (avz + avz_dt), mirroring
  so3's virt64_avz.its.
- linux/target/virt64_linux_guest.its: new — the Linux agency guest
  (Image + fdt + initrd), modelled on so3's virt64_so3_guest.its.
- bsp-linux do_itb: mirror bsp-so3 — build ${IB_TARGET_ITS}.itb (AVZ)
  then the derived guest ITB. The guest kind is IB_AVZ_GUEST
  ("linux_guest" for bsp-linux; bsp-so3 keeps the "so3_guest" default).
  Strip _avz via a shell variable (bitbake does not pass ${VAR%_avz}
  through to the shell).
- bsp_arm_common.inc __deploy_arm_common: derive the guest ITB from
  IB_AVZ_GUEST instead of the hardcoded _so3_guest, so the same deploy
  serves both the SO3 guest (bsp-so3) and the Linux agency (bsp-linux).
- uEnv_virt64_avz.txt for bsp-linux: e1c-boot loads virt64_avz.itb +
  virt64_guest.itb (the deploy stages the guest under the generic
  <plat>_guest.itb name).

Verified: bsp-linux do_itb builds both virt64_avz.itb (AVZ-only) and
virt64_linux_guest.itb (Linux agency).
…name)

Two fixes found while bringing up the virt64 agency 2-ITB boot end to end:

- scripts/st.sh: enable QEMU EL2 (virtualization=on) when the *linux*
  ITS is an _avz target, not only the so3 ITS. micofe boots the Linux
  agency on AVZ (IB_TARGET_ITS:linux:virt64=virt64_avz) while the so3
  ITS is virt64_capsule, so the old so3-only check left EL2 disabled and
  AVZ faulted.
- linux/target/virt64_linux_guest.its: the guest configuration node must
  be named "capsule" — U-Boot's e1c-boot looks it up by that fixed name
  (cmd/e1c_boot.c: e1c_load_fit(e1c_itb, "capsule", ...)). Also switched
  the in-node comments to /* */ (DTC rejects '#').

Verified end to end: build.sh -a + deploy.sh -a + st.sh boots AVZ ->
Linux agency (vbus/vbstore up, SO3-capsule backend ready) to a shell.
The wholesale-adopted so3 do_prepare_initrd uses the full-initramfs model:
it copies the ~96 MB rootfs.cpio over the committed 6 MB REDS minimal
ramdisk (initrd.cpio) and gzips it. micofe instead uses a 2-stage rootfs —
the small REDS ramdisk (bundled in the guest ITS) switch_root's to the
full agency rootfs on /dev/vda2 (p2), deployed by rootfs-linux. The
overwrite ballooned the guest ITB to 145 MB (overflowing the p1 FAT boot
partition) and booted the wrong rootfs.

- bsp-linux: do_prepare_initrd[noexec]="1" — keep the committed REDS
  ramdisk as initrd.cpio (guest ITB back to ~50 MB, fits p1). The agency
  rootfs already lands on vda2 via rootfs-linux:do_deploy.
- rebrand the agency from the EDGE-M1 / EDGEMTech leftovers to MICOFE:
  rootfs_overlay/etc/profile banner (ANSI-shadow MICOFE + "Welcome to
  MICOFE" / "REDS HEIG-VD"), buildroot defconfig
  BR2_TARGET_GENERIC_HOSTNAME="micofe", BR2_TARGET_GENERIC_ISSUE="MICOFE".

Verified: st.sh boots AVZ (REDS/HEIG-VD banner) -> Linux agency ->
vbus/vbstore SOO backend (vuart/vlogs/soo-me) -> agency login on vda2.
…ng, blue banner, boot logs

- meta-usr (soo): the fb_mapper / input_forwarding userspace apps shipped as
  sources (src/soo/fb_mapper.c, input_forwarding.c) but were neither compiled
  nor installed, so the framebuffer/input forwarders never reached the agency
  rootfs (only their .service units did). Add add_executable() for both in the
  soo CMakeLists patch (0016) and install them via the soo usr-linux bbappend.
  Verified: both build (aarch64 ELF) and stage in build/deploy/root alongside
  emiso_engine, injector, melist, save/restore/shutdownme.
- meta-rootfs: agency /etc/profile MICOFE banner recoloured orange -> blue
  gradient.
- meta-bsp: uEnv_virt64_avz.txt sets bootargs="console=ttyAMA0 loglevel=8"
  (e1c-boot propagates it to the agency /chosen) so the boot log is visible
  on the serial console.
usr-linux:do_deploy copied build/deploy/* into the rootfs partition with a
plain unprivileged os.system("cp -r ...") whose return code was ignored.
Since the rootfs is extracted via sudo (cpio -id), /root is owned by root
(0700); with bitbake now running unprivileged the cp was denied and the
copy silently dropped — so NONE of the soo agency apps (emiso_engine,
fb_mapper, input_forwarding, injector, melist, save/restore/shutdownme)
ever reached the agency /root.

Use utils_sudo(..., shell=True, check=True): run the copy as root (matching
the sudo'd rootfs extraction) and fail loudly if it errors. Verified by
loop-mounting the deployed image: /root was empty before, has all 8 apps
after a root copy.
Empty IB_BOOT_CHAIN is the valid bare-U-Boot mode (treated as 'uboot' in
__do_platform_boot_chain), but the deploy log printed 'chain=?' because
the empty string is falsy. Label it 'uboot (bare)' so the log no longer
reads like a misconfiguration.
Bump SRCREV from the 255 migration branch (60f6da75c) to the v6.2.0
release commit (c6001712), and document it via IB_SO3_TAG="v6.2.0".
Adopt the v6.2.0 versions of the 24 shared SOO patches on both the
virt64 (0001-linux-6.12-r0) and rpi4 (-rpi4-r0) sets: the ME->S3C
rename, the removal of the migration vestiges and the RT-agency
subdomain, and the vuart add_console() sizeof fix (kzalloc of
sizeof(struct vdev_console), not the shadowing pointer parameter).
Preserve and S3C-rename the MICOFE-only vfbdev/vinput backend drivers
(me_cons_send_input -> s3c_cons_send_input).
Promote the MICOFE-specific SOO userspace apps (fb_mapper,
input_forwarding, emiso_engine, injector, save/restore/melist/shutdown)
plus their headers to committed sources under linux/usr/{src,include},
dropping the 51-patch materialization model. src/CMakeLists.txt now
carries add_subdirectory(soo); the lvgl CMakeLists patch context is
updated accordingly. Rename ME->S3C (and me->s3c, /soo/me->/soo/s3c,
Mobile Entity->SO3 Capsule) across the apps and their in-tree headers
to match the v6.2.0 kernel uapi (ioctl numbers unchanged).
Since SO3 v6.2.0 the fetched so3/usr no longer ships a lib/lvgl subdir
(LVGL is fetched separately), so retrieve_usr_dir does not create it and
the copy failed with 'No such file or directory'. os.makedirs it first.
SO3 v6.2.0 moved the ITS out of the fetched so3/target tree into layer
templates. Ship virt64_capsule.its as a template under the bsp-capsules
layer and render it (sed-expand IB_SO3_PATH/IB_ROOTFS_PATH to absolute
paths, mirroring so3's bsp_render_its) into IB_ITB_PATH before mkimage.
Define IB_SO3_PATH in the recipe (it does not inherit so3).
build.sh/deploy.sh switch from the -a/-x 2-mode to so3's positional CLI
(build.sh <recipe>, -x optional, -c clean). Adopt the v6.2.0 socle
scripts (bblayers/mount/umount/setup_*/sudo_session/st.sh/...) plus
initrd_pack.sh and check-format.sh, keeping the MICOFE double-attribution
header. env.sh drops the stale meta-torizon from IB_AUX_LAYERS.
The soo core driver registers char major 126 but does not create the
node; the agency boots SysVinit (no systemd/udev) so the systemd
soo.service never runs. Create /dev/soo/core at boot for the capsule
management apps (injector, melist, ...).
…boot

Align both layers wholesale on v6.2.0: shared do_render_its in
bsp.bbclass renders layer ITS templates (recipes-bsp/{linux,so3}/files/
its) into the gitignored <ctx>/images, replacing the committed
linux/target ITS and the local bsp-capsules render added earlier;
bsp-capsules do_deploy now escalates the p2 copy (utils_sudo, check).
IB_GUEST_SUFFIX replaces IB_AVZ_GUEST for the 2-ITB agency boot and
IB_RAMFS_SOURCE="initrd" (local.conf) replaces the do_prepare_initrd
noexec hack for the 2-stage rootfs. meta-uboot picks up the
e1c-boot -> guest-boot rename (guest_boot.c patches, uEnv callers).
Drop the stale pre-split rpi4/standalone ITS and the legacy
linux/target build scripts (recoverable from history).
Adopt v6.2.0's usr-linux bbappend and rootfs-linux recipe: baking the
usr apps into rootfs.cpio is a BUILD step (deps on the rootfs
generator's do_build), and rootfs-linux:do_deploy is a pure media write
(no longer pulls buildroot:do_build). micofe had the halves inverted -
p2 was populated before the injection and every deploy rebuilt
buildroot, regenerating a pristine rootfs.cpio that erased the injected
apps; /root on p2 could never catch up with the staged binaries.
…d one

The in-tree commit captured src/CMakeLists.txt with the lvgl/graphic
subdirectories the lvgl bbappend adds at BUILD time; the committed
source must carry only examples+soo (the lvgl patch re-adds the rest).
Replace the legacy agency apps (injector, melist, saveme, restoreme,
shutdownme) with the s3c-inject/s3c-list/s3c-save/s3c-restore/
s3c-shutdown sources as shipped by SO3 v6.2.0 (SOO configuration),
together with its cleaned headers (migration prototypes removed, S3C
comments). src/soo/CMakeLists.txt is the v6.2.0 base plus the MICOFE
targets (fb_mapper, input_forwarding, emiso_engine); the install lines
and the S30soo comment follow the new names.
Move the so3+avz fetch to the v6.2.1-rc tag (ed2b17916), which carries
the s3c user-visible string fixes (so3#277) — re-adopt the fixed
0018-Kconfig/0077-core.c soo patches (virt64 + rpi4 sets) and re-extract
the s3c-list/save/restore/shutdown app sources. Align the bare
recipes-linux/linux patch set that was still on the 255 baseline: this
brings the guest CMA pool 96 -> 160 MB (so3#273), required by the
snapshot path (EMISO create/save do a 128 MB dma_alloc) — the EMISO
'container create' used to freeze the agency on the CMA BUG_ON.
Align the remaining rootfs overlay files on SO3 v6.2.1-rc: syslog-ng
still parsed the old [ME:<id>] prefix and wrote me_<id>.log while the
vlogs driver has been tagging [S3C:<id>] since the rename — per-capsule
logs were silently unrouted. Also adopt the s3c wording in S30soo, the
/mnt/s3c fstab mount points (rpi4/virt32) and the inittab.d keep.
Add a Build system chapter covering the SO3 v6.2.1-rc-aligned Infrabase
workflow: source model (fetched so3/avz vs in-tree usr apps), positional
build.sh/deploy.sh, the ITS render model, IB_RAMFS_SOURCE two-stage
boot, the guest-boot two-ITB chain and the s3c-* capsule lifecycle.
EMISO: S3C terminology, the real image store (/mnt/capsules/image), the
SysVinit note for the systemd unit, s3c_<id>.log paths and a validated
REST quick-validation walkthrough (ping/version/images, create/start,
CMA requirement). Glossary: Mobile Entity marked historical, SO3
Capsule (S3C) entry added; build chapter wired into the toctree.
The June alignment adopted so3's buildroot virt64 defconfig and only
re-flipped the EMISO REST deps (jsoncpp, libhttpserver), losing MICOFE's
BR2_PACKAGE_SYSLOG_NG=y — without syslog-ng the [S3C:<id>] vlogs
routing has no consumer and /var/log/soo/ never exists. Re-enable it
(a MICOFE delta over the so3 base, like the EMISO deps). Validated at
runtime: after injection /var/log/soo/s3c_2.log receives the capsule's
[S3C:2] messages.
The June wholesale adoption of the so3 patch sets silently dropped the
MICOFE virtualized-framebuffer kernel wiring, leaving vfbdev.c/vinput.c
as dead sources: the VFBDEV_BACKEND/VINPUT_BACKEND Kconfig entries, the
soo/drivers Makefile obj lines, the per-directory Makefiles, the
defconfig enables, the fbdev hypercall block in the agency uapi soo.h
(MAX_FBDEV_PFN, fbdev_pfns_t, AVZ_FBDEV_SET_PFNS/CHANGE_FOCUS/
GET_S3C_ADDR and the hyp-args union members) and the vfbdev sysfs
entries. Restore them on both the virt64 and rpi4 sets, taking the
hypercall block from the v6.2.1-rc capsule uapi (pfn_count field,
GET_S3C_ADDR naming) so agency, AVZ (fbdev_gnt) and the capsule
frontend share the same ABI; the sysfs bodies come from the initial
import. Also restore the rpi4_64 _soo defconfig selections in
local.conf. Validated: vfbdev.o/vinput.o build into the agency kernel
and /sys/soo/backend/vfbdev appears at boot.
Re-wire the remaining pieces of the MICOFE virtualized framebuffer that
the June wholesale had dropped, and enable the feature across the
stack:

- capsule DTS (micofe patch on the fetched SO3): turn the vfbdev and
  vinput frontends on — the MICOFE agency now provides both backends.
- agency guest DTS (0001, virt64 + rpi4 sets): add the vfbdev,backend
  and vinput,backend nodes; without them vfbdev_init returns early and
  the sysfs stores are never registered (fb_mapper's writes were
  silently lost and the frontend crashed on a NULL vdev at first use).
- console.c (0074, both sets): restore the AVZ_FBDEV_CHANGE_FOCUS
  hypercall in vfb_set_focus and call it from the serial focus switch,
  so terminal focus and screen focus track together (double CTRL-A).

Validated on virt64 (QEMU needs modern virtio for the agency real
framebuffer: -global virtio-mmio.force-legacy=false -device
virtio-gpu-device): fb_mapper handshake, capsule injection, frontend
connected, fb_test drawing inside the capsule lands in the agency
/dev/fb0 memory after the focus switch (fb content goes from ~2% to
~98% populated).
The capsule pixels reach the shadow buffer through the AVZ stage-2
remap, bypassing the agency MMU, so the DRM fbdev deferred-io tracking
never sees them and FBIOPAN_DISPLAY alone presents nothing. Rewrite the
shadow through write() on each tick — an identity copy that marks the
whole framebuffer damaged and triggers the flush toward the display
pipeline; the pan/modeset path remains as a fallback.

Note: under headless QEMU the virtio-gpu scanout still shows only the
fbcon surface in screendumps; the memory-level path is proven (fb0
content carries the capsule drawing) and a real scanout (rpi4) reads
the memory directly.
Validate and repair the rpi4_64 build environment on the v6.2.1-rc
base — everything now compiles up to the two AVZ boot ITBs
(rpi4_64_avz.itb + rpi4_64_linux_guest.itb):

- wire rpi4_64_nomodules_soo_defconfig into the referenced patch set
  (it lived in an orphan 0002- directory no recipe includes — upstream
  so3 carries the same gap, rpi4 is not CI-built there).
- repair the RPi DTS patch set, which was an inconsistent extract of
  the downstream kernel: include bcm2711-rpi.dtsi from the board dts
  (brings the v3d/vc4 pipeline), prune the status overrides and
  __overrides__/aliases entries that reference downstream-only labels
  (fb, firmwarekms, csi, smi, random, mmcnr, spi0, axiperf...), and
  normalize the 0132 board patch (context lines had lost their leading
  space; hunk counts fixed).
- usr modules: rpi4_64 builds the generic modtry (the default qemu.c is
  x86-only and senseled needs the VSENSE backends that have never been
  enabled); port senseled_remove to the 6.11+ void prototype anyway.
- add the rpi4_64_avz/_linux_guest ITS templates for bsp-linux (AVZ
  copied from the so3 set; guest mirrors virt64 at the rpi4 load
  addresses 0x10000000/0x15000000/0x15c00000) and select
  IB_TARGET_ITS:linux:rpi4_64 = rpi4_64_avz.

Not booted (no board); build-level validation only.
…est, header)

Pull three upstream improvements micofe had fallen behind on:
- fs_arm_common/filesystem.bbclass: hardened IB_STORAGE_DEVICE guard (refuse
  hard-mode storage init when the device is unset/empty instead of only
  catching the empty string - a wrong default could overwrite a host disk)
- usr.bbclass: clear the do_attach_infrabase manifest on do_clean so a clean
  tree re-attaches instead of aborting with 'Refusing to re-attach'
- core_1.0.bb: restore the dropped EDGEMTech copyright line
… + rpi4_64)

Rebuild both board initrds from the validated arm64 busybox base with the
pivot logic in /init (the so3 initrd_init.sh model), tracked next to the
cpio as editable source:

- the pivot moves from a custom /sbin/init to /init, with a ~5s poll for
  the rootfs partition instead of a blind 'sleep 2' (sbin/init returns to
  a standard busybox applet symlink)
- the dead /transient copy is dropped (no references anywhere)
- rpi4_64 gets a proper arm64 initrd (was a stale armhf/glibc-2.15
  ramdisk) with ROOT_DEV=/dev/mmcblk0p2

Boot-validated on virt64: 'init: switching root to /dev/vda2' then full
capsule injection (S3C_state_living). rpi4_64 is build-level only.
The v6.2.1-rc tag moved to include PR #278 (rpi4_64 agency-port fixes) and
PR #279 (arm64 initrd harmonization). The so3/avz source dirs are untouched
between the two commits (both PRs are build-metadata only), so this bump is
administrative; refetch + rebuild + boot smoke (switch_root, capsule
injection living) revalidated regardless.
Wholesale re-alignment of the shared areas on the so3 v6.2.4 release,
re-grafting the MICOFE deltas on top:

- the SOO agency kernel patches move to the so3 soo-generic model (one
  generic set shared by every agency kernel + per-kernel shadow dirs);
  the MICOFE vfbdev/vinput backends (0128-0133) and their wiring
  (Kconfig, Makefiles, sysfs, uapi soo.h fbdev hypercalls, console
  focus, vbstore dirs) are carried in MICOFE's copy of the generic set,
  merged with the upstream v6.2.4 evolutions (staged hypercalls,
  capsuleID, SMP guest DTS)
- rpi4_64: the agency board DTS and soo defconfig now live in the linux
  recipe set upstream; the MICOFE backend nodes and VFBDEV/VINPUT=y are
  re-applied there (NR_CPUS=3 SMP agency inherited); the orphan
  0002-linux-6.12-rpi4-r0 directory is gone upstream and here
- scripts: v6.2.4 set adopted; makeusr.sh added (bitbake-free usr
  rebuild); the legacy stg/stv/stvg launchers are dropped (st.sh -d
  covers the graphical run)
- local.conf: v6.2.4 versions, IB_BUILD_QEMU knob, avz:rpi4_64 pin
- overlays: micofe-branded etc/hostname + etc/issue (common and
  rpi4_64), mirroring the upstream per-board overlay structure
- fs_verdin-imx8mp: catch up on the hardened IB_STORAGE_DEVICE guard

Validated at runtime on virt64 (boot, capsule injection living, EMISO
REST), with the whole chain built inside the build container.
Containerized build environment on the pos_sol/edgem1 model:
docker/build-env (environment only — both Arm 64-bit toolchains
including the bare-metal aarch64-none-elf that AVZ/SO3 need, host
packages from packages.txt, blanket sudo rule) driven by
scripts/dbuild.sh. The repository stays on the host, bind-mounted at
its own absolute path, and the container runs as the calling host user,
so host and container builds are interchangeable.

The full v6.2.4 chain (bsp-linux, bsp-capsules, deploys) was built and
deployed through the container as validation. Note: caller environment
variables are not forwarded — pass them through the command, e.g.
'dbuild.sh env IB_FORCE_ATTACH=1 build.sh bsp-linux'.
Fold the v6.2.4 usr changes into the committed linux/usr tree: the s3c
tools gain the upstream empty-slot guards (s3c-save/s3c-shutdown no
longer act on a vacant slot — the agency-side half of the AVZ empty-slot
robustness fix) and s3c-inject initializes capsuleID (real IDs come from
EMISO); copyright e-mails follow the upstream heig-vd.ch alignment. The
hello install path in usr-linux is fixed (src/examples, not the stale
src/applications/examples) so the example actually ships.
Recipes renamed to _6.2.4 (PV/PF track the release), SRCREV bumped to
the v6.2.4 tag commit, patch directories renamed accordingly. Both
patch sets gain a version.h fallback bump to 6.2.4: the fetched trees
carry no git metadata, so so3version.sh falls back to
SO3_KERNEL_VERSION_FALLBACK, which the upstream release left at 6.2.3
(fixed on so3 main for the next release). AVZ and the capsule now
banner 'Version 6.2.4 (arm64)' at runtime.
Pin note moves to v6.2.4; the source model describes the soo-generic
patch organization and where the MICOFE backends live in it; new
'Containerized build (dbuild.sh)' section; makeusr.sh fast loop and
st.sh -d mentioned.
Adopt the so3 v6.2.5 fix: musl.libc.org serves its web page but stalls on
the tarball (a 256 KB range times out at 60 s, the mirror delivers it in
0.13 s), which leaves musl-cross-make unable to fetch musl-1.2.5.tar.gz.
MUSL_SITE now points at the MacPorts distfiles mirror; the sha1 check
musl-cross-make runs on every download keeps it honest.
Recipes and patch directories renamed to 6.2.5, SRCREV bumped to the
v6.2.5 tag commit. The two version.h fallback patches are dropped: they
worked around the upstream release leaving SO3_KERNEL_VERSION_FALLBACK at
6.2.3, which v6.2.5 fixes at the source.

v6.2.5 is a release-plumbing fix (untracked build-materialized user-space
files that made a fresh clone unbuildable, CI on the release branches, the
musl mirror), so the SO3 and AVZ sources are unchanged; the bump was still
revalidated end to end: rebuilt in the build container, AVZ and capsule
both banner 'Version 6.2.5', capsule injection reaches S3C_state_living.
One sentence lost its object when the pos_sol original was adapted ('the
GDB stub and reachable from the host'), and the TEZI note still read as if
it were kept in step with a single sibling tree - the model now lives in
so3 itself as well.
Recipes and patch directories renamed to 6.3.0, SRCREV bumped to the
v6.3.0 tag commit, and the build chapter now names that tag.

v6.3.0 is the minor that brings the developer build container upstream
(the model this tree already runs) plus a documentation pass, so between
v6.2.5 and v6.3.0 the SO3 and AVZ sources differ by a single line - the
version.h banner fallback. The bump is therefore administrative, and was
revalidated end to end anyway: rebuilt in the build container, AVZ and the
capsule both banner 'Version 6.3.0', capsule injection reaches
S3C_state_living.
Last piece of the sibling-tree alignment: so3, edgem1, pos_sol and
infrabase all publish the verdin TEZI file set inside the tree now, and
this tree was the one still pointing at /var/www/html.

That old path meant an nginx serving the document root, a root-owned
directory outside the tree, a machine-specific absolute path in a TRACKED
local.conf, and — with a snap-packaged Docker, which cannot bind-mount
outside $HOME — no way to publish from inside the build container at all.
This tree really does use it: IB_STORAGE_MODE:verdin-imx8mp is "http", and
dbuild.sh claimed the opposite ("the MICOFE platforms use soft/hard
storage, so this is a no-op here"), which was simply wrong.

IB_HTTP_DEPLOY_PATH now defaults to ${IB_DIR}/build/deploy/tezi/${IB_PLATFORM},
already bind-mounted and owned by the calling user, so publishing needs no
privilege; the sudo rsync stays as a fallback for a document root that
really is root-owned. It sits under build/deploy/ rather than build/tmp/ so
a clean does not wipe a feed a board may be pulling from.

__do_platform_deploy also writes image_list.json next to image.json, making
the feed directory self-contained: whoever serves it can use it as-is as its
document root, and the board URL is always <root>/image_list.json.

Serving it is the new scripts/tezi-feed-serve.sh — a detached
`python3 -m http.server` on IB_HTTP_FEED_PORT (8080, unprivileged) with
--ensure/--status/--stop. deploy.sh calls --ensure so a deploy leaves a
working feed behind; dbuild.sh calls it on the HOST after the container
exits, since --rm would take a server started inside down with it. --ensure
stays quiet when nothing was published, which matters here because dbuild.sh
runs it after EVERY container command.

Per-machine deviations go in the new build/conf/site.conf, included by
bitbake.conf after local.conf and untracked — hence the .gitignore entries
for it and for build/deploy/.

dbuild.sh also gains the snap-Docker daemon probe (the snap ships a
/usr/bin/docker wrapper, so the client path is not proof) and skips feeds
that are tree-relative or left unexpanded.

Validated: bitbake parses clean (20 recipes, 0 errors), IB_HTTP_DEPLOY_PATH
and IB_HTTP_FEED_PORT expand as intended, `sh -n` on the three scripts,
python compile of __do_platform_deploy, and tezi-feed-serve.sh --status
resolves the feed path. Not hardware-tested — no Verdin here.

The MICOFE attribution headers and the micofe-build container naming are
preserved; after this the only remaining difference from the sibling trees
in scripts/ is that branding.
main and this branch each carry the same eleven documentation/README/drawio
commits under different SHAs — the merge base is the initial import — so
GitHub reported the PR as conflicting on four files (.gitignore, env.sh,
doc/source/glossary.rst, doc/source/index.rst).

On every one of them main is the OLDER side. Its only content that this
branch does not have is text this branch deliberately replaced:

  * env.sh — the pre-alignment version (PATH appended rather than
    prepended, no cross-tree PATH hygiene, meta-torizon in IB_AUX_LAYERS,
    the IB_UNPRIVILEDGED_USER_ID/GROUP_ID variables that went away when
    bitbake stopped running as root);
  * .gitignore — missing everything the alignment added (site.conf, the
    TEZI feed under build/deploy/, the attach manifests, linux/images);
  * doc/source/emiso.rst, glossary.rst — the pre-rename "Mobile Entity"
    wording, the old /root/capsule/ and me_<slotID>.log paths, and the
    claim that the emiso systemd unit controls the engine (this agency
    boots SysVinit, which the branch documents).

Recorded with -s ours so the merge keeps this branch's tree as is: an
ordinary merge would auto-combine the files git could reconcile textually
and quietly reintroduce that older prose.
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