From 2152a770058cb965f5b59790a476d420af38e498 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 17 Nov 2019 00:22:56 +0100 Subject: [PATCH] HLE: stub cellCrossController some more --- .../Emu/Cell/Modules/cellCrossController.cpp | 86 ++++++++++++++----- rpcs3/Emu/Cell/Modules/cellCrossController.h | 52 +++++++++++ rpcs3/emucore.vcxproj | 1 + rpcs3/emucore.vcxproj.filters | 3 + 4 files changed, 119 insertions(+), 23 deletions(-) create mode 100644 rpcs3/Emu/Cell/Modules/cellCrossController.h diff --git a/rpcs3/Emu/Cell/Modules/cellCrossController.cpp b/rpcs3/Emu/Cell/Modules/cellCrossController.cpp index 25aa72f85b..a930e26e07 100644 --- a/rpcs3/Emu/Cell/Modules/cellCrossController.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCrossController.cpp @@ -1,39 +1,79 @@ -#include "stdafx.h" +#include "stdafx.h" #include "Emu/System.h" #include "Emu/Cell/PPUModule.h" #include "cellSysutil.h" - +#include "cellCrossController.h" LOG_CHANNEL(cellCrossController); -enum +template <> +void fmt_class_string::format(std::string& out, u64 arg) { - CELL_CROSS_CONTROLLER_STATUS_INITIALIZED = 1, - CELL_CROSS_CONTROLLER_STATUS_FINALIZED = 2 -}; + format_enum(out, arg, [](CellCrossControllerError value) + { + switch (value) + { + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_CANCEL); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_NETWORK); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_OUT_OF_MEMORY); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_FATAL); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_PKG_FILE_OPEN); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_SIG_FILE_OPEN); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_ICON_FILE_OPEN); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILE); + STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INTERNAL); + } -struct CellCrossControllerParam -{ - vm::bcptr pPackageFileName; - vm::bcptr pSignatureFileName; - vm::bcptr pIconFileName; - vm::bptr option; -}; + return unknown; + }); +} -struct CellCrossControllerPackageInfo -{ - vm::bcptr pTitle; - vm::bcptr pTitleId; - vm::bcptr pAppVer; -}; - -using CellCrossControllerCallback = void(s32 status, s32 errorCode, vm::ptr option, vm::ptr userdata); - -s32 cellCrossControllerInitialize(vm::cptr pParam, vm::cptr pPkgInfo, vm::ptr cb, vm::ptr userdata) // LittleBigPlanet 2 and 3 +error_code cellCrossControllerInitialize(vm::cptr pParam, vm::cptr pPkgInfo, vm::ptr cb, vm::ptr userdata) // LittleBigPlanet 2 and 3 { cellCrossController.todo("cellCrossControllerInitialize(pParam=*0x%x, pPkgInfo=*0x%x, cb=*0x%x, userdata=*0x%x)", pParam, pPkgInfo, cb, userdata); + // TODO + //if (something) + //{ + // return CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE; + //} + + if (!pParam || !pPkgInfo) + { + return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE; + } + + // Check if the strings exceed the allowed size (not counting null terminators) + + if (!pParam->pPackageFileName || !memchr(pParam->pPackageFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1)) + { + return CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME; + } + + if (!pParam->pSignatureFileName || !memchr(pParam->pSignatureFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1)) + { + return CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME; + } + + if (!pParam->pIconFileName || !memchr(pParam->pIconFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1)) + { + return CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME; + } + + if (!pPkgInfo->pAppVer || !memchr(pPkgInfo->pAppVer.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_APP_VER_LEN + 1) || + !pPkgInfo->pTitleId || !memchr(pPkgInfo->pTitleId.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_TITLE_ID_LEN + 1) || + !pPkgInfo->pTitle || !memchr(pPkgInfo->pTitle.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_TITLE_LEN + 1) || + !cb) + { + return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE; + } + sysutil_register_cb([=](ppu_thread& ppu) -> s32 { cb(ppu, CELL_CROSS_CONTROLLER_STATUS_INITIALIZED, CELL_OK, vm::null, userdata); diff --git a/rpcs3/Emu/Cell/Modules/cellCrossController.h b/rpcs3/Emu/Cell/Modules/cellCrossController.h new file mode 100644 index 0000000000..4f8037c6d8 --- /dev/null +++ b/rpcs3/Emu/Cell/Modules/cellCrossController.h @@ -0,0 +1,52 @@ +#pragma once + +enum CellCrossControllerError : u32 +{ + CELL_CROSS_CONTROLLER_ERROR_CANCEL = 0x8002cd80, + CELL_CROSS_CONTROLLER_ERROR_NETWORK = 0x8002cd81, + CELL_CROSS_CONTROLLER_ERROR_OUT_OF_MEMORY = 0x8002cd90, + CELL_CROSS_CONTROLLER_ERROR_FATAL = 0x8002cd91, + CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME = 0x8002cd92, + CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME = 0x8002cd93, + CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME = 0x8002cd94, + CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE = 0x8002cd95, + CELL_CROSS_CONTROLLER_ERROR_PKG_FILE_OPEN = 0x8002cd96, + CELL_CROSS_CONTROLLER_ERROR_SIG_FILE_OPEN = 0x8002cd97, + CELL_CROSS_CONTROLLER_ERROR_ICON_FILE_OPEN = 0x8002cd98, + CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE = 0x8002cd99, + CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILE = 0x8002cd9a, + CELL_CROSS_CONTROLLER_ERROR_INTERNAL = 0x8002cda0, +}; + +enum +{ + CELL_CROSS_CONTROLLER_STATUS_INITIALIZED = 1, + CELL_CROSS_CONTROLLER_STATUS_FINALIZED = 2 +}; + +enum +{ + CELL_CROSS_CONTROLLER_PKG_APP_VER_LEN = 6, // e.g. 01.00 + CELL_CROSS_CONTROLLER_PKG_TITLE_ID_LEN = 10, // e.g. NEKO12345 + CELL_CROSS_CONTROLLER_PKG_TITLE_LEN = 52, // e.g. Cat Simulator 5 + + // Undefined helper value + CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN = 255, +}; + +struct CellCrossControllerParam +{ + vm::bcptr pPackageFileName; + vm::bcptr pSignatureFileName; + vm::bcptr pIconFileName; + vm::bptr option; +}; + +struct CellCrossControllerPackageInfo +{ + vm::bcptr pTitle; + vm::bcptr pTitleId; + vm::bcptr pAppVer; +}; + +using CellCrossControllerCallback = void(s32 status, s32 errorCode, vm::ptr option, vm::ptr userdata); diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index c4991faa41..1d432d5f09 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -389,6 +389,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 0a7828922f..9e11c17ff6 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1579,5 +1579,8 @@ Emu\GPU\RSX\Overlays + + Emu\Cell\Modules +