From 393353e242c1700b9b4f4a2d27bb804e7239c359 Mon Sep 17 00:00:00 2001 From: Extrems Date: Wed, 19 Jul 2023 11:20:25 -0400 Subject: [PATCH] - Check for errors during GC Loader fragment setup. --- .../devices/gcloader/deviceHandler-gcloader.c | 43 +++++++++---------- cube/swiss/source/devices/gcloader/gcloader.c | 24 +++++++---- cube/swiss/source/devices/gcloader/gcloader.h | 4 +- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/cube/swiss/source/devices/gcloader/deviceHandler-gcloader.c b/cube/swiss/source/devices/gcloader/deviceHandler-gcloader.c index 7ae255534..bb4b61996 100644 --- a/cube/swiss/source/devices/gcloader/deviceHandler-gcloader.c +++ b/cube/swiss/source/devices/gcloader/deviceHandler-gcloader.c @@ -57,48 +57,45 @@ static s32 setupFile(file_handle* file, file_handle* file2, ExecutableFile* file } // If disc 1 is fragmented, make a note of the fragments and their sizes - if(!getFragments(DEVICE_CUR, file, &disc1FragList, &disc1Frags, 0, 0, UINT32_MAX)) { - free(disc1FragList); - return 0; - } + if(!getFragments(DEVICE_CUR, file, &disc1FragList, &disc1Frags, 0, 0, UINT32_MAX)) + goto fail; // If there is a disc 2 and it's fragmented, make a note of the fragments and their sizes if(file2) { - if(!getFragments(DEVICE_CUR, file2, &disc2FragList, &disc2Frags, 1, 0, UINT32_MAX)) { - free(disc2FragList); - free(disc1FragList); - return 0; + if(!getFragments(DEVICE_CUR, file2, &disc2FragList, &disc2Frags, 1, 0, UINT32_MAX)) + goto fail; + + if(devices[DEVICE_PATCHES] == devices[DEVICE_CUR]) { + file2->fileBase = (u32)installPatch2(disc2FragList, (disc2Frags + 1) * sizeof(file_frag)) | ((u64)disc2Frags << 32); + file->fileBase = (u32)installPatch2(disc1FragList, (disc1Frags + 1) * sizeof(file_frag)) | ((u64)disc1Frags << 32); } } // write disc 2 frags - gcloaderWriteFrags(1, disc2FragList, disc2Frags); + if(gcloaderWriteFrags(1, disc2FragList, disc2Frags)) + goto fail; // write disc 1 frags - gcloaderWriteFrags(0, disc1FragList, disc1Frags); + if(gcloaderWriteFrags(0, disc1FragList, disc1Frags)) + goto fail; // set disc 1 as active disc - gcloaderWriteDiscNum(0); - - if(numToPatch < 0) { - free(disc2FragList); - free(disc1FragList); - return 1; - } - - if(file2 && devices[DEVICE_PATCHES] == devices[DEVICE_CUR]) { - file2->fileBase = (u32)installPatch2(disc2FragList, (disc2Frags + 1) * sizeof(file_frag)) | ((u64)disc2Frags << 32); - file->fileBase = (u32)installPatch2(disc1FragList, (disc1Frags + 1) * sizeof(file_frag)) | ((u64)disc1Frags << 32); - } + if(gcloaderWriteDiscNum(0)) + goto fail; free(disc2FragList); free(disc1FragList); return 1; + +fail: + free(disc2FragList); + free(disc1FragList); + return 0; } s32 deviceHandler_GCLOADER_setupFile(file_handle* file, file_handle* file2, ExecutableFile* filesToPatch, int numToPatch) { if(!setupFile(file, file2, filesToPatch, numToPatch)) { - return 0; + goto fail; } if(numToPatch < 0) { return 1; diff --git a/cube/swiss/source/devices/gcloader/gcloader.c b/cube/swiss/source/devices/gcloader/gcloader.c index 0ecd12c46..90ce7ca64 100644 --- a/cube/swiss/source/devices/gcloader/gcloader.c +++ b/cube/swiss/source/devices/gcloader/gcloader.c @@ -62,19 +62,25 @@ char *gcloaderGetVersion() { return buffer; } -void gcloaderWriteFrags(u32 discNum, file_frag *fragList, u32 totFrags) { - int i; +int gcloaderWriteFrags(u32 discNum, file_frag *fragList, u32 totFrags) { + int ret, i; print_gecko("GCLoader setting up disc %i with %i fragments\r\n", discNum, totFrags); - __gcloaderCmdImm(0xB3000001, discNum, totFrags); - - for(i = 0; i < totFrags; i++) { + ret = __gcloaderCmdImm(0xB3000001, discNum, totFrags); + if(ret != 0) { + return ret; + } + for(i = 0; i < totFrags; i++) { print_gecko("Frag %i: ofs in file: [0x%08X] len [0x%08X] LBA on SD [0x%08llX]\r\n", i, fragList[i].offset, fragList[i].size, fragList[i].fileBase); - __gcloaderCmdImm(fragList[i].offset, fragList[i].size, fragList[i].fileBase); - } + ret = __gcloaderCmdImm(fragList[i].offset, fragList[i].size, fragList[i].fileBase); + if(ret == 0) { + break; + } + } + return ret; } -void gcloaderWriteDiscNum(u32 discNum) { - __gcloaderCmdImm(0xB3000002, discNum, 0x00000000); +int gcloaderWriteDiscNum(u32 discNum) { + return __gcloaderCmdImm(0xB3000002, discNum, 0x00000000); } diff --git a/cube/swiss/source/devices/gcloader/gcloader.h b/cube/swiss/source/devices/gcloader/gcloader.h index d99a58fb3..2b5901b06 100644 --- a/cube/swiss/source/devices/gcloader/gcloader.h +++ b/cube/swiss/source/devices/gcloader/gcloader.h @@ -14,7 +14,7 @@ u32 gcloaderReadId(); char *gcloaderGetVersion(); -void gcloaderWriteFrags(u32 discNum, file_frag *fragList, u32 totFrags); -void gcloaderWriteDiscNum(u32 discNum); +int gcloaderWriteFrags(u32 discNum, file_frag *fragList, u32 totFrags); +int gcloaderWriteDiscNum(u32 discNum); #endif