The platform half of Varan: the Unified XUL Platform (Goanna 6.9.0) ported to 32-bit ARM Windows RT (Surface RT / Surface 2, Tegra 3 / Cortex-A9). Upstream UXP does not target this platform.
Not affiliated with or endorsed by Moonchild Productions. Report bugs here, never to the Pale Moon or UXP projects.
| upstream | https://repo.palemoon.org/MoonchildProductions/UXP |
| fork point | 659c690d5b34cc3e46c5ba8a6e00f134d8d20c35 — UXP RB_20260624 |
| application | varan, fork point 0d869b85 (Pale Moon 34.3.1_Release) |
GitHub cannot draw a fork relationship to a Gitea-hosted upstream, so the fork
point is recorded here. git merge-base HEAD 659c690d should return 659c690d
exactly; if it does not, this README is stale.
The two fork points are the exact pair — upstream 0d869b85's platform
gitlink is 659c690d.
Not a recompile. The substantive work, roughly in order of difficulty:
- A from-scratch Thumb-2 JIT backend. SpiderMonkey's
jit/armis A32-only, and sustained A32 is device-lethal here — Windows RT dropsCPSR.Tacross preemption, so an A32 stub passes every build check and fails intermittently on hardware. Everything that enters the build must be Thumb-2, verified by disassembly rather than by "it linked". - Toolchain codegen bugs. Six confirmed
clang-cl/lldthumbv7-windows-msvcdefects, several device-lethal, worked around per-site and in one case by a link-time COMDAT override. They are catalogued in the build tree; two of them corrupt argument registers or clear the Thumb bit on function pointers, which is why this port carries post-link fixups and gates. - js-ctypes / libffi. Vendored libffi 3.4.6 for its Microsoft-contributed
Windows-ARM32 MSVC-ABI backend. Without ctypes,
OS.Filenever loads and Places, search, session store and the address bar are all dead. - Audio, media SIMD, and the compositor, each a separate device-proven fix.
VENICE is the test device — a Surface RT (Tegra 3, 4×Cortex-A9, Windows RT
8.1). Comments name it when recording something proven on real silicon rather
than reasoned about. "VENICE's I-cache is device-proven NOT auto-coherent"
means someone measured it, and in a port like this the difference between
measured and assumed is the difference between a fix and a guess. Kept
deliberately.
Mozilla Public License 2.0, as upstream. Modifications are disclosed by the git
history: Varan commits are prefixed Varan:, and the full diff against
659c690d is the complete set of changes. Upstream copyright notices are
preserved.
layout/base/VaranPhases.cpp — six-phase main-thread accounting (style, reflow,
paint, JS, GC, CC). Compiled in, and inert unless VARAN_PHASES is set in
the environment; it writes nothing when off. Disclosed here rather than left to
be discovered.
varan-uxp is the platform half and is not built on its own. It is consumed
as the platform/ submodule of varan.
See varan's README for the full build instructions — toolchain, prerequisites, mozconfig, gates and device deployment all live there, because the build runs from the application tree.
build/varan/ carries three files the build cannot proceed without, and which
were external to this repository until 2026-08-02 (so the fork could not be
built from a clean clone):
| file | what it is |
|---|---|
aeabi-shim.c |
__aeabi_idivmod / __aeabi_uidivmod wrappers over the MSVC ARM CRT. Tegra 3 has no hardware integer divide, and where SpiderMonkey names the combined EABI helpers explicitly, clang emits calls the MSVC ARM CRT does not ship. |
build-aeabi-shim.sh |
rebuilds aeabi-shim.lib from the above. Run it if you touch the .c, or the stale .lib links silently. |
arm-winnt-shim.h |
force-included before the Windows SDK headers. clang-cl 18's <armintr.h> defines only the _ARM_BARRIER_* enum, not the CP15 coprocessor-register macros that the SDK's um/winnt.h passes to _MoveFromCoprocessor(). MSVC's own armintr.h has them; this supplies them. |