From c9c976089ace87bd0f972e696ec1f66da6927c29 Mon Sep 17 00:00:00 2001 From: Zachary Canann Date: Sun, 19 Apr 2026 14:17:17 -0700 Subject: [PATCH 1/3] Improve SDK startup matching --- configure.py | 2 +- include/dol2asm.h | 86 ++++++ src/dolphin/include/dolphin/PPCArch.h | 6 + src/dolphin/include/dolphin/dolphin.h | 24 ++ .../include/dolphin/os/__ppc_eabi_init.h | 15 + src/dolphin/src/os/init/__ppc_eabi_init.cpp | 76 ++--- src/dolphin/src/os/init/__start.c | 282 +++++++++--------- 7 files changed, 320 insertions(+), 171 deletions(-) create mode 100644 include/dol2asm.h create mode 100644 src/dolphin/include/dolphin/PPCArch.h create mode 100644 src/dolphin/include/dolphin/dolphin.h create mode 100644 src/dolphin/include/dolphin/os/__ppc_eabi_init.h diff --git a/configure.py b/configure.py index 8f1608937..0166aceb4 100644 --- a/configure.py +++ b/configure.py @@ -814,7 +814,7 @@ def MatchingFor(*versions): Object(Matching, "dolphin/src/os/OSTime.c"), Object(Matching, "dolphin/src/os/OSSync.c"), Object(NonMatching, "dolphin/src/os/init/__start.c"), - Object(NonMatching, "dolphin/src/os/init/__ppc_eabi_init.cpp") + Object(Matching, "dolphin/src/os/init/__ppc_eabi_init.cpp") ] ), DolphinLib( diff --git a/include/dol2asm.h b/include/dol2asm.h new file mode 100644 index 000000000..3116d50ac --- /dev/null +++ b/include/dol2asm.h @@ -0,0 +1,86 @@ +#ifndef DOL2ASM +#define DOL2ASM + +#ifdef __MWERKS__ + +#ifdef __cplusplus +#define SECTION_INIT extern "C" __declspec(section ".init") +#define SECTION_RODATA __declspec(section ".rodata") +#define SECTION_DATA __declspec(section ".data") +#define SECTION_SDATA __declspec(section ".sdata") +#define SECTION_SDATA2 __declspec(section ".sdata2") +#define SECTION_BSS __declspec(section ".data") +#define SECTION_SBSS __declspec(section ".sdata") +#define SECTION_SBSS2 __declspec(section ".sdata2") +#define SECTION_CTORS extern "C" __declspec(section ".ctors") +#define SECTION_DTORS extern "C" __declspec(section ".dtors") +#define SECTION_EXTAB extern "C" __declspec(section "extab_") +#define SECTION_EXTABINDEX extern "C" __declspec(section "extabindex_") +#define SECTION_DEAD extern "C" __declspec(section ".dead") +#define SECTION_CTORS10 __declspec(section ".ctors$10") +#define SECTION_CTORS15 __declspec(section ".ctors$15") +#define SECTION_DTORS10 __declspec(section ".dtors$10") +#define SECTION_DTORS15 __declspec(section ".dtors$15") +#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE) +#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION); +#else +#define SECTION_INIT __declspec(section ".init") +#define SECTION_RODATA __declspec(section ".rodata") +#define SECTION_DATA __declspec(section ".data") +#define SECTION_SDATA __declspec(section ".sdata") +#define SECTION_SDATA2 __declspec(section ".sdata2") +#define SECTION_BSS __declspec(section ".data") +#define SECTION_SBSS __declspec(section ".sdata") +#define SECTION_SBSS2 __declspec(section ".sdata2") +#define SECTION_CTORS __declspec(section ".ctors") +#define SECTION_DTORS __declspec(section ".dtors") +#define SECTION_EXTAB __declspec(section "extab_") +#define SECTION_EXTABINDEX __declspec(section "extabindex_") +#define SECTION_DEAD __declspec(section ".dead") +#define SECTION_CTORS10 __declspec(section ".ctors$10") +#define SECTION_CTORS15 __declspec(section ".ctors$15") +#define SECTION_DTORS10 __declspec(section ".dtors$10") +#define SECTION_DTORS15 __declspec(section ".dtors$15") +#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE) +#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION); +#endif + +#else +#define SECTION_INIT +#define SECTION_RODATA +#define SECTION_DATA +#define SECTION_SDATA +#define SECTION_SDATA2 +#define SECTION_BSS +#define SECTION_SBSS +#define SECTION_SBSS2 +#define SECTION_CTORS +#define SECTION_DTORS +#define SECTION_EXTAB +#define SECTION_EXTABINDEX +#define SECTION_DEAD +#define SECTION_CTORS10 +#define SECTION_CTORS15 +#define SECTION_DTORS10 +#define SECTION_DTORS15 +#define COMPILER_STRIP_GATE(...) +#define REGISTER_CTORS(...) + +#define asm +#define nofralloc +#endif + +#define _HUGE_ENUF 1e+300 +#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF)) +#define HUGE_VAL ((double)INFINITY) +#define HUGE_VALL ((long double)INFINITY) + +#define DOUBLE_INF HUGE_VAL + +#pragma section ".dead" +#pragma section ".ctors$10" +#pragma section ".ctors$15" +#pragma section ".dtors$10" +#pragma section ".dtors$15" + +#endif diff --git a/src/dolphin/include/dolphin/PPCArch.h b/src/dolphin/include/dolphin/PPCArch.h new file mode 100644 index 000000000..70f45bfc1 --- /dev/null +++ b/src/dolphin/include/dolphin/PPCArch.h @@ -0,0 +1,6 @@ +#ifndef _DOLPHIN_PPCARCH_WRAPPER_H +#define _DOLPHIN_PPCARCH_WRAPPER_H + +#include + +#endif diff --git a/src/dolphin/include/dolphin/dolphin.h b/src/dolphin/include/dolphin/dolphin.h new file mode 100644 index 000000000..6a352ef41 --- /dev/null +++ b/src/dolphin/include/dolphin/dolphin.h @@ -0,0 +1,24 @@ +#ifndef _DOLPHIN_H_ +#define _DOLPHIN_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/src/dolphin/include/dolphin/os/__ppc_eabi_init.h b/src/dolphin/include/dolphin/os/__ppc_eabi_init.h new file mode 100644 index 000000000..1226c3978 --- /dev/null +++ b/src/dolphin/include/dolphin/os/__ppc_eabi_init.h @@ -0,0 +1,15 @@ +#ifndef _DOLPHIN_OS___PPC_EABI_INIT_H +#define _DOLPHIN_OS___PPC_EABI_INIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(section ".init") extern void __init_hardware(void); +__declspec(section ".init") extern void __flush_cache(register void* address, register unsigned int size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/dolphin/src/os/init/__ppc_eabi_init.cpp b/src/dolphin/src/os/init/__ppc_eabi_init.cpp index 6f5b2765a..a65732548 100644 --- a/src/dolphin/src/os/init/__ppc_eabi_init.cpp +++ b/src/dolphin/src/os/init/__ppc_eabi_init.cpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #ifdef __cplusplus extern "C" { @@ -8,61 +8,64 @@ extern "C" { void __OSPSInit(); void __OSFPRInit(); void __OSCacheInit(); - -typedef void (*voidfunctionptr)(void); // pointer to function returning void -__declspec(section ".ctors") extern voidfunctionptr _ctors[]; -__declspec(section ".dtors") extern voidfunctionptr _dtors[]; - -static void __init_cpp(void); +void __init_cpp(void); // clang-format off -__declspec(section ".init") asm void __init_hardware(void) -{ // clang-format off +asm void __init_hardware(void) +{ nofralloc mfmsr r0 - ori r0,r0,MSR_FP + ori r0, r0, 0x2000 mtmsr r0 - mflr r31 - bl __OSPSInit - bl __OSFPRInit - bl __OSCacheInit - mtlr r31 + + mflr r31 + bl __OSPSInit + bl __OSFPRInit + bl __OSCacheInit + mtlr r31 blr } +// clang-format on -__declspec(section ".init") asm void __flush_cache(void *address, unsigned int size) -{ // clang-format off +// clang-format off +asm void __flush_cache(register void *address, register unsigned int size) +{ nofralloc - lis r5, 0xffff - ori r5, r5, 0xfff1 - and r5, r5, r3 - subf r3, r5, r3 - add r4, r4, r3 -rept: - dcbst 0,r5 + lis r5, ~0 + ori r5, r5, ~14 + and r5, r5, r3 + subf r3, r5, r3 + add r4, r4, r3 + +loop: + dcbst r0, r5 sync - icbi 0,r5 - addic r5,r5,0x8 - subic. r4,r4,0x8 - bge rept + icbi r0, r5 + addic r5, r5, 8 + subic. r4, r4, 8 + bge loop isync blr } // clang-format on -void __init_user(void) +void __init_user() { __init_cpp(); } -static void __init_cpp(void) +typedef void (*voidfunctionptr)(void); // pointer to function returning void +__declspec(section ".init") extern voidfunctionptr _ctors[]; +__declspec(section ".init") extern voidfunctionptr _dtors[]; + +void __init_cpp(void) { - voidfunctionptr* constructor; + voidfunctionptr *constructor; + /* - * call static initializers - */ - for (constructor = _ctors; *constructor; constructor++) - { + * call static initializers + */ + for (constructor = _ctors; *constructor; constructor++) { (*constructor)(); } } @@ -71,6 +74,7 @@ void _ExitProcess(void) { PPCHalt(); } + #ifdef __cplusplus } #endif diff --git a/src/dolphin/src/os/init/__start.c b/src/dolphin/src/os/init/__start.c index 184665aee..138b0765f 100644 --- a/src/dolphin/src/os/init/__start.c +++ b/src/dolphin/src/os/init/__start.c @@ -1,14 +1,31 @@ -#include "dolphin/os/init/__start.h" +#include "dol2asm.h" +#include #include "PowerPC_EABI_Support/Runtime/__ppc_eabi_linker.h" -#include "PowerPC_EABI_Support/MetroTRK/dolphin_trk.h" -void __check_pad3(void) +extern void InitMetroTRK(); +extern void exit(int); +extern int main(int argc, char* argv[]); +extern void __init_user(void); +extern void InitMetroTRK_BBA(void); +extern void DBInit(); + +SECTION_INIT extern void __check_pad3(void); +SECTION_INIT extern void __set_debug_bba(void); +SECTION_INIT extern u8 __get_debug_bba(void); +SECTION_INIT extern void __start(void); +SECTION_INIT extern void __init_registers(void); +SECTION_INIT extern void __init_data(void); +SECTION_INIT extern void __init_hardware(void); +SECTION_INIT extern void __flush_cache(void* addr, u32 size); + +static u8 Debug_BBA; + +SECTION_INIT void __check_pad3(void) { - if ((Pad3Button & 0x0eef) == 0x0eef) + if ((*(u16*)0x800030E4 & 0xEEF) == 0xEEF) { - OSResetSystem(OS_RESET_RESTART, 0, FALSE); + OSResetSystem(0, 0, 0); } - return; } void __set_debug_bba(void) @@ -16,16 +33,16 @@ void __set_debug_bba(void) Debug_BBA = 1; } -u8 __get_debug_bba(void) +SECTION_INIT u8 __get_debug_bba(void) { return Debug_BBA; } -__declspec(weak) asm void __start(void) +// clang-format off +SECTION_INIT asm void __start(void) { - // clang-format off - nofralloc - bl __init_registers + nofralloc + bl __init_registers bl __init_hardware li r0, -1 stwu r1, -8(r1) @@ -33,131 +50,111 @@ __declspec(weak) asm void __start(void) stw r0, 0(r1) bl __init_data li r0, 0 - lis r6, EXCEPTIONMASK_ADDR@ha - addi r6, r6, EXCEPTIONMASK_ADDR@l + lis r6, 0x8000 + addi r6, r6, 0x0044 stw r0, 0(r6) - lis r6, BOOTINFO2_ADDR@ha - addi r6, r6, BOOTINFO2_ADDR@l + lis r6, 0x8000 + addi r6, r6, 0x00F4 lwz r6, 0(r6) - -_check_TRK: cmplwi r6, 0 - beq _load_lomem_debug_flag - lwz r7, OS_BI2_DEBUGFLAG_OFFSET(r6) - b _check_debug_flag - -_load_lomem_debug_flag: - lis r5, ARENAHI_ADDR@ha - addi r5, r5, ARENAHI_ADDR@l + beq lbl_8000319C + lwz r7, 0xc(r6) + b lbl_800031BC + +lbl_8000319C: + lis r5, 0x8000 + addi r5, r5, 0x0034 lwz r5, 0(r5) cmplwi r5, 0 - beq _goto_main - lis r7, DEBUGFLAG_ADDR@ha - addi r7, r7, DEBUGFLAG_ADDR@l + beq lbl_800031F8 + lis r7, 0x8000 + addi r7, r7, 0x30E8 lwz r7, 0(r7) - -_check_debug_flag: - li r5, 0 - cmplwi r7, 2 - beq _goto_inittrk - cmplwi r7, 3 - li r5, 1 - beq _goto_inittrk - cmplwi r7, 4 - bne _goto_main - li r5, 2 - bl __set_debug_bba - b _goto_main - -_goto_inittrk: - lis r6, InitMetroTRK@ha - addi r6, r6, InitMetroTRK@l - mtlr r6 - blrl - -_goto_main: - lis r6, BOOTINFO2_ADDR@ha - addi r6, r6, BOOTINFO2_ADDR@l - lwz r5, 0(r6) - cmplwi r5, 0 - beq+ _no_args - lwz r6, 8(r5) - cmplwi r6, 0 - beq+ _no_args - add r6, r5, r6 - lwz r14, 0(r6) - cmplwi r14, 0 - beq _no_args - addi r15, r6, 4 - mtctr r14 - -_loop: - addi r6, r6, 4 - lwz r7, 0(r6) - add r7, r7, r5 - stw r7, 0(r6) - bdnz _loop - lis r5, ARENAHI_ADDR@ha - addi r5, r5, ARENAHI_ADDR@l - rlwinm r7, r15, 0, 0, 0x1a - stw r7, 0(r5) - b _end_of_parseargs - -_no_args: - li r14, 0 - li r15, 0 - -_end_of_parseargs: - bl DBInit - bl OSInit - lis r4, DVD_DEVICECODE_ADDR@ha - addi r4, r4, DVD_DEVICECODE_ADDR@l - lhz r3, 0(r4) - andi. r5, r3, 0x8000 - beq _check_pad3 - andi. r3, r3, 0x7fff - cmplwi r3, 1 - bne _skip_crc - -_check_pad3: - bl __check_pad3 - -_skip_crc: - bl __get_debug_bba - cmplwi r3, 1 - bne _goto_skip_init_bba - bl InitMetroTRK_BBA - -_goto_skip_init_bba: - bl __init_user - mr r3, r14 - mr r4, r15 - bl main - b exit - // clang-format on -} -__declspec(section ".init") inline void __copy_rom_section(void* dst, const void* src, - unsigned long size) -{ - if (size && (dst != src)) - { - memcpy(dst, src, size); - __flush_cache(dst, size); - } -} +lbl_800031BC: + li r5, 0 + cmplwi r7, 2 + beq lbl_800031E8 + cmplwi r7, 3 + li r5, 1 + beq lbl_800031E8 + cmplwi r7, 4 + bne lbl_800031F8 + li r5, 2 + bl __set_debug_bba + b lbl_800031F8 + +lbl_800031E8: + lis r6, InitMetroTRK@ha + addi r6, r6, InitMetroTRK@l + mtlr r6 + blrl + +lbl_800031F8: + lis r6, 0x8000 + addi r6, r6, 0x00F4 + lwz r5, 0(r6) + cmplwi r5, 0 + beq+ lbl_80003258 + lwz r6, 8(r5) + cmplwi r6, 0 + beq+ lbl_80003258 + add r6, r5, r6 + lwz r14, 0(r6) + cmplwi r14, 0 + beq lbl_80003258 + addi r15, r6, 4 + mtctr r14 + +lbl_80003230: + addi r6, r6, 4 + lwz r7, 0(r6) + add r7, r7, r5 + stw r7, 0(r6) + bdnz lbl_80003230 + lis r5, 0x8000 + addi r5, r5, 0x0034 + rlwinm r7, r15, 0, 0, 0x1a + stw r7, 0(r5) + b lbl_80003260 + +lbl_80003258: + li r14, 0 + li r15, 0 -__declspec(section ".init") inline void __init_bss_section(void* dst, unsigned long size) -{ - if (size) - { - memset(dst, 0, size); - } +lbl_80003260: + bl DBInit + bl OSInit + lis r4, 0x8000 + addi r4, r4, 0x30E6 + lhz r3, 0(r4) + andi. r5, r3, 0x8000 + beq lbl_80003288 + andi. r3, r3, 0x7fff + cmplwi r3, 1 + bne lbl_8000328C + +lbl_80003288: + bl __check_pad3 + +lbl_8000328C: + bl __get_debug_bba + cmplwi r3, 1 + bne lbl_8000329C + bl InitMetroTRK_BBA + +lbl_8000329C: + bl __init_user + mr r3, r14 + mr r4, r15 + bl main + b exit } +// clang-format on -asm static void __init_registers(void) +// clang-format off +SECTION_INIT asm void __init_registers(void) { - // clang-format off nofralloc li r0, 0 li r3, 0 @@ -188,17 +185,34 @@ asm static void __init_registers(void) li r29, 0 li r30, 0 li r31, 0 - lis r1, _stack_addr@h - ori r1, r1, _stack_addr@l - lis r2, _SDA2_BASE_@h - ori r2, r2, _SDA2_BASE_@l - lis r13, _SDA_BASE_@h - ori r13, r13, _SDA_BASE_@l - blr - // clang-format on + lis r1, 0x803D + ori r1, r1, 0x8A50 + lis r2, _SDA2_BASE_@h + ori r2, r2, _SDA2_BASE_@l + lis r13, _SDA_BASE_@h + ori r13, r13, _SDA_BASE_@l + blr +} +// clang-format on + +inline static void __copy_rom_section(void* dst, const void* src, u32 size) +{ + if (size && (dst != src)) + { + memcpy(dst, src, size); + __flush_cache(dst, size); + } +} + +inline static void __init_bss_section(void* dst, u32 size) +{ + if (size) + { + memset(dst, 0, size); + } } -void __init_data(void) +SECTION_INIT void __init_data() { __rom_copy_info* dci; __bss_init_info* bii; From 3f6b54a43a8f90f1cc1f451088014467e23e9115 Mon Sep 17 00:00:00 2001 From: Zachary Canann Date: Sun, 19 Apr 2026 14:37:16 -0700 Subject: [PATCH 2/3] Match SDK __start --- configure.py | 2 +- src/dolphin/src/os/init/__start.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 0166aceb4..09a8f1437 100644 --- a/configure.py +++ b/configure.py @@ -813,7 +813,7 @@ def MatchingFor(*versions): Object(Matching, "dolphin/src/os/OSThread.c"), Object(Matching, "dolphin/src/os/OSTime.c"), Object(Matching, "dolphin/src/os/OSSync.c"), - Object(NonMatching, "dolphin/src/os/init/__start.c"), + Object(Matching, "dolphin/src/os/init/__start.c"), Object(Matching, "dolphin/src/os/init/__ppc_eabi_init.cpp") ] ), diff --git a/src/dolphin/src/os/init/__start.c b/src/dolphin/src/os/init/__start.c index 138b0765f..2df3d173b 100644 --- a/src/dolphin/src/os/init/__start.c +++ b/src/dolphin/src/os/init/__start.c @@ -2,6 +2,10 @@ #include #include "PowerPC_EABI_Support/Runtime/__ppc_eabi_linker.h" +#ifdef __MWERKS__ +#undef __declspec +#endif + extern void InitMetroTRK(); extern void exit(int); extern int main(int argc, char* argv[]); From 0230f78658bde97f1dc89664981c3ff7bb5bcba5 Mon Sep 17 00:00:00 2001 From: Zachary Canann Date: Sun, 19 Apr 2026 14:46:53 -0700 Subject: [PATCH 3/3] Finish SDK OS matching --- src/dolphin/src/os/OS.c | 6 +++--- src/dolphin/src/os/OSThread.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dolphin/src/os/OS.c b/src/dolphin/src/os/OS.c index 626561042..64a89375a 100644 --- a/src/dolphin/src/os/OS.c +++ b/src/dolphin/src/os/OS.c @@ -8,7 +8,7 @@ extern OSTime __OSGetSystemTime(); static const char* __OSVersion = "<< Dolphin SDK - OS\trelease build: Apr 17 2003 12:33:06 (0x2301) >>"; // needs to be "<< Dolphin SDK - DSP\trelease build: Apr 17 2003 12:34:16 (0x2301) >>"? -extern char _db_stack_end[]; +extern char _db_stack_end[] AT_ADDRESS(0x803D8A50); #define OS_BI2_DEBUG_ADDRESS 0x800000F4 #define DEBUGFLAG_ADDR 0x800030E8 @@ -32,8 +32,8 @@ static __OSExceptionHandler* OSExceptionTable; OSTime __OSStartTime; BOOL __OSInIPL; -extern u8 __ArenaHi[]; -extern u8 __ArenaLo[]; +extern u8 __ArenaHi[] AT_ADDRESS(0x81800000); +extern u8 __ArenaLo[] AT_ADDRESS(0x803D9A60); extern u32 __DVDLongFileNameFlag; extern u32 __PADSpec; diff --git a/src/dolphin/src/os/OSThread.c b/src/dolphin/src/os/OSThread.c index 2d2adf809..44a437c2d 100644 --- a/src/dolphin/src/os/OSThread.c +++ b/src/dolphin/src/os/OSThread.c @@ -20,7 +20,7 @@ static void DefaultSwitchThreadCallback(OSThread* from, OSThread* to) { } -extern u8 _stack_addr[]; +extern u8 _stack_addr[] AT_ADDRESS(0x803D8A50); extern u8 _stack_end[]; #define AddTail(queue, thread, link) \