fix(verify): fix non-amd64 JIT trampolines and validate under qemu
This commit is contained in:
+18
-2
@@ -35,8 +35,24 @@ for the lifetime of the GOOBJ emission.
|
||||
|
||||
## 2026-08-30 non-amd64 JIT execution trampolines
|
||||
|
||||
**Status:** open (blocks runtime verification on arm64, riscv64 and
|
||||
loong64 hosts).
|
||||
**Status:** resolved for riscv64 (validated end to end under qemu-user)
|
||||
and arm64 (fix in place, consistent with the observed frame convention);
|
||||
open for loong64 until hardware validation.
|
||||
|
||||
**Root cause (found 2026-08-31).** The trampolines advanced SP past the
|
||||
leave-address slot after loading it, while the assembled kernels read
|
||||
their first argument at SP+8 per the frame convention (the amd64 path
|
||||
already kept SP on that slot). Removing the advance fixed riscv64
|
||||
immediately (plain and checked ABI tests pass under qemu-user); the
|
||||
arm64 kernel's pre-fix trace showed exactly the same SP+8 reading. The
|
||||
apparent arm64/loong64 "crashes in the JIT" turned out to be dominated
|
||||
by an unrelated instability: the Go 1.26 and 1.27 runtimes crash under
|
||||
qemu-user arm64 emulation (GC worker start, identical signature with the
|
||||
JIT tests skipped, both qemu 7.2 and 10.2), and the Go loong64 runtime
|
||||
does not start at all. `gasm verify` therefore keeps loong64 kernels on
|
||||
the ground-truth path until hardware validation; the GOARCH-guarded
|
||||
tests (`verify/jit_arch_test.go`, `verify/abi_arch_test.go`) are the
|
||||
hardware validation entry point.
|
||||
|
||||
**State.** The per-architecture trampolines compile for all targets, the
|
||||
kernels they execute are byte-for-byte correct against `go tool asm`, and
|
||||
|
||||
Reference in New Issue
Block a user