diff --git a/arm9/source/patches.c b/arm9/source/patches.c index a2ac2b9..b3766f6 100644 --- a/arm9/source/patches.c +++ b/arm9/source/patches.c @@ -561,18 +561,24 @@ u32 patchP9AMTicketWrapperZeroKeyIV(u8 *pos, u32 size, u32 firmVersion) static const u8 pattern[] = {0x20, 0x21, 0xA6, 0xA8}; u32 function = (u32)memsearch(pos, __rt_memclr_pattern, size, sizeof(__rt_memclr_pattern)); - u32 *off = (u32 *)memsearch(pos, pattern, size, sizeof(pattern)); + u16 *off = (u16 *)memsearch(pos, pattern, size, sizeof(pattern)); if(function == 0 || off == NULL) return firmVersion == 0xFFFFFFFF ? 0 : 1; - s32 opjumpdistance = (s32)(function - ((u32)&off[2])) / 2; + //After the found code it's a BL call (at &off[2]), that will be replaced + //From Thumb, op distance for setting in BLX can be got with, + //(Destination_offset - blx_op_offset+2) / 2 + s32 opjumpdistance = (s32)(function - ((u32)&off[3])) / 2; //Beyond limit if(opjumpdistance < -0x1fffff || opjumpdistance > 0x1fffff) return 1; //r0 and r1 for old call are already correct for this one //BLX __rt_memclr - off[1] = 0xE800F000U | (((u32)opjumpdistance & 0x7FF) << 16) | (((u32)opjumpdistance >> 11) & 0x3FF) | (((u32)opjumpdistance >> 21) & 0x400); + u32 op = (0xE800F000U | (((u32)opjumpdistance & 0x7FF) << 16) | (((u32)opjumpdistance >> 11) & 0x3FF) | (((u32)opjumpdistance >> 21) & 0x400)) & ~(1<<16); + + off[2] = op; + off[3] = op >> 16; return 0; } diff --git a/sysmodules/rosalina/Makefile b/sysmodules/rosalina/Makefile index 3244fb8..33c8d48 100644 --- a/sysmodules/rosalina/Makefile +++ b/sysmodules/rosalina/Makefile @@ -28,7 +28,8 @@ INCLUDES := include include/gdb include/menus include/redshift ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft DEFINES := -DARM11 -D_3DS -CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + +CFLAGS := -g -std=gnu11 -Wall -Wextra -Wno-unused-value -O2 -mword-relocations \ -fomit-frame-pointer -ffunction-sections -fdata-sections \ $(ARCH) $(DEFINES) diff --git a/sysmodules/rosalina/source/menus/miscellaneous.c b/sysmodules/rosalina/source/menus/miscellaneous.c index 5fa4077..2b82d30 100644 --- a/sysmodules/rosalina/source/menus/miscellaneous.c +++ b/sysmodules/rosalina/source/menus/miscellaneous.c @@ -354,7 +354,6 @@ void MiscellaneousMenu_SyncTimeDate(void) Draw_Lock(); Draw_DrawString(10, 10, COLOR_TITLE, "Miscellaneous options menu"); - //posY = Draw_DrawFormattedString(10, 30, COLOR_WHITE, "Current UTC offset: "); absOffset = utcOffset - 12; absOffset = absOffset < 0 ? -absOffset : absOffset; posY = Draw_DrawFormattedString(10, 30, COLOR_WHITE, "Current UTC offset: %c%02d", utcOffset < 12 ? '-' : '+', absOffset); @@ -398,11 +397,11 @@ void MiscellaneousMenu_SyncTimeDate(void) absOffset = absOffset < 0 ? -absOffset : absOffset; Draw_DrawFormattedString(10, 30, COLOR_WHITE, "Current UTC offset: %c%02d", utcOffset < 0 ? '-' : '+', absOffset); if (cantStart) - posY = Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Can't sync time/date before the system\nhas finished loading.") + SPACING_Y; + Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Can't sync time/date before the system\nhas finished loading.") + SPACING_Y; else if (R_FAILED(res)) - posY = Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Operation failed (%08lx).", (u32)res) + SPACING_Y; + Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Operation failed (%08lx).", (u32)res) + SPACING_Y; else - posY = Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Timedate & RTC updated successfully.\nYou may need to reboot to see the changes.") + SPACING_Y; + Draw_DrawFormattedString(10, posY + 2 * SPACING_Y, COLOR_WHITE, "Timedate & RTC updated successfully.\nYou may need to reboot to see the changes.") + SPACING_Y; input = waitInput(); diff --git a/sysmodules/rosalina/source/ntp.c b/sysmodules/rosalina/source/ntp.c index d19b0e8..49ed3a6 100644 --- a/sysmodules/rosalina/source/ntp.c +++ b/sysmodules/rosalina/source/ntp.c @@ -166,8 +166,11 @@ Result ntpSetTimeDate(const struct tm *localt) // First, set the config RTC offset to 0 u8 rtcOff = 0; + u8 rtcOff2[8] = {0}; res = CFG_SetConfigInfoBlk4(1, 0x10000, &rtcOff); if (R_FAILED(res)) goto cleanup; + res = CFG_SetConfigInfoBlk4(8, 0x30001, rtcOff2); + if (R_FAILED(res)) goto cleanup; u8 yr = (u8)(localt->tm_year - 100); // Update the RTC