OXYGENHUB

The x86_64 seccomp block builds for Android too (refs oxygenhub-android#8) fa963b1b7eb6

Its BPF_JGE came from libc, which lacks it for Android: the app's
x86_64 (emulator) build of the runner failed where arm64's passed.
Spelled out like the others, and in the test against glibc's values;
both Android targets checked.
Author
Andy McCall @andymccall <[email protected]>
via
agent agent:claude@andymccall <[email protected]> · keyless, under your grant for changes,refs,seal · key 535b53b57524
When
· 2026-10-25 15:03 UTC
Signature
◈ sealed by agent:claude@andymccall
Hash
fa963b1b7eb66f963195a8a9f39c2a356cc99fdc9225223e28039fab947b099d
Depends on
28cc603f737d 5cf1e8aefbb6 c3db750ed96e ea56c56eaf90
Depended on by
nothing yet
In bookmarks
main
In tags
v0.4.0 v0.5.0 v0.5.1 v0.5.2 v0.5.3
Edits
6 atoms, 0 tree operations, 2 files

Browse the tree at this change

modified CHANGELOG.md +1 −1
…
4 unchanged lines
5 5
## Unreleased
6 6
7 7
- **The WASM tier (#75):** `runtime "wasm"` runs WASI preview 1 modules with wasmtime 49 on any runner (`flow tiers` offers `wasm` everywhere): no rootfs, no network, the job's files at `/src`, its mounts at their targets, the memory limit enforced by wasmtime. `exec` names a module or a glob of them (`target/wasm32-wasip1/debug/deps/*.wasm` runs each test binary in turn); the receipt names wasmtime's version and every module's hash. The tier phones and browsers will run (docs/handover.md). Secrets and identities are not offered in it yet.
8 -
- **The runner as a library, for the phone (oxygenhub-android#8):** `flow` is now a library and the command built on it, and the whole runner builds for Android (`aarch64-linux-android`); `runner::serve_embedded` and `runner::stop` run it inside an app and drain it. There the WASM tier runs modules in a thread rather than a child process (also with `FLOW_WASM_IN_PROCESS`), streaming their output from pipes, stopping them at the time limit or when the run is cancelled through wasmtime's epoch, and reporting the most memory they asked for. Two portability fixes on the way (the seccomp filter's BPF opcodes and an ioctl request type).
8 +
- **The runner as a library, for the phone (oxygenhub-android#8):** `flow` is now a library and the command built on it, and the whole runner builds for Android (`aarch64-linux-android`); `runner::serve_embedded` and `runner::stop` run it inside an app and drain it. There the WASM tier runs modules in a thread rather than a child process (also with `FLOW_WASM_IN_PROCESS`), streaming their output from pipes, stopping them at the time limit or when the run is cancelled through wasmtime's epoch, and reporting the most memory they asked for. Two portability fixes on the way (the seccomp filter's BPF opcodes, for arm64 and x86_64, and an ioctl request type).
9 9
- **cargo-nextest in the Rust image (#81):** for JUnit test reports beside `cargo llvm-cov`'s coverage.
10 10
## 0.3.1 (2026-10-25)
11 11
…
85 unchanged lines
modified crates/flow/src/syscall.rs +5 −3
…
836 unchanged lines
837 837
const BPF_ABS: u16 = 0x20;
838 838
const BPF_JMP: u16 = 0x05;
839 839
const BPF_JEQ: u16 = 0x10;
840 +
const BPF_JGE: u16 = 0x30;
840 841
const BPF_K: u16 = 0x00;
841 842
const BPF_RET: u16 = 0x06;
842 843
…
12 unchanged lines
855 856
    #[cfg(target_arch = "x86_64")]
856 857
    {
857 858
        // x32 calls carry this bit; there are none in a 64-bit job.
858 -
        const JGE: u16 = (libc::BPF_JMP | libc::BPF_JGE | libc::BPF_K) as u16;
859 +
        const JGE: u16 = BPF_JMP | BPF_JGE | BPF_K;
859 860
        f.push(op(JGE, 0x4000_0000, 0, 1));
860 861
        f.push(op(RET, errno(libc::EPERM), 0, 0));
861 862
    }
…
20 unchanged lines
882 883
    fn bpf_opcodes_are_the_kernels() {
883 884
        use super::*;
884 885
        assert_eq!(
885 -
            [BPF_LD, BPF_W, BPF_ABS, BPF_JMP, BPF_JEQ, BPF_K, BPF_RET],
886 -
            [libc::BPF_LD, libc::BPF_W, libc::BPF_ABS, libc::BPF_JMP, libc::BPF_JEQ, libc::BPF_K, libc::BPF_RET].map(|v| v as u16)
886 +
            [BPF_LD, BPF_W, BPF_ABS, BPF_JMP, BPF_JEQ, BPF_JGE, BPF_K, BPF_RET],
887 +
            [libc::BPF_LD, libc::BPF_W, libc::BPF_ABS, libc::BPF_JMP, libc::BPF_JEQ, libc::BPF_JGE, libc::BPF_K, libc::BPF_RET]
888 +
                .map(|v| v as u16)
887 889
        );
888 890
    }
889 891
}