Skip to content

Commit

Permalink
- Create new context for alarm handler in early SDK.
Browse files Browse the repository at this point in the history
  • Loading branch information
Extrems committed Aug 6, 2023
1 parent 9d3b3f1 commit 70b3193
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 0 deletions.
5 changes: 5 additions & 0 deletions cube/patches/Makefile
Expand Up @@ -40,19 +40,24 @@ cpatches:
@echo Building C Patches ...
@$(CC) -O3 $(OPTS) -c base/memmove.S -DBACKWARDS_MEMCPY -o backwards_memcpy.o
@$(CC) -O3 $(OPTS) -c base/memmove.S -DMEMCPY -o memcpy.o
@$(CC) -O3 $(OPTS) -c base/os.c
@$(CC) -O3 $(OPTS) -c base/pad.c
@$(CC) -O3 $(OPTS) -c usbgecko/uart.c -DEXI=EXIEmuRegs
@$(CC) -O3 $(OPTS) -o CallAlarmHandler.elf -e CallAlarmHandler -T base/common.ld -T base/dolphin/os.ld os.o
@$(CC) -O3 $(OPTS) -o CheckStatus.elf -e CheckStatus -T base/common.ld -T base/dolphin/os.ld pad.o
@$(CC) -O3 $(OPTS) -o WriteUARTN.elf -e WriteUARTN -T base/common.ld -T base/dolphin/os.ld uart.o
@mkdir -p $(DISASM)
@$(OBJDUMP) -D CallAlarmHandler.elf > $(DISASM)/CallAlarmHandler.txt
@$(OBJDUMP) -D CheckStatus.elf > $(DISASM)/CheckStatus.txt
@$(OBJDUMP) -D WriteUARTN.elf > $(DISASM)/WriteUARTN.txt
@$(OBJCOPY) -O binary backwards_memcpy.o backwards_memcpy.bin
@$(OBJCOPY) -O binary memcpy.o memcpy.bin
@$(OBJCOPY) -O binary CallAlarmHandler.elf CallAlarmHandler.bin
@$(OBJCOPY) -O binary CheckStatus.elf CheckStatus.bin
@$(OBJCOPY) -O binary WriteUARTN.elf WriteUARTN.bin
@$(BIN2S) -H $(DEST)/backwards_memcpy_bin.h backwards_memcpy.bin > $(DEST)/backwards_memcpy.bin.s
@$(BIN2S) -H $(DEST)/memcpy_bin.h memcpy.bin > $(DEST)/memcpy.bin.s
@$(BIN2S) -H $(DEST)/CallAlarmHandler_bin.h CallAlarmHandler.bin > $(DEST)/CallAlarmHandler.bin.s
@$(BIN2S) -H $(DEST)/CheckStatus_bin.h CheckStatus.bin > $(DEST)/CheckStatus.bin.s
@$(BIN2S) -H $(DEST)/WriteUARTN_bin.h WriteUARTN.bin > $(DEST)/WriteUARTN.bin.s
@rm -f *.bin *.elf *.o
Expand Down
33 changes: 33 additions & 0 deletions cube/patches/base/os.c
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2023, Extrems <extrems@extremscorner.org>
*
* This file is part of Swiss.
*
* Swiss is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Swiss is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* with Swiss. If not, see <https://www.gnu.org/licenses/>.
*/

#include "dolphin/os.c"

void CallAlarmHandler(OSAlarm *alarm, OSContext *context, OSAlarmHandler handler)
{
OSContext exceptionContext;

OSClearContext(&exceptionContext);
OSSetCurrentContext(&exceptionContext);

handler(alarm, context);

OSClearContext(&exceptionContext);
OSSetCurrentContext(context);
}
2 changes: 2 additions & 0 deletions cube/swiss/include/patcher.h
Expand Up @@ -93,6 +93,7 @@ extern u8 MTXOrthoHook[];
extern u32 MTXOrthoHook_length;
extern u8 MTXPerspectiveHook[];
extern u32 MTXPerspectiveHook_length;
#include "CallAlarmHandler_bin.h"
#include "CheckStatus_bin.h"
extern u8 getTimingPatch[];
extern u32 getTimingPatch_length;
Expand Down Expand Up @@ -149,6 +150,7 @@ enum patchIds {
MTX_LIGHTPERSPECTIVEHOOK,
MTX_ORTHOHOOK,
MTX_PERSPECTIVEHOOK,
OS_CALLALARMHANDLER,
OS_RESERVED,
PAD_CHECKSTATUS,
VI_CONFIGURE240P,
Expand Down
114 changes: 114 additions & 0 deletions cube/swiss/source/patcher.c
Expand Up @@ -55,6 +55,8 @@ void *installPatch(int patchId) {
patch = MTXOrthoHook; patchSize = MTXOrthoHook_length; break;
case MTX_PERSPECTIVEHOOK:
patch = MTXPerspectiveHook; patchSize = MTXPerspectiveHook_length; break;
case OS_CALLALARMHANDLER:
patch = CallAlarmHandler_bin; patchSize = CallAlarmHandler_bin_size; break;
case OS_RESERVED:
patchSize = 0x1800; break;
case PAD_CHECKSTATUS:
Expand Down Expand Up @@ -955,6 +957,13 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
{ 71, 18, 10, 7, 9, 12, NULL, 0, "OSCancelAlarm" },
{ 70, 18, 10, 7, 9, 13, NULL, 0, "OSCancelAlarm" } // SN Systems ProDG
};
FuncPattern DecrementerExceptionCallbackSigs[5] = {
{ 93, 30, 6, 14, 4, 10, NULL, 0, "DecrementerExceptionCallbackD" },
{ 101, 33, 6, 18, 4, 10, NULL, 0, "DecrementerExceptionCallbackD" },
{ 132, 36, 10, 16, 12, 30, NULL, 0, "DecrementerExceptionCallback" },
{ 140, 39, 10, 20, 12, 30, NULL, 0, "DecrementerExceptionCallback" },
{ 140, 35, 10, 20, 12, 32, NULL, 0, "DecrementerExceptionCallback" } // SN Systems ProDG
};
FuncPattern OSGetArenaHiSigs[3] = {
{ 30, 15, 3, 2, 1, 3, NULL, 0, "OSGetArenaHiD" },
{ 2, 1, 0, 0, 0, 0, NULL, 0, "OSGetArenaHi" },
Expand Down Expand Up @@ -2181,6 +2190,82 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
}
}

for (j = 0; j < sizeof(DecrementerExceptionCallbackSigs) / sizeof(FuncPattern); j++) {
if (compare_pattern(&fp, &DecrementerExceptionCallbackSigs[j])) {
switch (j) {
case 0:
if (findx_pattern(data, dataType, i + 7, length, &OSGetTimeSig) &&
findx_pattern(data, dataType, i + 14, length, &OSLoadContextSigs[1]) &&
findx_pattern(data, dataType, i + 25, length, &SetTimerSig) &&
findx_pattern(data, dataType, i + 27, length, &OSLoadContextSigs[1]) &&
findx_pattern(data, dataType, i + 64, length, &InsertAlarmSigs[0]) &&
findx_pattern(data, dataType, i + 77, length, &SetTimerSig) &&
findx_pattern(data, dataType, i + 87, length, &OSLoadContextSigs[1]))
DecrementerExceptionCallbackSigs[j].offsetFoundAt = i;
break;
case 1:
if (findx_pattern (data, dataType, i + 7, length, &__OSGetSystemTimeSigs[0]) &&
findx_patterns(data, dataType, i + 14, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL) &&
findx_pattern (data, dataType, i + 25, length, &SetTimerSig) &&
findx_patterns(data, dataType, i + 27, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL) &&
findx_pattern (data, dataType, i + 64, length, &InsertAlarmSigs[0]) &&
findx_pattern (data, dataType, i + 77, length, &SetTimerSig) &&
findx_pattern (data, dataType, i + 80, length, &OSClearContextSigs[0]) &&
findx_pattern (data, dataType, i + 82, length, &OSSetCurrentContextSig) &&
findx_pattern (data, dataType, i + 89, length, &OSClearContextSigs[0]) &&
findx_pattern (data, dataType, i + 91, length, &OSSetCurrentContextSig) &&
findx_patterns(data, dataType, i + 95, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL))
DecrementerExceptionCallbackSigs[j].offsetFoundAt = i;
break;
case 2:
if (findx_pattern(data, dataType, i + 8, length, &OSGetTimeSig) &&
findx_pattern(data, dataType, i + 16, length, &OSLoadContextSigs[1]) &&
findx_pattern(data, dataType, i + 26, length, &OSGetTimeSig) &&
findx_pattern(data, dataType, i + 55, length, &OSLoadContextSigs[1]) &&
findx_pattern(data, dataType, i + 82, length, &InsertAlarmSigs[1]) &&
findx_pattern(data, dataType, i + 86, length, &OSGetTimeSig) &&
findx_pattern(data, dataType, i + 123, length, &OSLoadContextSigs[1]))
DecrementerExceptionCallbackSigs[j].offsetFoundAt = i;
break;
case 3:
if (findx_pattern (data, dataType, i + 8, length, &__OSGetSystemTimeSigs[1]) &&
findx_patterns(data, dataType, i + 16, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL) &&
findx_pattern (data, dataType, i + 26, length, &__OSGetSystemTimeSigs[1]) &&
findx_patterns(data, dataType, i + 55, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL) &&
findx_pattern (data, dataType, i + 82, length, &InsertAlarmSigs[1]) &&
findx_pattern (data, dataType, i + 86, length, &__OSGetSystemTimeSigs[1]) &&
findx_pattern (data, dataType, i + 116, length, &OSClearContextSigs[1]) &&
findx_pattern (data, dataType, i + 118, length, &OSSetCurrentContextSig) &&
findx_pattern (data, dataType, i + 125, length, &OSClearContextSigs[1]) &&
findx_pattern (data, dataType, i + 127, length, &OSSetCurrentContextSig) &&
findx_patterns(data, dataType, i + 131, length, &OSLoadContextSigs[1],
&OSLoadContextSigs[2], NULL))
DecrementerExceptionCallbackSigs[j].offsetFoundAt = i;
break;
case 4:
if (findx_pattern (data, dataType, i + 8, length, &__OSGetSystemTimeSigs[2]) &&
findx_pattern (data, dataType, i + 16, length, &OSLoadContextSigs[2]) &&
findx_pattern (data, dataType, i + 26, length, &__OSGetSystemTimeSigs[2]) &&
findx_pattern (data, dataType, i + 55, length, &OSLoadContextSigs[2]) &&
findx_patterns(data, dataType, i + 82, length, &InsertAlarmSigs[2],
&InsertAlarmSigs[3], NULL) &&
findx_pattern (data, dataType, i + 86, length, &__OSGetSystemTimeSigs[2]) &&
findx_pattern (data, dataType, i + 116, length, &OSClearContextSigs[2]) &&
findx_pattern (data, dataType, i + 118, length, &OSSetCurrentContextSig) &&
findx_pattern (data, dataType, i + 125, length, &OSClearContextSigs[2]) &&
findx_pattern (data, dataType, i + 127, length, &OSSetCurrentContextSig) &&
findx_pattern (data, dataType, i + 131, length, &OSLoadContextSigs[2]))
DecrementerExceptionCallbackSigs[j].offsetFoundAt = i;
break;
}
}
}

for (j = 0; j < sizeof(__OSInterruptInitSigs) / sizeof(FuncPattern); j++) {
if (compare_pattern(&fp, &__OSInterruptInitSigs[j])) {
switch (j) {
Expand Down Expand Up @@ -4951,6 +5036,35 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
}
}

for (j = 0; j < sizeof(DecrementerExceptionCallbackSigs) / sizeof(FuncPattern); j++)
if ((i = DecrementerExceptionCallbackSigs[j].offsetFoundAt)) {
u32 *DecrementerExceptionCallback = Calc_ProperAddress(data, dataType, i * sizeof(u32));
u32 *CallAlarmHandler;

if (DecrementerExceptionCallback) {
if (devices[DEVICE_CUR]->emulated() & EMU_READ_SPEED) {
switch (j) {
case 0:
CallAlarmHandler = getPatchAddr(OS_CALLALARMHANDLER);

data[i + 81] = 0x38BB0000; // addi r5, r27, 0
data[i + 82] = 0x60000000; // nop
data[i + 83] = branchAndLink(CallAlarmHandler, DecrementerExceptionCallback + 83);
break;
case 2:
CallAlarmHandler = getPatchAddr(OS_CALLALARMHANDLER);

data[i + 115] = 0x38BE0000; // addi r5, r30, 0
data[i + 116] = 0x60000000; // nop
data[i + 119] = branchAndLink(CallAlarmHandler, DecrementerExceptionCallback + 119);
break;
}
}
print_gecko("Found:[%s$%i] @ %08X\n", DecrementerExceptionCallbackSigs[j].Name, j, DecrementerExceptionCallback);
patched++;
}
}

for (j = 0; j < sizeof(OSLoadContextSigs) / sizeof(FuncPattern); j++)
if ((i = OSLoadContextSigs[j].offsetFoundAt)) {
u32 *OSLoadContext = Calc_ProperAddress(data, dataType, i * sizeof(u32));
Expand Down

0 comments on commit 70b3193

Please sign in to comment.