From b0bb69c0e5a4aa9f94979ec513dc926db3bd6d05 Mon Sep 17 00:00:00 2001 From: RuoyuZhou Date: Fri, 17 Jul 2026 17:43:13 +0800 Subject: [PATCH] Bound v0.57 differential trace capture deterministically The comparison flow now stops QEMU after a configurable trace prefix instead of relying on the guest finisher to terminate the process. Cleanup also owns the child process so interrupted runs cannot leak an emulator. Constraint: The mcopy trace fixture intentionally enters a pass/fail terminal loop after its MMIO result. Rejected: Add a platform-specific timeout dependency | macOS does not provide the GNU timeout command by default. Confidence: high Scope-risk: narrow Directive: Keep the default prefix above the six-commit fallback comparison window. Tested: clean merged QEMU versus pyCircuit fallback trace, six commits matched Not-tested: Full non-fallback pyCircuit trace --- .../linx/flows/tools/run_linx_qemu_vs_pyc.sh | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/contrib/linx/flows/tools/run_linx_qemu_vs_pyc.sh b/contrib/linx/flows/tools/run_linx_qemu_vs_pyc.sh index 56bdb7a..7a564f1 100755 --- a/contrib/linx/flows/tools/run_linx_qemu_vs_pyc.sh +++ b/contrib/linx/flows/tools/run_linx_qemu_vs_pyc.sh @@ -82,7 +82,12 @@ fi WORK="$(mktemp -d "${TMPDIR:-/tmp}/linx-diff.XXXXXX")" KEEP_WORK=0 +QEMU_PID="" cleanup() { + if [[ -n "${QEMU_PID}" ]] && kill -0 "${QEMU_PID}" >/dev/null 2>&1; then + kill -TERM "${QEMU_PID}" >/dev/null 2>&1 || true + wait "${QEMU_PID}" >/dev/null 2>&1 || true + fi if [[ "${KEEP_WORK}" == "0" ]]; then rm -rf "${WORK}" else @@ -124,7 +129,30 @@ if [[ "$(basename -- "$QEMU_BIN")" != *bios-none ]]; then fi echo "[qemu] commit trace: $QEMU_TRACE" -LINX_COMMIT_TRACE="$QEMU_TRACE" "$QEMU_BIN" "${QEMU_ARGS[@]}" >/dev/null +QEMU_TRACE_MIN_RECORDS="${LINX_QEMU_VS_PYC_TRACE_MIN_RECORDS:-64}" +LINX_COMMIT_TRACE="$QEMU_TRACE" "$QEMU_BIN" "${QEMU_ARGS[@]}" >/dev/null & +QEMU_PID=$! +while kill -0 "${QEMU_PID}" >/dev/null 2>&1; do + if [[ -s "${QEMU_TRACE}" ]] && + [[ "$(wc -l <"${QEMU_TRACE}")" -ge "${QEMU_TRACE_MIN_RECORDS}" ]]; then + kill -TERM "${QEMU_PID}" >/dev/null 2>&1 || true + break + fi + sleep 0.01 +done +set +e +wait "${QEMU_PID}" +qemu_rc=$? +set -e +QEMU_PID="" +if [[ "${qemu_rc}" -ne 0 && "${qemu_rc}" -ne 143 ]]; then + echo "error: QEMU trace run failed (rc=${qemu_rc})" >&2 + exit "${qemu_rc}" +fi +if [[ ! -s "${QEMU_TRACE}" ]]; then + echo "error: qemu trace was not produced: ${QEMU_TRACE}" >&2 + exit 2 +fi echo "[pyc] commit trace: $PYC_TRACE" PYC_KONATA=0 PYC_EXPECT_EXIT=0 PYC_BOOT_PC=0x10000 PYC_COMMIT_TRACE="$PYC_TRACE" \