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