From e06c459534fec70b5738d55392794fa963421024 Mon Sep 17 00:00:00 2001 From: Saranxzi Date: Fri, 9 Oct 2026 22:10:57 +0000 Subject: [PATCH] test(libkernel): cover virtual query after partial unmap Carry over the direct mmap regression from PR #2267. The live-extent implementation is already present in the preceding commits. --- core/libs/tests/GuestMemory.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/libs/tests/GuestMemory.cpp b/core/libs/tests/GuestMemory.cpp index 9460eb215..c62cf86b3 100644 --- a/core/libs/tests/GuestMemory.cpp +++ b/core/libs/tests/GuestMemory.cpp @@ -1107,10 +1107,40 @@ static void CheckVirtualQueryForNonReadableGuestRange() { Require(sceKernelMunmap(mapped, page) == 0); } +static void CheckVirtualQueryPartialMunmap() { + constexpr std::size_t page = 0x4000; + const auto failed = reinterpret_cast(static_cast(-1)); + void* raw = mmap_nid_postfix(nullptr, page * 3, 3, 0x1002, -1, 0); + Require(raw != failed); + auto* memory = static_cast(raw); + VirtualQueryInfo before{}; + Require(sceKernelVirtualQuery(memory, 0, &before, sizeof(before)) == 0); + Require(before.start == reinterpret_cast(memory)); + Require(before.end == reinterpret_cast(memory) + page * 3); + Require(munmap_nid_postfix(memory + page, page) == 0); + VirtualQueryInfo first{}; + Require(sceKernelVirtualQuery(memory, 0, &first, sizeof(first)) == 0); + Require(first.start == reinterpret_cast(memory)); + Require(first.end == reinterpret_cast(memory) + page); + VirtualQueryInfo middle{}; + Require(sceKernelVirtualQuery(memory + page, 0, &middle, sizeof(middle)) == SCE_KERNEL_ERROR_EACCES); + VirtualQueryInfo next{}; + Require(sceKernelVirtualQuery(memory + page, 1, &next, sizeof(next)) == 0); + Require(next.start == reinterpret_cast(memory) + page * 2); + Require(next.end == reinterpret_cast(memory) + page * 3); + VirtualQueryInfo tail{}; + Require(sceKernelVirtualQuery(memory + page * 2, 0, &tail, sizeof(tail)) == 0); + Require(tail.start == reinterpret_cast(memory) + page * 2); + Require(tail.end == reinterpret_cast(memory) + page * 3); + Require(munmap_nid_postfix(memory, page) == 0); + Require(munmap_nid_postfix(memory + page * 2, page) == 0); +} + int main() { CheckVirtualQuerySplitFlexibleRanges(); CheckVirtualQueryForNonReadableGuestRange(); CheckReleaseFlexibleMemory(); + CheckVirtualQueryPartialMunmap(); CheckNamedAndHintedMappings(); CheckInternalNamedFlexibleMapping(); CheckBatchMapStopsAtInvalidEntry();