cellSaveData: Ensure savedata_context members are 16-byte aligned

I saw stvx v128{0} (aligned 16-bytes store) usage on the first 16-bytes of CellSaveDataCBResult before funcStat in fw.
Also I saw 4 stw of u32{0} on it as well before funcFile, funcFixed and funcList.
So just add the resets for result before all callbacks, and make all
members of savedata_ontext 16 -byte aligned in case there are more
members guaranteed to be aligned.
This commit is contained in:
Eladash 2020-03-20 20:34:44 +02:00 committed by Ivan
parent ceaee0ec68
commit 01cafc042d

View file

@ -77,15 +77,15 @@ namespace
{ {
struct savedata_context struct savedata_context
{ {
CellSaveDataCBResult result; alignas(16) CellSaveDataCBResult result;
CellSaveDataListGet listGet; alignas(16) CellSaveDataListGet listGet;
CellSaveDataListSet listSet; alignas(16) CellSaveDataListSet listSet;
CellSaveDataFixedSet fixedSet; alignas(16) CellSaveDataFixedSet fixedSet;
CellSaveDataStatGet statGet; alignas(16) CellSaveDataStatGet statGet;
CellSaveDataStatSet statSet; alignas(16) CellSaveDataStatSet statSet;
CellSaveDataFileGet fileGet; alignas(16) CellSaveDataFileGet fileGet;
CellSaveDataFileSet fileSet; alignas(16) CellSaveDataFileSet fileSet;
CellSaveDataDoneGet doneGet; alignas(16) CellSaveDataDoneGet doneGet;
}; };
} }
@ -704,6 +704,8 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
listSet->focusPosition = CELL_SAVEDATA_FOCUSPOS_LISTHEAD; listSet->focusPosition = CELL_SAVEDATA_FOCUSPOS_LISTHEAD;
std::memset(result.get_ptr(), 0, ::offset32(&CellSaveDataCBResult::userdata));
// List Callback // List Callback
funcList(ppu, result, listGet, listSet); funcList(ppu, result, listGet, listSet);
@ -962,6 +964,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
doneGet->excResult = CELL_SAVEDATA_ERROR_NODATA; doneGet->excResult = CELL_SAVEDATA_ERROR_NODATA;
} }
std::memset(result.get_ptr(), 0, ::offset32(&CellSaveDataCBResult::userdata));
funcDone(ppu, result, doneGet); funcDone(ppu, result, doneGet);
}; };
@ -1060,6 +1063,8 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
lv2_sleep(ppu, 250); lv2_sleep(ppu, 250);
std::memset(result.get_ptr(), 0, ::offset32(&CellSaveDataCBResult::userdata));
// Fixed Callback // Fixed Callback
funcFixed(ppu, result, listGet, fixedSet); funcFixed(ppu, result, listGet, fixedSet);
@ -1358,6 +1363,8 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
statGet->sysSizeKB = 35; // always reported as 35 regardless of actual file sizes statGet->sysSizeKB = 35; // always reported as 35 regardless of actual file sizes
statGet->sizeKB = !save_entry.isNew ? ::narrow<s32>((size_bytes / 1024) + statGet->sysSizeKB) : 0; statGet->sizeKB = !save_entry.isNew ? ::narrow<s32>((size_bytes / 1024) + statGet->sysSizeKB) : 0;
std::memset(result.get_ptr(), 0, ::offset32(&CellSaveDataCBResult::userdata));
// Stat Callback // Stat Callback
funcStat(ppu, result, statGet, statSet); funcStat(ppu, result, statGet, statSet);
@ -1516,6 +1523,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
std::memset(fileSet.get_ptr(), 0, fileSet.size()); std::memset(fileSet.get_ptr(), 0, fileSet.size());
std::memset(fileGet->reserved, 0, sizeof(fileGet->reserved)); std::memset(fileGet->reserved, 0, sizeof(fileGet->reserved));
std::memset(result.get_ptr(), 0, ::offset32(&CellSaveDataCBResult::userdata));
funcFile(ppu, result, fileGet, fileSet); funcFile(ppu, result, fileGet, fileSet);