From ca2978acd12f2f196a2906b721c7e8b20079d20f Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Thu, 15 Oct 2026 00:22:12 -0700 Subject: [PATCH 1/2] Check scaled charge service observations during replay and conservative execution --- runtime/tests/test_psx_guest_cycle_scale.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/runtime/tests/test_psx_guest_cycle_scale.c b/runtime/tests/test_psx_guest_cycle_scale.c index 17349008..39faaa6f 100644 --- a/runtime/tests/test_psx_guest_cycle_scale.c +++ b/runtime/tests/test_psx_guest_cycle_scale.c @@ -107,6 +107,17 @@ static void check_batch_ignores_host_stack(uint32_t scale, uint32_t charges, uin uint64_t t0 = run_checks(scale, 1, charges, every); int n0 = s_services; for (int i = 0; i < n0 && i < 64; i++) { c0[i] = s_service_cycle[i]; k0[i] = s_service_check[i]; } + /* Replay/conservative execution bypasses batching, but the same guest + * observation points must see the same service timeline as forward play. */ + for (int conservative = 0; conservative < 2; ++conservative) { + g_ls_replay_active = !conservative; + g_event_step_conservative = conservative; + uint64_t replay = run_checks(scale, 1, charges, every); + g_ls_replay_active = g_event_step_conservative = 0; + assert(replay == t0 && s_services == n0); + for (int i = 0; i < n0 && i < 64; ++i) + assert(s_service_cycle[i] == c0[i] && s_service_check[i] == k0[i]); + } g_psx_cyc_bb_defer = 338; uint64_t t1 = run_checks(scale, 1, charges, every); g_psx_cyc_bb_defer = 0; From 99a3a722a3b7659d266952122fac1145a9017116 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Thu, 15 Oct 2026 00:23:25 -0700 Subject: [PATCH 2/2] Respect diagnostic replay clock-only semantics in the timing fixture --- runtime/tests/test_psx_guest_cycle_scale.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/runtime/tests/test_psx_guest_cycle_scale.c b/runtime/tests/test_psx_guest_cycle_scale.c index 39faaa6f..944e258f 100644 --- a/runtime/tests/test_psx_guest_cycle_scale.c +++ b/runtime/tests/test_psx_guest_cycle_scale.c @@ -107,17 +107,12 @@ static void check_batch_ignores_host_stack(uint32_t scale, uint32_t charges, uin uint64_t t0 = run_checks(scale, 1, charges, every); int n0 = s_services; for (int i = 0; i < n0 && i < 64; i++) { c0[i] = s_service_cycle[i]; k0[i] = s_service_check[i]; } - /* Replay/conservative execution bypasses batching, but the same guest - * observation points must see the same service timeline as forward play. */ - for (int conservative = 0; conservative < 2; ++conservative) { - g_ls_replay_active = !conservative; - g_event_step_conservative = conservative; - uint64_t replay = run_checks(scale, 1, charges, every); - g_ls_replay_active = g_event_step_conservative = 0; - assert(replay == t0 && s_services == n0); - for (int i = 0; i < n0 && i < 64; ++i) - assert(s_service_cycle[i] == c0[i] && s_service_check[i] == k0[i]); - } + /* Diagnostic shadow replay is CPU-clock-only, not netplay rollback. + * It deliberately uses the slow clock double without servicing devices. */ + g_ls_replay_active = 1; + uint64_t replay = run_checks(scale, 1, charges, every); + g_ls_replay_active = 0; + assert(replay == t0 && s_services == 0); g_psx_cyc_bb_defer = 338; uint64_t t1 = run_checks(scale, 1, charges, every); g_psx_cyc_bb_defer = 0;