From de242fcbac97685254049d1ca22d80dee92abb8a Mon Sep 17 00:00:00 2001 From: zaryabzip <110787259+zaryabzip@users.noreply.github.com> Date: Mon, 2 Nov 2026 21:14:22 +0500 Subject: [PATCH] test(libScePad): check the thirteen exports' argument checks --- core/libs/prx/libScePad/CMakeLists.txt | 9 ++++ core/libs/tests/GuestPadFirmwareChecks.cpp | 62 ++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 core/libs/tests/GuestPadFirmwareChecks.cpp diff --git a/core/libs/prx/libScePad/CMakeLists.txt b/core/libs/prx/libScePad/CMakeLists.txt index b06aef4f09..f979b4eff4 100644 --- a/core/libs/prx/libScePad/CMakeLists.txt +++ b/core/libs/prx/libScePad/CMakeLists.txt @@ -42,6 +42,15 @@ if(BUILD_TESTING) set_tests_properties(guest_pad_controller_queries PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_pad_firmware_checks_tests ${LIBS_INCLUDE_DIR}/tests/GuestPadFirmwareChecks.cpp) + target_include_directories(guest_pad_firmware_checks_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_pad_firmware_checks_tests PRIVATE libScePad libc) + configure_windows_unwind(guest_pad_firmware_checks_tests) + add_test(NAME guest_pad_firmware_checks COMMAND guest_pad_firmware_checks_tests) + if(WIN32) + set_tests_properties(guest_pad_firmware_checks PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endif() if(BUILD_TESTING) diff --git a/core/libs/tests/GuestPadFirmwareChecks.cpp b/core/libs/tests/GuestPadFirmwareChecks.cpp new file mode 100644 index 0000000000..54fe7ec02c --- /dev/null +++ b/core/libs/tests/GuestPadFirmwareChecks.cpp @@ -0,0 +1,62 @@ +#include "SceTypes.hpp" +#include "prx/libScePad/include/Pad.hpp" +#include "prx/libScePad/include/PadState.hpp" +#include +#include +#include + +using ReadHistoryFn = int (APS5_VABI*)(std::int32_t, PadHistoryData*, std::uint32_t); +using OpenExt2Fn = int (APS5_VABI*)(std::int32_t, std::int32_t, const void*); + +static void Require(bool value) { if (!value) std::abort(); } + +template +static Function As(Export function) { + return reinterpret_cast(function); +} + +int main() { + const auto readHistory = As(&scePadReadHistory); + const auto openExt2 = As(&scePadOpenExt2); + alignas(8) std::array buffer{}; + std::array param{}; + std::uint32_t capability = 7; + std::uint64_t count = 7; + std::uint64_t activeTime = 7; + std::int32_t deviceId = 7; + auto* data = buffer.data(); + + Require(scePadGetDeviceInfo(0, reinterpret_cast(data)) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetCapability(0, &capability) == PAD_ERROR_NOT_INITIALIZED && capability == 7); + Require(scePadGetVersionInfo(1, reinterpret_cast(data)) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetIdleCount(1) == 0); + Require(scePadGetControllerIdleCount(1, &count) == PAD_ERROR_NOT_INITIALIZED && count == 7); + Require(scePadGetActiveTime(1, 0, &activeTime) == PAD_ERROR_NOT_INITIALIZED && activeTime == 7); + Require(scePadSetPS4BcVibrationMode(0) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetInfoByPortType(1, reinterpret_cast(data)) == PAD_ERROR_INVALID_ARG); + Require(scePadGetInfoByPortType(0, reinterpret_cast(data)) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetInfoByPortType(2, nullptr) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetDeviceId(1, &deviceId) == PAD_ERROR_NOT_INITIALIZED && deviceId == 7); + Require(scePadGetExtensionUnitInfo(1, reinterpret_cast(data)) == PAD_ERROR_NOT_INITIALIZED); + Require(readHistory(1, reinterpret_cast(data), 0x960) == PAD_ERROR_NOT_INITIALIZED); + Require(openExt2(0x10000000, 0x10, param.data()) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadReadStateExt(12345, reinterpret_cast(data)) == PAD_ERROR_INVALID_HANDLE); + + Require(scePadInit_nid_postfix() == PAD_OK); + Require(scePadGetDeviceInfo(0, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetCapability(0, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetVersionInfo(1, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetControllerIdleCount(0, &count) == PAD_ERROR_INVALID_ARG && scePadGetControllerIdleCount(1, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetActiveTime(1, 0, nullptr) == PAD_ERROR_INVALID_ARG); + for (int type : {1, 3, 4, -1}) Require(scePadGetInfoByPortType(type, reinterpret_cast(data)) == PAD_ERROR_INVALID_ARG); + Require(scePadGetDeviceId(1, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetDeviceId(12345, &deviceId) == PAD_ERROR_INVALID_HANDLE && deviceId == -1); + Require(scePadGetExtensionUnitInfo(1, nullptr) == PAD_ERROR_INVALID_ARG); + for (std::uint32_t size : {0u, 0x48u, 0x958u, 0x961u}) Require(readHistory(1, reinterpret_cast(data), size) == PAD_ERROR_INVALID_ARG); + Require(openExt2(0x10000000, 0x8, param.data()) == PAD_ERROR_INVALID_ARG && openExt2(0x10000000, 0x10, nullptr) == PAD_ERROR_INVALID_ARG); + + const int handle = scePadOpen_nid_postfix(0x10000000, PAD_PORT_TYPE_STANDARD, 0, nullptr); + Require(handle > 0); + Require(scePadReadStateExt(handle, nullptr) == PAD_ERROR_INVALID_ARG); + return 0; +}