Analysis, hwtest and fixes made by Opus 5.5. Tested by me.
(confirmed) Fixes #19163
Relates https://github.com/RPCS3/rpcs3/pull/18873
Bug (#19163)
When the save slot limit is reached, some games hide the "New Save" entry (listSet->newData = NULL) but keep focusPosition = CELL_SAVEDATA_FOCUSPOS_NEWDATA. RPCS3 rejected this with CELL_SAVEDATA_ERROR_PARAM (param error 34) and never showed the list, so saving silently failed (God of War III at 32 saves, Cars Race O Rama at 5). The check came from #7742 (d58f52ff3), and real hardware confirms it only for Delete lists. This replaces the earlier attempt in #18873, which had no hardware evidence.
Fix (cellSaveData.cpp, +27/-2)
- Load/Save lists with focus NEWDATA and no new data entry now focus the list head (empty list β no focus) instead of failing. Delete lists keep error 34.
- Delete lists reject a listSet->newData entry with CELL_SAVEDATA_ERROR_PARAM, and their initial focusPosition is DIRNAME (console: 0 for Delete, 1 for Load/Save).
- The load confirmation for the new data entry shows its title.
Hardware test (PSL1GHT, 22 cases, saves NDT5-Aβ¦E / NDT1-A / none)
SAVEDATA_NEWDATA_FOCUS_HWTEST.zip
βββββββββββ¬ββββββββββββββ¬βββββββββββββ¬βββββββββββ¬ββββββββββββββββ¬βββββββ¬ββββββββββββββ
β Case β Call β Focus β newData β PS3 β This β Upstream β
β β β β β β PR β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β β β HEAD / β β β β β
β C1βC4 β ListLoad2 β TAIL / β NULL β A / E / D / C β same β same β
β β Γ5 β LATEST / β β β β β
β β β OLDEST β β β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C5, C6 β ListLoad2 β NEWDATA β NULL β head (NDT5-A, β same β err 34 β
β β Γ5, Γ1 β β β NDT1-A) β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C7 β ListLoad2 β NEWDATA β NULL β "no data" β β same β err 34 β
β β Γ0 β β β CELL_CANCEL β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C8, C9 β ListSave2 β NEWDATA β NULL β head (NDT5-A, β same β err 34 β
β β Γ5, Γ1 β β β NDT1-A) β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C10 β ListSave2 β NEWDATA β NULL β "no data" β β same β err 34 β
β β Γ0 β β β CELL_CANCEL β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C11 β ListLoad2 β 0xFF β NULL β err 34 β same β same β
β β Γ5 β β β β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C12βC14 β ListDelete β NEWDATA β NULL β err 34 β same β same β
β β Γ1, Γ0, Γ5 β β β β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β β β NEWDATA / β HEAD / β β β crash in β
β C15βC17 β ListDelete β NEWDATA / β TAIL / β PARAM error β same β C15, β
β β Γ5 β TAIL β HEAD β β β C16βC22 not β
β β β β β β β run β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C18 β ListLoad2 β NEWDATA β HEAD β new entry β same β β β
β β Γ5 β β β β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β β ListSave2 β NEWDATA / β HEAD / β β β β
β C19βC21 β Γ5 β NEWDATA / β TAIL / β new entry β same β β β
β β β HEAD β HEAD β β β β
βββββββββββΌββββββββββββββΌβββββββββββββΌβββββββββββΌββββββββββββββββΌβββββββΌββββββββββββββ€
β C22 β ListSave2 β TAIL β TAIL β NDT5-E β same β β β
β β Γ5 β β β β β β
βββββββββββ΄ββββββββββββββ΄βββββββββββββ΄βββββββββββ΄ββββββββββββββββ΄βββββββ΄ββββββββββββββ
This PR matches the PS3 in all 22 cases. Upstream differs in C5βC10 and crashes in C15: it hits an out-of-range index on save_entries (-1) in delete_save when the new entry is picked in a Delete list.