From 65488078a465bf2191e4a760b3e19e2dd77deeea Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 3 Apr 2017 16:01:50 +0300 Subject: [PATCH] cellSaveData workaround --- rpcs3/Emu/Cell/Modules/cellSaveData.cpp | 37 +++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index 15c8287cd5..d6b14e6e3b 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -39,6 +39,23 @@ enum : u32 SAVEDATA_OP_FIXED_DELETE = 14, }; +namespace +{ + struct savedata_context + { + CellSaveDataCBResult result; + CellSaveDataListGet listGet; + CellSaveDataListSet listSet; + CellSaveDataFixedSet fixedSet; + CellSaveDataStatGet statGet; + CellSaveDataStatSet statSet; + CellSaveDataFileGet fileGet; + CellSaveDataFileSet fileSet; + }; +} + +vm::gvar g_savedata_context; + std::mutex g_savedata_mutex; static NEVER_INLINE s32 savedata_op(ppu_thread& ppu, u32 operation, u32 version, vm::cptr dirName, @@ -54,14 +71,16 @@ static NEVER_INLINE s32 savedata_op(ppu_thread& ppu, u32 operation, u32 version, return CELL_SAVEDATA_ERROR_BUSY; } - vm::var result; - vm::var listGet; - vm::var listSet; - vm::var fixedSet; - vm::var statGet; - vm::var statSet; - vm::var fileGet; - vm::var fileSet; + *g_savedata_context = {}; + + vm::ptr result = g_savedata_context.ptr(&savedata_context::result); + vm::ptr listGet = g_savedata_context.ptr(&savedata_context::listGet); + vm::ptr listSet = g_savedata_context.ptr(&savedata_context::listSet); + vm::ptr fixedSet = g_savedata_context.ptr(&savedata_context::fixedSet); + vm::ptr statGet = g_savedata_context.ptr(&savedata_context::statGet); + vm::ptr statSet = g_savedata_context.ptr(&savedata_context::statSet); + vm::ptr fileGet = g_savedata_context.ptr(&savedata_context::fileGet); + vm::ptr fileSet = g_savedata_context.ptr(&savedata_context::fileSet); // path of the specified user (00000001 by default) const std::string& base_dir = vfs::get(fmt::format("/dev_hdd0/home/%08u/savedata/", userId ? userId : 1u)); @@ -943,6 +962,8 @@ s32 cellSaveDataUserGetListItem(u32 userId, vm::cptr dirName, vm::ptr