From 70556fc300ba85dad248d20b3c79c415e2ef88e5 Mon Sep 17 00:00:00 2001 From: Egor Ananyin Date: Sat, 20 Jun 2020 09:14:40 +0300 Subject: Begin decompiling OS_mutex --- arm7/arm7.lsf | 1 + arm7/asm/OS_mutex.s | 131 -------------------------------------------- arm7/asm/OS_mutex_s.s | 121 ++++++++++++++++++++++++++++++++++++++++ arm7/lib/include/OS_mutex.h | 9 +++ arm7/lib/src/OS_mutex.c | 8 +++ 5 files changed, 139 insertions(+), 131 deletions(-) delete mode 100644 arm7/asm/OS_mutex.s create mode 100644 arm7/asm/OS_mutex_s.s create mode 100644 arm7/lib/include/OS_mutex.h create mode 100644 arm7/lib/src/OS_mutex.c (limited to 'arm7') diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 46486c4f..e5809c12 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -22,6 +22,7 @@ Autoload WRAM Object OS_thread.o Object OS_context.o Object OS_message.o + Object OS_mutex_s.o Object OS_mutex.o Object OS_init.o Object OS_arena.o diff --git a/arm7/asm/OS_mutex.s b/arm7/asm/OS_mutex.s deleted file mode 100644 index 981842b8..00000000 --- a/arm7/asm/OS_mutex.s +++ /dev/null @@ -1,131 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start OSi_DequeueItem -OSi_DequeueItem: ; 0x037F99E8 - ldr r2, [r1, #16] - ldr r1, [r1, #20] - cmp r2, #0 - streq r1, [r0, #112] ; 0x70 - strne r1, [r2, #20] - cmp r1, #0 - streq r2, [r0, #108] ; 0x6c - strne r2, [r1, #16] - bx lr - - arm_func_start OSi_EnqueueTail -OSi_EnqueueTail: ; 0x037F9A0C - ldr r2, [r0, #112] ; 0x70 - cmp r2, #0 - streq r1, [r0, #108] ; 0x6c - strne r1, [r2, #16] - str r2, [r1, #20] - mov r2, #0 - str r2, [r1, #16] - str r1, [r0, #112] ; 0x70 - bx lr - - arm_func_start OSi_UnlockAllMutex -OSi_UnlockAllMutex: ; 0x037F9A30 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - add r5, r6, #108 ; 0x6c - mov r4, #0 - b _037F9A58 -_037F9A44: - mov r0, r5 - bl OSi_RemoveMutexLinkFromQueue - str r4, [r0, #12] - str r4, [r0, #8] - bl OS_WakeupThread -_037F9A58: - ldr r0, [r6, #108] ; 0x6c - cmp r0, #0 - bne _037F9A44 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start OS_UnlockMutex -OS_UnlockMutex: ; 0x037F9A6C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, _037F9AD8 ; =OSi_ThreadInfo - ldr r0, [r0, #4] - ldr r1, [r5, #8] - cmp r1, r0 - bne _037F9AC4 - ldr r1, [r5, #12] - sub r1, r1, #1 - str r1, [r5, #12] - ldr r1, [r5, #12] - cmp r1, #0 - bne _037F9AC4 - mov r1, r5 - bl OSi_DequeueItem - mov r0, #0 - str r0, [r5, #8] - mov r0, r5 - bl OS_WakeupThread -_037F9AC4: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F9AD8: .word OSi_ThreadInfo - - arm_func_start OS_LockMutex -OS_LockMutex: ; 0x037F9ADC - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, _037F9B64 ; =OSi_ThreadInfo - ldr r7, [r0, #4] - mov r6, #0 -_037F9AFC: - ldr r0, [r5, #8] - cmp r0, #0 - bne _037F9B28 - str r7, [r5, #8] - ldr r0, [r5, #12] - add r0, r0, #1 - str r0, [r5, #12] - mov r0, r7 - mov r1, r5 - bl OSi_EnqueueTail - b _037F9B50 -_037F9B28: - cmp r0, r7 - ldreq r0, [r5, #12] - addeq r0, r0, #1 - streq r0, [r5, #12] - beq _037F9B50 - str r5, [r7, #104] ; 0x68 - mov r0, r5 - bl OS_SleepThread - str r6, [r7, #104] ; 0x68 - b _037F9AFC -_037F9B50: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037F9B64: .word OSi_ThreadInfo - - arm_func_start OS_InitMutex -OS_InitMutex: ; 0x037F9B68 - mov r2, #0 - str r2, [r0, #4] - ldr r1, [r0, #4] - str r1, [r0] - str r2, [r0, #8] - str r2, [r0, #12] - bx lr diff --git a/arm7/asm/OS_mutex_s.s b/arm7/asm/OS_mutex_s.s new file mode 100644 index 00000000..22ac4ef6 --- /dev/null +++ b/arm7/asm/OS_mutex_s.s @@ -0,0 +1,121 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OSi_DequeueItem +OSi_DequeueItem: ; 0x037F99E8 + ldr r2, [r1, #16] + ldr r1, [r1, #20] + cmp r2, #0 + streq r1, [r0, #112] ; 0x70 + strne r1, [r2, #20] + cmp r1, #0 + streq r2, [r0, #108] ; 0x6c + strne r2, [r1, #16] + bx lr + + arm_func_start OSi_EnqueueTail +OSi_EnqueueTail: ; 0x037F9A0C + ldr r2, [r0, #112] ; 0x70 + cmp r2, #0 + streq r1, [r0, #108] ; 0x6c + strne r1, [r2, #16] + str r2, [r1, #20] + mov r2, #0 + str r2, [r1, #16] + str r1, [r0, #112] ; 0x70 + bx lr + + arm_func_start OSi_UnlockAllMutex +OSi_UnlockAllMutex: ; 0x037F9A30 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + add r5, r6, #108 ; 0x6c + mov r4, #0 + b _037F9A58 +_037F9A44: + mov r0, r5 + bl OSi_RemoveMutexLinkFromQueue + str r4, [r0, #12] + str r4, [r0, #8] + bl OS_WakeupThread +_037F9A58: + ldr r0, [r6, #108] ; 0x6c + cmp r0, #0 + bne _037F9A44 + ldmia sp!, {r4, r5, r6, lr} + bx lr + + arm_func_start OS_UnlockMutex +OS_UnlockMutex: ; 0x037F9A6C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _037F9AD8 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r1, [r5, #8] + cmp r1, r0 + bne _037F9AC4 + ldr r1, [r5, #12] + sub r1, r1, #1 + str r1, [r5, #12] + ldr r1, [r5, #12] + cmp r1, #0 + bne _037F9AC4 + mov r1, r5 + bl OSi_DequeueItem + mov r0, #0 + str r0, [r5, #8] + mov r0, r5 + bl OS_WakeupThread +_037F9AC4: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F9AD8: .word OSi_ThreadInfo + + arm_func_start OS_LockMutex +OS_LockMutex: ; 0x037F9ADC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _037F9B64 ; =OSi_ThreadInfo + ldr r7, [r0, #4] + mov r6, #0 +_037F9AFC: + ldr r0, [r5, #8] + cmp r0, #0 + bne _037F9B28 + str r7, [r5, #8] + ldr r0, [r5, #12] + add r0, r0, #1 + str r0, [r5, #12] + mov r0, r7 + mov r1, r5 + bl OSi_EnqueueTail + b _037F9B50 +_037F9B28: + cmp r0, r7 + ldreq r0, [r5, #12] + addeq r0, r0, #1 + streq r0, [r5, #12] + beq _037F9B50 + str r5, [r7, #104] ; 0x68 + mov r0, r5 + bl OS_SleepThread + str r6, [r7, #104] ; 0x68 + b _037F9AFC +_037F9B50: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_037F9B64: .word OSi_ThreadInfo diff --git a/arm7/lib/include/OS_mutex.h b/arm7/lib/include/OS_mutex.h new file mode 100644 index 00000000..6b8da6a8 --- /dev/null +++ b/arm7/lib/include/OS_mutex.h @@ -0,0 +1,9 @@ +#ifndef GUARD_OS_MUTEX_H +#define GUARD_OS_MUTEX_H + +#include "nitro/OS_mutex_shared.h" +#include "nitro/types.h" + +void OS_InitMutex(OSMutex* mutex); + +#endif diff --git a/arm7/lib/src/OS_mutex.c b/arm7/lib/src/OS_mutex.c new file mode 100644 index 00000000..8fe167f3 --- /dev/null +++ b/arm7/lib/src/OS_mutex.c @@ -0,0 +1,8 @@ +#include "function_target.h" +#include "OS_mutex.h" + +ARM_FUNC void OS_InitMutex(OSMutex* mutex) { + OS_InitThreadQueue(&mutex->queue); + mutex->thread = NULL; + mutex->count = 0; +} -- cgit v1.2.3