From 0cb5ca7203c19e0c110a3d35c2cebf88e555401b Mon Sep 17 00:00:00 2001 From: Chad Date: Mon, 5 Oct 2026 15:41:49 -0500 Subject: [PATCH] fix(libs): take the AMM submit checks from ampr_emu The AMM submit forms now return EINVAL for a priority above 2 and EPERM for a null command buffer, in that order, as ampr_emu's amm_validate_submit_args does, instead of EINVAL for a null buffer. Co-Authored-By: Claude Opus 5.5 --- core/libs/prx/libSceAmpr/Export.cpp | 12 ++++++------ core/libs/tests/GuestAmpr.cpp | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/libs/prx/libSceAmpr/Export.cpp b/core/libs/prx/libSceAmpr/Export.cpp index 0f4f9b32a..05a651526 100644 --- a/core/libs/prx/libSceAmpr/Export.cpp +++ b/core/libs/prx/libSceAmpr/Export.cpp @@ -624,15 +624,15 @@ int APS5_VABI sceAmprAmmGetVirtualAddressRanges(std::uint64_t* start, std::uint6 } int APS5_VABI sceAmprAmmSubmitCommandBuffer(void* base, std::uint32_t offset, std::uint32_t priority) { - (void)priority; - if (!base) return SCE_KERNEL_ERROR_EINVAL; + if (priority > 2u) return SCE_KERNEL_ERROR_EINVAL; + if (!base) return SCE_KERNEL_ERROR_EPERM; AmmSubmit_nid_no_patch(base, offset); return 0; } int APS5_VABI sceAmprAmmSubmitCommandBuffer2(void* base, std::uint32_t offset, std::uint32_t priority, AmmSubmitResult* result, std::uint32_t* id) { - (void)priority; - if (!base) return SCE_KERNEL_ERROR_EINVAL; + if (priority > 2u) return SCE_KERNEL_ERROR_EINVAL; + if (!base) return SCE_KERNEL_ERROR_EPERM; const auto submitted = AmmSubmit_nid_no_patch(base, offset); if (result) *result = {0, 0}; if (id) *id = submitted; @@ -640,8 +640,8 @@ int APS5_VABI sceAmprAmmSubmitCommandBuffer2(void* base, std::uint32_t offset, s } int APS5_VABI sceAmprAmmSubmitCommandBuffer3(void* base, std::uint32_t offset, std::uint32_t priority, std::uint32_t* id) { - (void)priority; - if (!base) return SCE_KERNEL_ERROR_EINVAL; + if (priority > 2u) return SCE_KERNEL_ERROR_EINVAL; + if (!base) return SCE_KERNEL_ERROR_EPERM; const auto submitted = AmmSubmit_nid_no_patch(base, offset); if (id) *id = submitted; return 0; diff --git a/core/libs/tests/GuestAmpr.cpp b/core/libs/tests/GuestAmpr.cpp index 06ba7f696..d06f21ea9 100644 --- a/core/libs/tests/GuestAmpr.cpp +++ b/core/libs/tests/GuestAmpr.cpp @@ -646,7 +646,10 @@ void TestAmm() { Require(sceAmprAmmCommandBufferUnmap(&exact.buffer, start, page) == 0); Require(sceAmprAmmCommandBufferUnmap(&exact.buffer, start, page) == busy); Require(sceAmprAmmCommandBufferMap(&exact.buffer, start, page, 0, cpuReadWrite) == busy); - Require(sceAmprAmmSubmitCommandBuffer(nullptr, 0, 0) == invalidArgument); + Require(sceAmprAmmSubmitCommandBuffer(nullptr, 0, 0) == permissionDenied); + Require(sceAmprAmmSubmitCommandBuffer(exact.memory.data(), 0, 3) == invalidArgument); + Require(sceAmprAmmSubmitCommandBuffer3(nullptr, 0, 3, nullptr) == invalidArgument); + Require(sceAmprAmmSubmitCommandBuffer(exact.memory.data(), 0, 2) == 0); Require(sceAmprAmmMeasureAmmCommandSizeMap(start, page, 0, 0x04) == ammRejected); Require(sceAmprAmmMeasureAmmCommandSizeMapWithGpuMaskId(start + 8, page, 0, cpuReadWrite, 0) == ammRejected);