From 29a843579d5b0214e3553720ec10e83ab52df0ea Mon Sep 17 00:00:00 2001 From: Scramblrrrr Date: Sun, 11 Oct 2026 23:27:02 -0300 Subject: [PATCH] test(memory): query host holes beside warm collect memos --- .../prx/libSceAgcDriver/tests/WriteTracking.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp b/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp index b3ecb5b81..5489cac1f 100644 --- a/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp @@ -210,6 +210,22 @@ void CheckHostHole() { const auto before = TrackerGeneration(); Require(!Watched(hole, bytes), "an arena host hole reads as watched"); Require(CollectWrites(hole, bytes) == 0 && CollectWritesUncached(hole, bytes) == 0, "an arena host hole was collected"); + auto* watched = static_cast(AllocateWatched(Block, true)); + struct Cleanup { + void* memory; + ~Cleanup() { GuestArena::GuestArenaRelease_nid_postfix(memory, Block); } + } cleanup{watched}; + const auto base = reinterpret_cast(watched); + for (unsigned epoch = 0; epoch < 2; ++epoch) { + BumpCollectEpoch(); + watched[7] ^= 1; + Require(CollectWrites(base + 7, 1) != 0, "a warm host-hole check could not collect its watched range"); + for (unsigned repeat = 0; repeat < 3; ++repeat) { + Require(CollectWrites(base + 7, 1) != 0, "a warm host-hole check lost its watched range"); + Require(CollectWrites(hole, bytes) == 0, "a repeated host-hole query hit a collect memo"); + Require(CollectWrites(hole + 7, 1) == 0, "a page-rounded host-hole query hit a collect memo"); + } + } Require(StoredOver(hole, bytes, before), "an arena host hole reads as not stored over"); Require(!UnchangedSince(hole, bytes, before), "an arena host hole reads as unchanged"); const std::array queries{UnchangedQuery{hole, bytes, before}};