The stall: a leaf-PC sampler in the daemon ($JIHAD_STALL_SAMPLER, GoannaRenderPage.cpp) and
tools/host/stall-resolve.py (the toolchain's addr2line against the unstripped libxul) name what
holds the main thread — the pages' own JavaScript two thirds, compile and the collections the
rest; the clock sat at 192–384 MHz under load (Palm's ondemandtcl, up_threshold 95). The clock
hold (JihadBrowserServer.cpp, jihad.cpu.hold) raises the frequency floor while the engine has
work and releases it after two seconds of idle ticks, on the no-page path too (daemon 18); it
never touches the governor, which wedged the kernel's cpufreq lock and cost a reboot.
H.264 and AAC: build/webos-oe/fetch-ffmpeg.sh + build-ffmpeg-arm.sh cross-build FFmpeg 4.4.5's
decoders (libavcodec.so.58, libavutil.so.56, LGPL v2.1+, decoders and parsers only); the bundle
ships them, NOTICE and licenses/runtime/ carry the terms; the codec page plays both to the end on
the device.
The layout viewport (T-499): GoannaRenderPage::SetLayoutSize and the once-per-page rule in
emitGeometry (jihad.viewport.followOverflow); the engine window resizes but the page still reads
innerWidth 768 — the paint path restores the card size; open.
Rendering options: tools/device/gpu-bench.c times the Adreno 220 through the vendor EGL/GLES2
(composite 4–13 ms, readback 11–14 ms, whole-texture upload 9–12 ms per 3 MB, tile sub-updates
160 ms) beside the CPU equivalents; docs/RENDERING-OPTIONS.md keeps the numbers; the report with
the decision table is the owner's doc. Ledger T-499…T-501, build site, kit, PICKUP, memories.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J67ZH8aYy8uzhgZDZ6Nvx9