Introduction
What Warm64 is, what it runs, and how you drive it.
Warm64 is a complete 64-bit Arm computer that runs wherever WebAssembly runs: in a browser tab, in a web worker, and in Node. It boots the same operating systems a real Arm server does, unmodified, from the same kernels and disk images you would give QEMU.
Two engines
Warm64 comes as two engines that run the same machine.
| Engine | How it runs code | For |
|---|---|---|
| Interpreter | One instruction at a time, each exactly as Arm defines it. | The smallest, simplest engine; reference behaviour. |
| Just-In-Time | Hot code compiled to WebAssembly, which the browser or Node turns into native code. | Speed: a Linux boot in seconds, and compute-heavy code at around half native speed. |
Both emulate the same virt board, boot the same images and are driven the same way, so moving from one to the other changes nothing in your code.
Driven like QEMU
Warm64's interface is QEMU's, under the name WEMU. If you have used qemu-system-aarch64, you already know it:
- The command line builds the machine:
-M virt -m 1G -kernel … -drive … -netdev …. It's the same line in a shell (wemu-system-aarch64) and in JavaScript (WEMU.launch()). - QMP, QEMU's JSON protocol, controls it:
query-status,stop,cont,screendump,input-send-event,migrate. - The human monitor answers
info block,savevm,x /8xg $sp. wemu-imgcreates and converts disk images, asqemu-imgdoes.
Names differ in one way: where QEMU says qemu, WEMU says wemu. What Warm64 can't do, it refuses the way QEMU does on a machine without that feature, in QEMU's words.
import { WEMU } from "warm64";
import { nodeWEMUHost } from "warm64/wemu-node";
const vm = await WEMU.launch("-m 1G -kernel vmlinuz-virt -initrd initramfs-virt -append console=ttyAMA0 -display none -S", nodeWEMUHost());
vm.serial[0].onData((bytes) => process.stdout.write(bytes));
await vm.qmp("cont");The machine
- CPU: a Cortex-A76 class core implementing the full A64 instruction set: Advanced SIMD, floating point with Arm's exact rounding and flags, the cryptographic extension, BTI, and with
-cpu maxpointer authentication, MTE, SVE and SVE2. EL0 to EL3 with the Virtualization Host Extensions; Linux boots at EL2. - Board: QEMU's
virtlayout, with a GICv3 (or v2), PL011 serial ports, a real-time clock, and virtio devices on MMIO or PCIe. - Devices: virtio disks, network, GPU (2D and virgl 3D), keyboard, tablet, sound and shared folders; USB with an xHCI controller; an SMMUv3.
- Cores and memory: up to 8 cores, and guest RAM beyond 16 GB.
What it boots
Stock images, unmodified: Alpine Linux, Debian, Arch Linux ARM, FreeBSD and OpenBSD. The Linux distributions boot from a kernel and initrd, or like the BSDs from U-Boot and EFI, the way hardware does. See Booting Linux and Booting BSD.
Where it runs
| Platform | Notes |
|---|---|
| Node 24 or later | Files, disks opened in place, real sockets. The wemu-system-aarch64 and wemu-img commands. |
| Browsers | In a page or, better, a web worker. More than one core needs a cross-origin-isolated page. 3D graphics use WebGPU or WebGL2. |
Licensing
Both engines are open source under the GNU AGPL v3. Companies that can't meet its terms take a commercial license, priced on the pricing page.