Fix upgrade process possibly copying non-Luma firms

Upgrade process always copied sdmc:/boot.firm to nand:/boot.firm even if
Luma3DS was chainloaded from another path.

Fix this by copying from argv[0], if Luma3DS was launched from the SD
card.

Also use "sdmc:" and "nand:" instead of "0:" and "1:" when using FatFS.

Closes #1776.
This commit is contained in:
TuxSH 2022-12-23 14:48:35 +01:00
parent fcd08d6614
commit a7b840e531
4 changed files with 28 additions and 19 deletions

View File

@ -167,8 +167,8 @@
/* Number of volumes (logical drives) to be used. (1-10) */ /* Number of volumes (logical drives) to be used. (1-10) */
#define FF_STR_VOLUME_ID 0 #define FF_STR_VOLUME_ID 1
#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" #define FF_VOLUME_STRS "sdmc", "nand"
/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. /* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings.
/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive / When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive
/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each / number in the path name. FF_VOLUME_STRS defines the volume ID strings for each

View File

@ -64,14 +64,14 @@ bool mountFs(bool isSd, bool switchToCtrNand)
if (isSd) if (isSd)
{ {
if (!sdInitialized) if (!sdInitialized)
sdInitialized = f_mount(&sdFs, "0:", 1) == FR_OK; sdInitialized = f_mount(&sdFs, "sdmc:", 1) == FR_OK;
return sdInitialized && switchToMainDir(true); return sdInitialized && switchToMainDir(true);
} }
else else
{ {
if (!nandInitialized) if (!nandInitialized)
nandInitialized = f_mount(&nandFs, "1:", 1) == FR_OK; nandInitialized = f_mount(&nandFs, "nand:", 1) == FR_OK;
return nandInitialized && (!switchToCtrNand || (f_chdrive("1:") == FR_OK && switchToMainDir(false))); return nandInitialized && (!switchToCtrNand || (f_chdrive("nand:") == FR_OK && switchToMainDir(false)));
} }
} }
@ -343,10 +343,10 @@ u32 firmRead(void *dest, u32 firmType)
{"00000003", "20000003"}, {"00000003", "20000003"},
{"00000001", "20000001"}}; {"00000001", "20000001"}};
char folderPath[35], char folderPath[64],
path[48]; path[128];
sprintf(folderPath, "1:/title/00040138/%s/content", firmFolders[firmType][ISN3DS ? 1 : 0]); sprintf(folderPath, "nand:/title/00040138/%s/content", firmFolders[firmType][ISN3DS ? 1 : 0]);
DIR dir; DIR dir;
u32 firmVersion = 0xFFFFFFFF; u32 firmVersion = 0xFFFFFFFF;
@ -414,14 +414,14 @@ static bool backupEssentialFiles(void)
bool ok = !(isSdMode && !mountFs(false, false)); bool ok = !(isSdMode && !mountFs(false, false));
ok = ok && fileCopy("1:/ro/sys/HWCAL0.dat", "backups/HWCAL0.dat", false, fileCopyBuffer, sz); ok = ok && fileCopy("nand:/ro/sys/HWCAL0.dat", "backups/HWCAL0.dat", false, fileCopyBuffer, sz);
ok = ok && fileCopy("1:/ro/sys/HWCAL1.dat", "backups/HWCAL1.dat", false, fileCopyBuffer, sz); ok = ok && fileCopy("nand:/ro/sys/HWCAL1.dat", "backups/HWCAL1.dat", false, fileCopyBuffer, sz);
ok = ok && fileCopy("1:/rw/sys/LocalFriendCodeSeed_A", "backups/LocalFriendCodeSeed_A", false, fileCopyBuffer, sz); // often doesn't exist ok = ok && fileCopy("nand:/rw/sys/LocalFriendCodeSeed_A", "backups/LocalFriendCodeSeed_A", false, fileCopyBuffer, sz); // often doesn't exist
ok = ok && fileCopy("1:/rw/sys/LocalFriendCodeSeed_B", "backups/LocalFriendCodeSeed_B", false, fileCopyBuffer, sz); ok = ok && fileCopy("nand:/rw/sys/LocalFriendCodeSeed_B", "backups/LocalFriendCodeSeed_B", false, fileCopyBuffer, sz);
ok = ok && fileCopy("1:/rw/sys/SecureInfo_A", "backups/SecureInfo_A", false, fileCopyBuffer, sz); ok = ok && fileCopy("nand:/rw/sys/SecureInfo_A", "backups/SecureInfo_A", false, fileCopyBuffer, sz);
ok = ok && fileCopy("1:/rw/sys/SecureInfo_B", "backups/SecureInfo_B", false, fileCopyBuffer, sz); // often doesn't exist ok = ok && fileCopy("nand:/rw/sys/SecureInfo_B", "backups/SecureInfo_B", false, fileCopyBuffer, sz); // often doesn't exist
if (!ok) return false; if (!ok) return false;
@ -460,15 +460,15 @@ bool doLumaUpgradeProcess(void)
return false; return false;
// Try to boot.firm to CTRNAND, when applicable // Try to boot.firm to CTRNAND, when applicable
if (isSdMode) if (isSdMode && memcmp(launchedPathForFatfs, "sdmc:", 5) == 0)
ok = fileCopy("0:/boot.firm", "1:/boot.firm", true, fileCopyBuffer, sizeof(fileCopyBuffer)); ok = fileCopy(launchedPathForFatfs, "nand:/boot.firm", true, fileCopyBuffer, sizeof(fileCopyBuffer));
// Try to backup essential files // Try to backup essential files
ok2 = backupEssentialFiles(); ok2 = backupEssentialFiles();
// Clean up some of the old files // Clean up some of the old files
fileDelete("0:/luma/config.bin"); fileDelete("sdmc:/luma/config.bin");
fileDelete("1:/rw/luma/config.bin"); fileDelete("nand:/rw/luma/config.bin");
return ok && ok2; return ok && ok2;
} }

View File

@ -37,6 +37,7 @@
#include "memory.h" #include "memory.h"
#include "screen.h" #include "screen.h"
#include "i2c.h" #include "i2c.h"
#include "fmt.h"
#include "fatfs/sdmmc/sdmmc.h" #include "fatfs/sdmmc/sdmmc.h"
extern u8 __itcm_start__[], __itcm_lma__[], __itcm_bss_start__[], __itcm_end__[]; extern u8 __itcm_start__[], __itcm_lma__[], __itcm_bss_start__[], __itcm_end__[];
@ -46,6 +47,7 @@ extern ConfigurationStatus needConfig;
extern FirmwareSource firmSource; extern FirmwareSource firmSource;
bool isSdMode; bool isSdMode;
char launchedPathForFatfs[256];
u16 launchedPath[80+1]; u16 launchedPath[80+1];
BootType bootType; BootType bootType;
@ -72,6 +74,8 @@ void main(int argc, char **argv, u32 magicWord)
if((magicWord & 0xFFFF) == 0xBEEF && argc >= 1) //Normal (B9S) boot if((magicWord & 0xFFFF) == 0xBEEF && argc >= 1) //Normal (B9S) boot
{ {
bootType = isNtrBoot ? B9SNTR : B9S; bootType = isNtrBoot ? B9SNTR : B9S;
strncpy(launchedPathForFatfs, argv[0], sizeof(launchedPathForFatfs) - 1);
launchedPathForFatfs[sizeof(launchedPathForFatfs) - 1] = 0;
u32 i; u32 i;
for(i = 0; i < sizeof(launchedPath)/2 - 1 && argv[0][i] != 0; i++) //Copy and convert the path to UTF-16 for(i = 0; i < sizeof(launchedPath)/2 - 1 && argv[0][i] != 0; i++) //Copy and convert the path to UTF-16
@ -85,7 +89,10 @@ void main(int argc, char **argv, u32 magicWord)
u32 i; u32 i;
u16 *p = (u16 *)argv[0]; u16 *p = (u16 *)argv[0];
for(i = 0; i < sizeof(launchedPath)/2 - 1 && p[i] != 0; i++) for(i = 0; i < sizeof(launchedPath)/2 - 1 && p[i] != 0; i++)
{
launchedPath[i] = p[i]; launchedPath[i] = p[i];
launchedPathForFatfs[i] = (u8)p[i]; // UCS-2 to ascii. Meh.
}
launchedPath[i] = 0; launchedPath[i] = 0;
for(i = 0; i < 8; i++) for(i = 0; i < 8; i++)
@ -110,6 +117,7 @@ void main(int argc, char **argv, u32 magicWord)
for(u32 i = 0; i < 7; i++) //Copy and convert the path to UTF-16 for(u32 i = 0; i < 7; i++) //Copy and convert the path to UTF-16
launchedPath[i] = path[i]; launchedPath[i] = path[i];
strcpy(launchedPathForFatfs, path);
} }
setupKeyslots(); setupKeyslots();

View File

@ -138,6 +138,7 @@ extern bool isSdMode;
extern BootType bootType; extern BootType bootType;
extern char launchedPathForFatfs[256];
extern u16 launchedFirmTidLow[8]; extern u16 launchedFirmTidLow[8];
extern u16 launchedPath[80+1]; extern u16 launchedPath[80+1];