From e6abdf0bc80af5099ec0c06b04c066078809fa88 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Mon, 9 Feb 2026 22:28:52 -0500 Subject: [PATCH 1/2] Label some SDK functions --- headers/functions/arm9/libs.h | 80 +++++++ headers/types/common/enums.h | 59 +++++ headers/types/common/util.h | 206 +++++++++++------- symbols/arm9/libs.yml | 395 ++++++++++++++++++++++++++++++++++ 4 files changed, 667 insertions(+), 73 deletions(-) diff --git a/headers/functions/arm9/libs.h b/headers/functions/arm9/libs.h index 37270d4f..e4b8e422 100644 --- a/headers/functions/arm9/libs.h +++ b/headers/functions/arm9/libs.h @@ -319,14 +319,56 @@ void EnableVramBanksInSet(struct vram_banks_set* vram_banks); void G3_LoadMtx43(struct matrix_4x3* matrix); void G3_MultMtx43(struct matrix_4x3* matrix); void GeomGxFifoSendMtx4x3(struct matrix_4x3* matrix, void* gxfifo); +void OS_InitIrqTable(void); +void OS_SetIrqFunction(uint32_t intr_bit, os_irq_function function); +uint32_t OS_SetIrqMask(uint32_t mask); +uint32_t OS_EnableIrqMask(uint32_t mask); +uint32_t OS_DisableIrqMask(uint32_t mask); +uint32_t OS_ResetRequestIrqMask(uint32_t mask); +void OS_SetIrqStackChecker(void); +void OS_InitLock(void); +int OS_LockByWord(uint16_t lock_id, struct os_lock_word* lockp, lock_ctrl_funcp ctrl_funcp); +int OSi_DoUnlockByWord(uint16_t lock_id, struct os_lock_word* lockp, lock_ctrl_funcp ctrl_funcp, + bool disable_fiq); +int OS_UnlockByWord(uint16_t lock_id, struct os_lock_word* lockp, lock_ctrl_funcp ctrl_funcp); +int OS_UnlockCartridge(uint16_t lock_id); +int OS_UnLockCartridge(uint16_t lock_id); +void OSi_FreeCartridgeBus(void); int IncrementThreadCount(void); +void OSi_InsertLinkToQueue(struct os_thread_queue* queue, struct thread* thread); void InsertThreadIntoList(struct thread* thread); +void OS_RescheduleThread(void); +void OS_InitThread(void); void StartThread(struct thread* thread, thread_entry_fn_t function, struct thread* param_3, void* stack_area, int stack_size, int param_6); void ThreadExit(void); +void OS_SleepThread(struct os_thread_queue* queue); +void OS_WakeupThreadDirect(struct thread* thread); +struct thread* OS_SelectThread(void); +os_switch_thread_callback OS_SetSwitchThreadCallback(os_switch_thread_callback callback); +void OSi_IdleThreadProc(void* arg); void SetThreadField0xB4(struct thread* thread, int value); void InitThread(struct thread* thread, void* function, void* stack_area_minus_4); +bool OS_SaveContext(struct os_context* context); +void OS_LoadContext(struct os_context* context); +void OS_InitMutex(struct os_mutex* mutex); +void DC_FlushAll(void); +void DC_InvalidateRange(void* start_addr, uint32_t n_bytes); +void DC_FlushRange(void* data, uint32_t size); +void OSi_WaitVCount0(void); +void OS_Init(void); +void OS_InitArena(void); +void OS_InitArenaEx(void); +void* OS_GetInitArenaHi(enum os_arena_id id); +void* OS_GetInitArenaLo(enum os_arena_id id); +void OS_SetArenaHi(enum os_arena_id id, void* new_hi); +void OS_SetArenaLo(enum os_arena_id id, void* new_lo); +void OS_SetProtectionRegion1(uint32_t param); +void OS_SetProtectionRegion2(uint32_t param); +void OS_InitException(void); +void OSi_ExceptionHandler(void); uint16_t GetTimer0Control(void); +void OS_InitVAlarm(void); int ClearIrqFlag(void); int EnableIrqFlag(void); int SetIrqFlag(int new_value); @@ -334,10 +376,16 @@ int EnableIrqFiqFlags(void); int SetIrqFiqFlags(int new_value); int GetIrqFlag(void); int GetProcessorMode(void); +void OS_InitReset(void); void GetDsFirmwareUserSettings(struct user_settings* settings); uint32_t CountLeadingZeros(uint32_t x); +void OSi_InitVramExclusive(void); void WaitForever2(void); void WaitForInterrupt(void); +void MI_SetWramBank(enum mi_wram cnt); +void MI_DmaCopy16(uint32_t dma_no, void* src, void* dest, uint32_t size); +void MI_StopDma(uint32_t dma_no); +void MIi_CheckDma0SourceAddress(uint32_t dma_no, uint32_t src, uint32_t size, uint32_t dir); void ArrayFill16(uint16_t val, void* ptr, int len); void ArrayCopy16(void* src, void* dest, int len); void ArrayFill32(uint32_t val, void* ptr, int len); @@ -347,6 +395,13 @@ void ArrayCopy32Fast(void* src, void* dest, int len); void MemsetFast(void* ptr, char val, uint32_t len); void MemcpyFast(void* src, void* dest, uint32_t n); uint32_t AtomicExchange(uint32_t desired, void* ptr); +void MI_Init(void); +void Pxi_Init(void); +void Pxi_InitFifo(void); +void Pxi_SetFifoRecvCallback(int fifo_tag, pxi_fifo_callback callback); +void Pxi_IsCallbackReady(int fifo_tag, enum pxi_proc proc); +int Pxi_SendWordByFifo(int fifo_tag, uint32_t data, bool err); +void Pxii_HandlerRecvFifoNotEmpty(void); void FileInit(struct file_stream* file); bool GetOverlayInfo(struct overlay_info_entry* overlay_info, undefined param_2, int overlay_id); bool LoadOverlayInternal(struct overlay_info_entry* overlay_info); @@ -354,7 +409,32 @@ void InitOverlay(struct overlay_info_entry* overlay_info); void MD5_Init(undefined* ctx); void MD5_Update(undefined* ctx, const void* buf, size_t size); void MD5_Digest(uint32_t* hash, undefined* ctx); +void PMi_CallCallbackAndUnlock(void); +void PM_Init(void); +void PMi_CommonCallback(void); uint32_t PM_ForceToPowerOff(void); +void Cardi_InitCommon(void); +void Card_Enable(bool enable); +bool Cardi_ReadFromCache(struct card_rom_stat* p); +void Cardi_SetRomOp(uint32_t cmd1, uint32_t cmd2); +void Cardi_ReadCard(struct card_rom_stat* p); +void Card_Init(void); +struct card_rom_stat* Cardi_GetRomAccessor(void); +void Cardi_OnFifoRecv(enum pxi_fifo_tag tag, uint32_t data, bool err); +void Cardi_TaskThread(void* arg); +void Card_InitPulledOutCallback(void); +void Cardi_PulledOutCallback(enum pxi_fifo_tag tag, uint32_t data, bool err); +void Ctrdgi_InitCommon(void); +void Ctrdgi_ChangeLatestAccessCycle(struct ctrdg_rom_cycle* r); +void Ctrdgi_RestoreAccessCycle(struct ctrdg_rom_cycle* r); +void Ctrdgi_LockByProcessor(uint16_t lock_id, struct ctrdg_lock_by_proc* info); +void Ctrdgi_UnlockByProcessor(uint16_t lock_id, struct ctrdg_lock_by_proc* info); +void Ctrdgi_SendtoPxi(uint32_t data); +void Ctrdg_Init(); +void Ctrdgi_InitModuleInfo(); +void Ctrdgi_CallbackForInitModuleInfo(); +void Ctrdgi_PulledOutCallback(); +void Ctrdg_TerminateForPulledOut(); // If declaring these builtins causes issues, you can disable them #ifndef PMDSKY_NO_BUILTIN diff --git a/headers/types/common/enums.h b/headers/types/common/enums.h index 884e07dd..8d0122dc 100644 --- a/headers/types/common/enums.h +++ b/headers/types/common/enums.h @@ -4287,4 +4287,63 @@ enum check_direction_option { CHECK_DIRECTION_NO = 0, CHECK_DIRECTION_YES = 1 }; ENUM_8_BIT(box_type); #pragma pack(pop) +enum os_thread_state { + OS_THREAD_STATE_WAITING = 0, + OS_THREAD_STATE_READY = 1, + OS_THREAD_STATE_TERMINATED = 2 +}; + +enum os_arena_id { + OS_ARENA_MAIN = 0, + OS_ARENA_MAIN_SUBPRIV = 1, + OS_ARENA_MAINEX = 2, + OS_ARENA_ITCM = 3, + OS_ARENA_DTCM = 4, + OS_ARENA_SHARED = 5, + OS_ARENA_WRAM_MAIN = 6, + OS_ARENA_WRAM_SUB = 7, + OS_ARENA_WRAM_SUBPRIV = 8, + OS_ARENA_MAX = 9 +}; + +enum mi_wram { MI_WRAM_ARM9_ALL = 0, MI_WRAM_1616_1 = 1, MI_WRAM_1616_2 = 2, MI_WRAM_ARM7_ALL = 3 }; + +enum pxi_fifo_tag { + PXI_FIFO_TAG_EX = 0, // Extension format + PXI_FIFO_TAG_USER_0, // for application programmer, use it in free + PXI_FIFO_TAG_USER_1, // for application programmer, use it in free + PXI_FIFO_TAG_SYSTEM, // SDK inner usage + PXI_FIFO_TAG_NVRAM, // NVRAM + PXI_FIFO_TAG_RTC, // RTC + PXI_FIFO_TAG_TOUCHPANEL, // Touch Panel + PXI_FIFO_TAG_SOUND, // Sound + PXI_FIFO_TAG_PM, // Power Management + PXI_FIFO_TAG_MIC, // Microphone + PXI_FIFO_TAG_WM, // Wireless Manager + PXI_FIFO_TAG_FS, // File System + PXI_FIFO_TAG_OS, // OS + PXI_FIFO_TAG_CTRDG, // Cartridge + PXI_FIFO_TAG_CARD, // Card + PXI_FIFO_TAG_WVR, // Control driving wireless library + PXI_FIFO_TAG_CTRDG_Ex, // Cartridge Ex + PXI_MAX_FIFO_TAG = 32 // MAX FIFO TAG +}; + +enum pxi_proc { PXI_PROC_ARM9 = 0, PXI_PROC_ARM7 = 1 }; + +enum mi_cartridge_rom_cycle_1st { + MI_CTRDG_ROMCYCLE1_10 = 0, + MI_CTRDG_ROMCYCLE1_8 = 1, + MI_CTRDG_ROMCYCLE1_6 = 2, + MI_CTRDG_ROMCYCLE1_18 = 3 +}; + +enum mi_cartridge_rom_cycle_2nd { MI_CTRDG_ROMCYCLE2_6 = 0, MI_CTRDG_ROMCYCLE2_4 = 1 }; + +enum os_intr_mode { + OS_INTRMODE_ENABLE = 0, + OS_INTRMODE_DISABLE_FIQ = 0x40, + OS_INTRMODE_DISABLE_IRQ = 0x80 +}; + #endif diff --git a/headers/types/common/util.h b/headers/types/common/util.h index 986897ad..9fe4d5a4 100644 --- a/headers/types/common/util.h +++ b/headers/types/common/util.h @@ -1,6 +1,8 @@ #ifndef HEADERS_TYPES_COMMON_UTIL_H_ #define HEADERS_TYPES_COMMON_UTIL_H_ +#include "enums.h" + // Common data structures not specific to EoS // RGB8 color @@ -123,22 +125,18 @@ typedef void (*thread_entry_fn_t)(void); // Specifies a function called when a thread exits typedef void (*thread_exit_fn_t)(void); -// Contains information about a running thread -struct thread { - int flags; // Probably a flags field. Usually 0x1F. - struct thread* field_0x4; // r2 parameter in ThreadStart - undefined4 field_0x8; // Initialized to 0 - undefined4 field_0xC; // Initialized to 0 - undefined4 field_0x10; // Initialized to 0 - undefined4 field_0x14; // Initialized to 0 - undefined4 field_0x18; // Initialized to 0 - undefined4 field_0x1C; // Initialized to 0 - undefined4 field_0x20; // Initialized to 0 - undefined4 field_0x24; // Initialized to 0 - undefined4 field_0x28; // Initialized to 0 - undefined4 field_0x2C; // Initialized to 0 - undefined4 field_0x30; // Initialized to 0 - undefined4 field_0x34; // Initialized to 0 +struct cp_context { + uint64_t div_numer; + uint64_t div_denom; + uint64_t sqrt; + uint16_t div_mode; + uint16_t sqrt_mode; +}; +ASSERT_SIZE(struct cp_context, 28); + +struct os_context { + uint32_t cpsr; + uint32_t registers[13]; // Initialized to 0 // 0x38: Points to the area of the allocated stack area that can actually be used to store data. // This is equal to stack_pointer - 0x44, with an additional - 4 if the resulting addess is not // aligned to 8 bytes. @@ -147,69 +145,94 @@ struct thread { thread_exit_fn_t exit_function; void* function_address_plus_4; // 0x40: Pointer to the function to run + 4 void* stack_pointer_minus_4; // 0x44: Pointer to the start of the stack area - 4 - undefined field_0x48; - undefined field_0x49; - undefined field_0x4A; - undefined field_0x4B; - undefined field_0x4C; - undefined field_0x4D; - undefined field_0x4E; - undefined field_0x4F; - undefined field_0x50; - undefined field_0x51; - undefined field_0x52; - undefined field_0x53; - undefined field_0x54; - undefined field_0x55; - undefined field_0x56; - undefined field_0x57; - undefined field_0x58; - undefined field_0x59; - undefined field_0x5A; - undefined field_0x5B; - undefined field_0x5C; - undefined field_0x5D; - undefined field_0x5E; - undefined field_0x5F; - undefined field_0x60; - undefined field_0x61; - undefined field_0x62; - undefined field_0x63; - undefined4 field_0x64; // Initialized to 0 + struct cp_context cp_context; +}; +ASSERT_SIZE(struct os_context, 100); + +typedef void (*os_alarm_handler)(void*); + +struct osi_alarm { + os_alarm_handler handler; + void* arg; + + uint32_t tag; + uint64_t fire; + struct osi_alarm* prev; + struct osi_alarm* next; + + uint64_t period; + uint64_t start; +}; +ASSERT_SIZE(struct osi_alarm, 44); + +typedef void (*os_thread_destructor)(void*); + +struct thread; +struct os_thread_queue; +struct os_thread_link; +struct os_mutex; +struct os_mutex_queue; +struct os_mutex_link; + +struct os_thread_queue { + struct thread* head; // Initialized to NULL + struct thread* tail; // Initialized to NULL +}; +ASSERT_SIZE(struct os_thread_queue, 8); + +struct os_thread_link { + struct thread* prev; // Initialized to NULL + struct thread* next; // Initialized to NULL +}; +ASSERT_SIZE(struct os_thread_link, 8); + +struct os_mutex_link { + struct os_mutex* next; // Initialized to NULL + struct os_mutex* prev; // Initialized to NULL +}; +ASSERT_SIZE(struct os_mutex_link, 8); + +struct os_mutex_queue { + struct os_mutex* head; // Initialized to NULL + struct os_mutex* tail; // Initialized to NULL +}; +ASSERT_SIZE(struct os_mutex_queue, 8); + +struct os_mutex { + struct os_thread_queue queue; + struct thread* thread; // Initialized to NULL + int count; // Initialized to 0 + struct os_mutex_link link; // Initialized to NULL +}; +ASSERT_SIZE(struct os_mutex, 24); + +// Contains information about a running thread +struct thread { + struct os_context context; + enum os_thread_state state; // Initialized to OS_THREAD_STATE_WAITING // 0x68: Pointer to the next thread. This forms a linked list sorted in ascending order // according to sorting_order struct thread* next_thread; // 0x6C: Seems to be a thread ID that gets incremented for each new thread created. int thread_id; - int sorting_order; // 0x70: Unknown. Used to sort threads. - undefined4 field_0x74; // Initialized to 0 - undefined4 field_0x78; // Initialized to 0 - undefined4 field_0x7C; // Initialized to 0 - undefined4 field_0x80; // Initialized to 0 - undefined4 field_0x84; // Initialized to 0 - undefined4 field_0x88; // Initialized to 0 - undefined4 field_0x8C; // Initialized to 0 - void* stack_end_pointer; // 0x90: Pointer to the end of the stack area (exclusive) - void* stack_pointer; // 0x94: Pointer to the start of the stack area (inclusive) - undefined4 field_0x98; // Initialized to 0 - undefined4 field_0x9C; // Initialized to 0 - undefined4 field_0xA0; // Initialized to 0 - // Initialized to 0. Actually part of a separate struct alongside field_0xA8 and field_0xAC. - undefined4 field_0xA4; - undefined4 field_0xA8; // Initialized to 0 - undefined4 field_0xAC; // Initialized to 0 - undefined4 field_0xB0; // Initialized to 0 - undefined4 field_0xB4; // Initialized to 0 - undefined field_0xB8; - undefined field_0xB9; - undefined field_0xBA; - undefined field_0xBB; - undefined field_0xBC; - undefined field_0xBD; - undefined field_0xBE; - undefined field_0xBF; + int sorting_order; // 0x70: Used to sort threads. + void* profiler; // Initialized to NULL + struct os_thread_queue* queue; // Initialized to NULL + struct os_thread_link link; + struct os_mutex* mutex; // Initialized to NULL + struct os_mutex_queue mutex_queue; + void* stack_end_pointer; // 0x90: Pointer to the end of the stack area (exclusive) + void* stack_pointer; // 0x94: Pointer to the start of the stack area (inclusive) + uint32_t stack_warning_offset; // Initialized to 0 + struct os_thread_queue join_queue; + // Initialized to 0. + void* specific[3]; + struct osi_alarm* alarm_for_sleep; // Initialized to 0 + os_thread_destructor destructor; // Initialized to NULL + void* user_parameter; + uint32_t system_errno; }; -ASSERT_SIZE(struct thread, 192); // Last 8 bytes are not confirmed +ASSERT_SIZE(struct thread, 192); // Seems to be used to hold some global state about threads struct thread_info { @@ -304,4 +327,41 @@ struct sockaddr_in { }; ASSERT_SIZE(struct sockaddr_in, 8); +typedef void (*os_irq_function)(void); + +typedef void (*lock_ctrl_funcp)(void); + +typedef void (*os_switch_thread_callback)(struct thread* from, struct thread* to); + +typedef void (*pxi_fifo_callback)(enum pxi_fifo_tag tag, uint32_t data, bool err); + +struct os_lock_word { + uint32_t lock_flag; + uint16_t owner_id; + uint16_t extension; +}; +ASSERT_SIZE(struct os_lock_word, 8); + +struct card_rom_stat { + void (*read_func)(struct card_rom_stat*); + uint32_t ctrl; + uint8_t* cache_page; + uint32_t dummy[5]; + uint8_t cache_buf[512]; +}; +ASSERT_SIZE(struct card_rom_stat, 544); + +struct ctrdg_rom_cycle { + enum mi_cartridge_rom_cycle_1st c1; + enum mi_cartridge_rom_cycle_2nd c2; +}; +ASSERT_SIZE(struct ctrdg_rom_cycle, 8); + +struct ctrdg_lock_by_proc { + bool locked; + uint8_t dummy[3]; + enum os_intr_mode irq; +}; +ASSERT_SIZE(struct ctrdg_lock_by_proc, 8); + #endif diff --git a/symbols/arm9/libs.yml b/symbols/arm9/libs.yml index cd985ce9..127b8b62 100644 --- a/symbols/arm9/libs.yml +++ b/symbols/arm9/libs.yml @@ -1845,6 +1845,76 @@ libs: EU: 0x2078C7C NA: 0x20788E4 JP: 0x2078BCC + - name: OS_InitIrqTable + address: + EU: 0x2078E18 + NA: 0x2078A80 + JP: 0x2078D68 + - name: OS_SetIrqFunction + address: + EU: 0x2078E30 + NA: 0x2078A98 + JP: 0x2078D80 + - name: OS_SetIrqMask + address: + EU: 0x2078FD4 + NA: 0x2078C3C + JP: 0x2078F24 + - name: OS_EnableIrqMask + address: + EU: 0x2079000 + NA: 0x2078C68 + JP: 0x2078F50 + - name: OS_DisableIrqMask + address: + EU: 0x2079030 + NA: 0x2078C98 + JP: 0x2078F80 + - name: OS_ResetRequestIrqMask + address: + EU: 0x2079060 + NA: 0x2078CC8 + JP: 0x2078FB0 + - name: OS_SetIrqStackChecker + address: + EU: 0x207908C + NA: 0x2078CF4 + JP: 0x2078FDC + - name: OS_InitLock + address: + EU: 0x20790C0 + NA: 0x2078D28 + JP: 0x2079010 + - name: OS_LockByWord + address: + EU: 0x20791D8 + NA: 0x2078E40 + JP: 0x2079128 + - name: OSi_DoUnlockByWord + address: + EU: 0x20791E8 + NA: 0x2078E50 + JP: 0x2079138 + - name: OS_UnlockByWord + address: + EU: 0x207925C + NA: 0x2078EC4 + JP: 0x20791AC + - name: OS_UnlockCartridge + address: + EU: 0x20792D8 + NA: 0x2078F40 + JP: 0x2079228 + - name: OS_UnLockCartridge + address: + EU: 0x20792F8 + NA: 0x2078F60 + JP: 0x2079248 + - name: OSi_FreeCartridgeBus + address: + EU: 0x207933C + NA: 0x2078FA4 + JP: 0x207928C - name: OS_GetLockID address: EU: 0x20793C4 @@ -1859,6 +1929,11 @@ libs: Increments thread_info::thread_count by 1 and returns the new value. return: New thread count + - name: OSi_InsertLinkToQueue + address: + EU: 0x2079500 + NA: 0x2079168 + JP: 0x2079450 - name: InsertThreadIntoList address: EU: 0x2079630 @@ -1870,6 +1945,16 @@ libs: The thread is inserted in sorted order. r0: Thread to insert + - name: OS_RescheduleThread + address: + EU: 0x20796D8 + NA: 0x2079340 + JP: 0x2079628 + - name: OS_InitThread + address: + EU: 0x20797A0 + NA: 0x2079408 + JP: 0x20796F0 - name: StartThread address: EU: 0x20798F8 @@ -1897,6 +1982,31 @@ libs: Base functions that contain an infinite loop that is not supposed to return and that have their stacks in main RAM have this function as their return address. No params. + - name: OS_SleepThread + address: + EU: 0x2079C20 + NA: 0x2079888 + JP: 0x2079B70 + - name: OS_WakeupThreadDirect + address: + EU: 0x2079CD8 + NA: 0x2079940 + JP: 0x2079C28 + - name: OS_SelectThread + address: + EU: 0x2079D00 + NA: 0x2079968 + JP: 0x2079C50 + - name: OS_SetSwitchThreadCallback + address: + EU: 0x2079F74 + NA: 0x2079BDC + JP: 0x2079EC4 + - name: OSi_IdleThreadProc + address: + EU: 0x2079F9C + NA: 0x2079C04 + JP: 0x2079EEC - name: SetThreadField0xB4 address: EU: 0x207A014 @@ -1921,6 +2031,96 @@ libs: r0: Pointer to the thread to initialize r1: Pointer to the function the thread will run r2: Pointer to the start of the thread's stack area - 4 + - name: OS_SaveContext + address: + EU: 0x207A0A0 + NA: 0x2079D08 + JP: 0x2079FF0 + - name: OS_LoadContext + address: + EU: 0x207A0EC + NA: 0x2079D54 + JP: 0x207A03C + - name: OS_InitMutex + address: + EU: 0x207A3C8 + NA: 0x207A030 + JP: 0x207A318 + - name: DC_FlushAll + address: + EU: 0x207A608 + NA: 0x207A270 + JP: 0x207A558 + - name: DC_InvalidateRange + address: + EU: 0x207A63C + NA: 0x207A2A4 + JP: 0x207A58C + - name: DC_FlushRange + address: + EU: 0x207A674 + NA: 0x207A2DC + JP: 0x207A5C4 + - name: OSi_WaitVCount0 + address: + EU: 0x207A6E4 + NA: 0x207A34C + JP: 0x207A634 + - name: OS_Init + address: + EU: 0x207A704 + NA: 0x207A36C + JP: 0x207A654 + - name: OS_InitArena + address: + EU: 0x207A74C + NA: 0x207A3B4 + JP: 0x207A69C + - name: OS_InitArenaEx + address: + EU: 0x207A850 + NA: 0x207A4B8 + JP: 0x207A7A0 + - name: OS_GetInitArenaHi + address: + EU: 0x207A8E4 + NA: 0x207A54C + JP: 0x207A834 + - name: OS_GetInitArenaLo + address: + EU: 0x207A9C8 + NA: 0x207A630 + JP: 0x207A918 + - name: OS_SetArenaHi + address: + EU: 0x207AA70 + NA: 0x207A6D8 + JP: 0x207A9C0 + - name: OS_SetArenaLo + address: + EU: 0x207AA84 + NA: 0x207A6EC + JP: 0x207A9D4 + - name: OS_SetProtectionRegion1 + address: + EU: 0x207AEAC + NA: 0x207AB14 + JP: 0x207ADFC + - name: OS_SetProtectionRegion2 + address: + EU: 0x207AEB4 + NA: 0x207AB1C + JP: 0x207AE04 + - name: OS_InitException + address: + EU: 0x207AEBC + NA: 0x207AB24 + JP: 0x207AE0C + - name: OSi_ExceptionHandler + address: + EU: 0x207AF2C + NA: 0x207AB94 + JP: 0x207AE7C - name: GetTimer0Control address: EU: 0x207B27C @@ -1930,6 +2130,11 @@ libs: Returns the value of the control register for hardware timer 0 return: Value of the control register + - name: OS_InitVAlarm + address: + EU: 0x207B708 + NA: 0x207B370 + JP: 0x207B658 - name: ClearIrqFlag address: EU: 0x207BB68 @@ -1997,6 +2202,11 @@ libs: See https://problemkaputt.de/gbatek.htm#armcpuflagsconditionfieldcond return: cpsr & 0x1f (the cpsr mode bits M4-M0) + - name: OS_InitReset + address: + EU: 0x207BC14 + NA: 0x207B87C + JP: 0x207BB64 - name: GetDsFirmwareUserSettings address: EU: 0x207BDA0 @@ -2018,6 +2228,11 @@ libs: r0: x return: clz(x) + - name: OSi_InitVramExclusive + address: + EU: 0x207BE2C + NA: 0x207BA94 + JP: 0x207BD7C - name: WaitForever2 address: EU: 0x207BFB8 @@ -2040,6 +2255,26 @@ libs: This just calls (in Ghidra terminology) coproc_moveto_Wait_for_interrupt(0). See https://en.wikipedia.org/wiki/ARM_architecture_family#Coprocessors. No params. + - name: MI_SetWramBank + address: + EU: 0x207BFD4 + NA: 0x207BC3C + JP: 0x207BF24 + - name: MI_DmaCopy16 + address: + EU: 0x207C0D4 + NA: 0x207BD3C + JP: 0x207C024 + - name: MI_StopDma + address: + EU: 0x207C4FC + NA: 0x207C164 + JP: 0x207C44C + - name: MIi_CheckDma0SourceAddress + address: + EU: 0x207C5FC + NA: 0x207C264 + JP: 0x207C54C - name: ArrayFill16 address: EU: 0x207C650 @@ -2155,6 +2390,41 @@ libs: r0: desired value r1: ptr return: previous value + - name: MI_Init + address: + EU: 0x207CB5C + NA: 0x207C7C4 + JP: 0x207CAAC + - name: Pxi_Init + address: + EU: 0x207DD3C + NA: 0x207D9A4 + JP: 0x207DC8C + - name: Pxi_InitFifo + address: + EU: 0x207DD48 + NA: 0x207D9B0 + JP: 0x207DC98 + - name: Pxi_SetFifoRecvCallback + address: + EU: 0x207DE48 + NA: 0x207DAB0 + JP: 0x207DD98 + - name: Pxi_IsCallbackReady + address: + EU: 0x207DE94 + NA: 0x207DAFC + JP: 0x207DDE4 + - name: Pxi_SendWordByFifo + address: + EU: 0x207DEB8 + NA: 0x207DB20 + JP: 0x207DE08 + - name: Pxii_HandlerRecvFifoNotEmpty + address: + EU: 0x207DF40 + NA: 0x207DBA8 + JP: 0x207DE90 - name: FileInit address: EU: 0x207F77C @@ -2229,6 +2499,21 @@ libs: r0: [output] hash buffer (16 bytes) r1: context + - name: PMi_CallCallbackAndUnlock + address: + EU: 0x2081E1C + NA: 0x2081A84 + JP: 0x2081D6C + - name: PM_Init + address: + EU: 0x2081E5C + NA: 0x2081AC4 + JP: 0x2081DAC + - name: PMi_CommonCallback + address: + EU: 0x2081F00 + NA: 0x2081B68 + JP: 0x2081E50 - name: PM_ForceToPowerOff address: EU: 0x20823A4 @@ -2238,6 +2523,116 @@ libs: Powers off the system. return: ? + - name: Cardi_InitCommon + address: + EU: 0x20835E0 + NA: 0x2083248 + JP: 0x2083530 + - name: Card_Enable + address: + EU: 0x2083718 + NA: 0x2083380 + JP: 0x2083668 + - name: Cardi_ReadFromCache + address: + EU: 0x2084024 + NA: 0x2083C8C + JP: 0x2083F74 + - name: Cardi_SetRomOp + address: + EU: 0x20840B0 + NA: 0x2083D18 + JP: 0x2084000 + - name: Cardi_ReadCard + address: + EU: 0x20843C0 + NA: 0x2084028 + JP: 0x2084310 + - name: Card_Init + address: + EU: 0x208469C + NA: 0x2084304 + JP: 0x20845EC + - name: Cardi_GetRomAccessor + address: + EU: 0x208470C + NA: 0x2084374 + JP: 0x208465C + - name: Cardi_OnFifoRecv + address: + EU: 0x2084718 + NA: 0x2084380 + JP: 0x2084668 + - name: Cardi_TaskThread + address: + EU: 0x208474C + NA: 0x20843B4 + JP: 0x208469C + - name: Card_InitPulledOutCallback + address: + EU: 0x20848F0 + NA: 0x2084558 + JP: 0x2084840 + - name: Cardi_PulledOutCallback + address: + EU: 0x208491C + NA: 0x2084584 + JP: 0x208486C + - name: Ctrdgi_InitCommon + address: + EU: 0x2084ACC + NA: 0x2084734 + JP: 0x2084A1C + - name: Ctrdgi_ChangeLatestAccessCycle + address: + EU: 0x2084C50 + NA: 0x20848B8 + JP: 0x2084BA0 + - name: Ctrdgi_RestoreAccessCycle + address: + EU: 0x2084C98 + NA: 0x2084900 + JP: 0x2084BE8 + - name: Ctrdgi_LockByProcessor + address: + EU: 0x2084CCC + NA: 0x2084934 + JP: 0x2084C1C + - name: Ctrdgi_UnlockByProcessor + address: + EU: 0x2084D28 + NA: 0x2084990 + JP: 0x2084C78 + - name: Ctrdgi_SendtoPxi + address: + EU: 0x2084D4C + NA: 0x20849B4 + JP: 0x2084C9C + - name: Ctrdg_Init + address: + EU: 0x2084DE4 + NA: 0x2084A4C + JP: 0x2084D34 + - name: Ctrdgi_InitModuleInfo + address: + EU: 0x2084E98 + NA: 0x2084B00 + JP: 0x2084DE8 + - name: Ctrdgi_CallbackForInitModuleInfo + address: + EU: 0x208508C + NA: 0x2084CF4 + JP: 0x2084FDC + - name: Ctrdgi_PulledOutCallback + address: + EU: 0x20850B8 + NA: 0x2084D20 + JP: 0x2085008 + - name: Ctrdg_TerminateForPulledOut + address: + EU: 0x2085114 + NA: 0x2084D7C + JP: 0x2085064 - name: abs address: EU: 0x20868F4 From 8bcffe2ec493f42dc24a81059c69b0ff68398f4d Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Thu, 12 Feb 2026 18:27:20 -0500 Subject: [PATCH 2/2] Remove symbols with unknown signatures --- headers/functions/arm9/libs.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/headers/functions/arm9/libs.h b/headers/functions/arm9/libs.h index e4b8e422..954f048a 100644 --- a/headers/functions/arm9/libs.h +++ b/headers/functions/arm9/libs.h @@ -430,11 +430,6 @@ void Ctrdgi_RestoreAccessCycle(struct ctrdg_rom_cycle* r); void Ctrdgi_LockByProcessor(uint16_t lock_id, struct ctrdg_lock_by_proc* info); void Ctrdgi_UnlockByProcessor(uint16_t lock_id, struct ctrdg_lock_by_proc* info); void Ctrdgi_SendtoPxi(uint32_t data); -void Ctrdg_Init(); -void Ctrdgi_InitModuleInfo(); -void Ctrdgi_CallbackForInitModuleInfo(); -void Ctrdgi_PulledOutCallback(); -void Ctrdg_TerminateForPulledOut(); // If declaring these builtins causes issues, you can disable them #ifndef PMDSKY_NO_BUILTIN