From 9fa0a7f1da1b70bee995f53c6c96c43189018772 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Wed, 1 Feb 2023 18:45:02 -0400 Subject: global: Import Dolphin SDK This version comes from the Metroid Prime decompilation project. https://github.com/PrimeDecomp/prime --- src/Dolphin/os/__start.c | 165 ++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 96 deletions(-) (limited to 'src/Dolphin/os/__start.c') diff --git a/src/Dolphin/os/__start.c b/src/Dolphin/os/__start.c index 4cb44e2..f180de8 100644 --- a/src/Dolphin/os/__start.c +++ b/src/Dolphin/os/__start.c @@ -1,54 +1,47 @@ -// This file was taken from the Super Mario Sunshine decompilation project. -// https://github.com/doldecomp/sms/blob/master/src/os/__start.c #include "dolphin/__start.h" +#include "__ppc_eabi_linker.h" -#pragma section code_type ".init" - -void __check_pad3(void) -{ - if ((Pad3Button & 0x0eef) == 0x0eef) { - OSResetSystem(OS_RESET_RESTART, 0, FALSE); - } - return; +void __check_pad3(void) { + if ((Pad3Button & 0x0eef) == 0x0eef) { + OSResetSystem(OS_RESET_RESTART, 0, FALSE); + } + return; } -#ifndef LD_TEST -// clang-format off - -__declspec (weak) asm void __start(void) -{ - nofralloc +__declspec(weak) asm void __start(void) { + // clang-format off + nofralloc bl __init_registers - bl __init_hardware - li r0, -1 - stwu r1, -8(r1) - stw r0, 4(r1) - stw r0, 0(r1) - bl __init_data - li r0, 0 - lis r6, EXCEPTIONMASK_ADDR@ha - addi r6, r6, EXCEPTIONMASK_ADDR@l - stw r0, 0(r6) - lis r6, BOOTINFO2_ADDR@ha - addi r6, r6, BOOTINFO2_ADDR@l - lwz r6, 0(r6) + bl __init_hardware + li r0, -1 + stwu r1, -8(r1) + stw r0, 4(r1) + stw r0, 0(r1) + bl __init_data + li r0, 0 + lis r6, EXCEPTIONMASK_ADDR@ha + addi r6, r6, EXCEPTIONMASK_ADDR@l + stw r0, 0(r6) + lis r6, BOOTINFO2_ADDR@ha + addi r6, r6, BOOTINFO2_ADDR@l + 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 - + 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 - lwz r5, 0(r5) - cmplwi r5, 0 - beq _goto_main - lis r7, DEBUGFLAG_ADDR@ha - addi r7, r7, DEBUGFLAG_ADDR@l - lwz r7, 0(r7) - + lwz r5, 0(r5) + cmplwi r5, 0 + beq _goto_main + lis r7, DEBUGFLAG_ADDR@ha + addi r7, r7, DEBUGFLAG_ADDR@l + lwz r7, 0(r7) + _check_debug_flag: li r5, 0 cmplwi r7, 2 @@ -62,7 +55,7 @@ _goto_inittrk: addi r6, r6, InitMetroTRK@l mtlr r6 blrl - + _goto_main: lis r6, BOOTINFO2_ADDR@ha addi r6, r6, BOOTINFO2_ADDR@l @@ -105,31 +98,22 @@ _end_of_parseargs: beq _check_pad3 andi. r3, r3, 0x7fff cmplwi r3, 1 - bne _skip_crc + bne _goto_skip_init_bba _check_pad3: bl __check_pad3 -_skip_crc: +_goto_skip_init_bba: bl __init_user mr r3, r14 mr r4, r15 bl main b exit + // clang-format on } -#else -__declspec(weak) void __start() { - int ret; - int argc = 0; - char **argv = NULL; - __init_user(); - ret = main(argc, argv); - exit(ret); -} -#endif -asm static void __init_registers(void) -{ +asm static void __init_registers(void) { + // clang-format off nofralloc lis r1, _stack_addr@h ori r1, r1, _stack_addr@l @@ -138,51 +122,40 @@ asm static void __init_registers(void) lis r13, _SDA_BASE_@h ori r13, r13, _SDA_BASE_@l blr + // clang-format on } -__declspec(section ".init") extern __rom_copy_info _rom_copy_info[]; -__declspec(section ".init") extern __bss_init_info _bss_init_info[]; - -// clang-format on - -inline static void __copy_rom_section(void* dst, const void* src, - unsigned long size) -{ - if (size && (dst != src)) { - memcpy(dst, src, size); - __flush_cache(dst, size); - } +inline static void __copy_rom_section(void* dst, const void* src, unsigned long size) { + if (size && (dst != src)) { + memcpy(dst, src, size); + __flush_cache(dst, size); + } } -inline static void __init_bss_section(void* dst, unsigned long size) -{ - if (size) { - memset(dst, 0, size); - } +inline static void __init_bss_section(void* dst, unsigned long size) { + if (size) { + memset(dst, 0, size); + } } #pragma scheduling off -#pragma peephole off -// peephole might have been turned off due to the inline asm peephole bug -// which turns off peephole optimizations after an inline-asm function -void __init_data(void) -{ - __rom_copy_info* dci; - __bss_init_info* bii; - - dci = _rom_copy_info; - while (TRUE) { - if (dci->size == 0) - break; - __copy_rom_section(dci->addr, dci->rom, dci->size); - dci++; - } - - bii = _bss_init_info; - while (TRUE) { - if (bii->size == 0) - break; - __init_bss_section(bii->addr, bii->size); - bii++; - } +void __init_data(void) { + __rom_copy_info* dci; + __bss_init_info* bii; + + dci = _rom_copy_info; + while (TRUE) { + if (dci->size == 0) + break; + __copy_rom_section(dci->addr, dci->rom, dci->size); + dci++; + } + + bii = _bss_init_info; + while (TRUE) { + if (bii->size == 0) + break; + __init_bss_section(bii->addr, bii->size); + bii++; + } } -- cgit v1.2.3-13-gbd6f