diff --git a/rpcs3/Emu/Cell/Modules/cellGame.cpp b/rpcs3/Emu/Cell/Modules/cellGame.cpp index 3881c8498f..a726f7ac8e 100644 --- a/rpcs3/Emu/Cell/Modules/cellGame.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGame.cpp @@ -22,6 +22,11 @@ LOG_CHANNEL(cellGame); +vm::gvar g_stat_get; +vm::gvar g_stat_set; +vm::gvar g_file_param; +vm::gvar g_cb_result; + template<> void fmt_class_string::format(std::string& out, u64 arg) { @@ -224,9 +229,15 @@ error_code cellHddGameCheck(ppu_thread& ppu, u32 version, vm::cptr dirName const std::string usrdir = dir + "/USRDIR"; - vm::var result; - vm::var get; - vm::var set; + auto& get = g_stat_get; + auto& set = g_stat_set; + auto& result = g_cb_result; + + std::memset(get.get_ptr(), 0, sizeof(*get)); + std::memset(set.get_ptr(), 0, sizeof(*set)); + std::memset(result.get_ptr(), 0, sizeof(*result)); + + const std::string local_dir = vfs::get(dir); // 40 GB - 1 kilobyte. The reasoning is that many games take this number and multiply it by 1024, to get the amount of bytes. With 40GB exactly, // this will result in an overflow, and the size would be 0, preventing the game from running. By reducing 1 kilobyte, we make sure that even @@ -234,17 +245,15 @@ error_code cellHddGameCheck(ppu_thread& ppu, u32 version, vm::cptr dirName get->hddFreeSizeKB = 40 * 1024 * 1024 - 1; get->isNewData = CELL_HDDGAME_ISNEWDATA_EXIST; get->sysSizeKB = 0; // TODO - get->atime = 0; // TODO - get->ctime = 0; // TODO - get->mtime = 0; // TODO + get->st_atime_ = 0; // TODO + get->st_ctime_ = 0; // TODO + get->st_mtime_ = 0; // TODO get->sizeKB = CELL_HDDGAME_SIZEKB_NOTCALC; strcpy_trunc(get->contentInfoPath, dir); - strcpy_trunc(get->hddGamePath, usrdir); + strcpy_trunc(get->gameDataPath, usrdir); - vm::var setParam; - set->setParam = setParam; - - const std::string& local_dir = vfs::get(dir); + std::memset(g_file_param.get_ptr(), 0, sizeof(*g_file_param)); + set->setParam = g_file_param; if (!fs::is_dir(local_dir)) { @@ -758,9 +767,13 @@ error_code cellGameDataCheckCreate2(ppu_thread& ppu, u32 version, vm::cptr const std::string usrdir = dir + "/USRDIR"; - vm::var cbResult; - vm::var cbGet; - vm::var cbSet; + auto& cbResult = g_cb_result; + auto& cbGet = g_stat_get; + auto& cbSet = g_stat_set; + + std::memset(cbGet.get_ptr(), 0, sizeof(*cbGet)); + std::memset(cbSet.get_ptr(), 0, sizeof(*cbSet)); + std::memset(cbResult.get_ptr(), 0, sizeof(*cbResult)); cbGet->isNewData = new_data; @@ -789,6 +802,9 @@ error_code cellGameDataCheckCreate2(ppu_thread& ppu, u32 version, vm::cptr strcpy_trunc(cbGet->getParam.titleLang[i], psf::get_string(sfo, fmt::format("TITLE_%02d", i))); } + std::memset(g_file_param.get_ptr(), 0, sizeof(*g_file_param)); + cbSet->setParam = g_file_param; + funcStat(ppu, cbResult, cbGet, cbSet); std::string error_msg; @@ -1495,4 +1511,9 @@ DECLARE(ppu_module_manager::cellGame)("cellGame", []() REG_FUNC(cellGame, cellGameThemeInstall); REG_FUNC(cellGame, cellGameThemeInstallFromBuffer); + + REG_VAR(cellGame, g_stat_get).flag(MFF_HIDDEN); + REG_VAR(cellGame, g_stat_set).flag(MFF_HIDDEN); + REG_VAR(cellGame, g_file_param).flag(MFF_HIDDEN); + REG_VAR(cellGame, g_cb_result).flag(MFF_HIDDEN); }); diff --git a/rpcs3/Emu/Cell/Modules/cellGame.h b/rpcs3/Emu/Cell/Modules/cellGame.h index ed1f64219c..f186c3a290 100644 --- a/rpcs3/Emu/Cell/Modules/cellGame.h +++ b/rpcs3/Emu/Cell/Modules/cellGame.h @@ -226,7 +226,9 @@ struct CellGameDataSystemFileParam char reserved1[2]; be_t parentalLevel; be_t attribute; - char reserved2[256]; + be_t resolution; // cellHddGameCheck member: GD doesn't have this value + be_t soundFormat; // cellHddGameCheck member: GD doesn't have this value + char reserved2[248]; }; struct CellDiscGameSystemFileParam @@ -307,50 +309,10 @@ enum CELL_HDDGAME_SIZEKB_NOTCALC = -1, }; -struct CellHddGameSystemFileParam -{ - char title[CELL_HDDGAME_SYSP_TITLE_SIZE]; - char titleLang[CELL_HDDGAME_SYSP_LANGUAGE_NUM][CELL_HDDGAME_SYSP_TITLE_SIZE]; - char titleId[CELL_HDDGAME_SYSP_TITLEID_SIZE]; - char reserved0[2]; - char dataVersion[CELL_HDDGAME_SYSP_VERSION_SIZE]; - char reserved1[2]; - be_t attribute; - be_t parentalLevel; - be_t resolution; - be_t soundFormat; - char reserved2[256]; -}; - -struct CellHddGameCBResult -{ - be_t result; - be_t errNeedSizeKB; - vm::bptr invalidMsg; - vm::bptr reserved; -}; - -struct CellHddGameStatGet -{ - be_t hddFreeSizeKB; - be_t isNewData; - char contentInfoPath[CELL_HDDGAME_PATH_MAX]; - char hddGamePath[CELL_HDDGAME_PATH_MAX]; - char reserved0[2]; - be_t atime; - be_t mtime; - be_t ctime; - CellHddGameSystemFileParam getParam; - be_t sizeKB; - be_t sysSizeKB; - char reserved1[68]; -}; - -struct CellHddGameStatSet -{ - vm::bptr setParam; - vm::bptr reserved; -}; +using CellHddGameStatGet = CellGameDataStatGet; +using CellHddGameStatSet = CellGameDataStatSet; +using CellHddGameSystemFileParam = CellGameDataSystemFileParam; +using CellHddGameCBResult = CellGameDataCBResult; typedef void(CellHddGameStatCallback)(vm::ptr cbResult, vm::ptr get, vm::ptr set); typedef void(CellGameThemeInstallCallback)(u32 fileOffset, u32 readSize, vm::ptr buf);