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.

EngineHow it runs codeFor
InterpreterOne instruction at a time, each exactly as Arm defines it.The smallest, simplest engine; reference behaviour.
Just-In-TimeHot 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-img creates and converts disk images, as qemu-img does.

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 max pointer authentication, MTE, SVE and SVE2. EL0 to EL3 with the Virtualization Host Extensions; Linux boots at EL2.
  • Board: QEMU's virt layout, 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

PlatformNotes
Node 24 or laterFiles, disks opened in place, real sockets. The wemu-system-aarch64 and wemu-img commands.
BrowsersIn 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.

Next steps