diff options
author | Egor Ananyin <ananinegor@gmail.com> | 2020-06-20 09:14:40 +0300 |
---|---|---|
committer | Egor Ananyin <ananinegor@gmail.com> | 2020-06-20 09:14:40 +0300 |
commit | 70556fc300ba85dad248d20b3c79c415e2ef88e5 (patch) | |
tree | 900bcd9bfbc5101d4d8f01ce057429658909e273 | |
parent | c4263506fa96acc210d1cf356023a3ffde805a0b (diff) |
Begin decompiling OS_mutex
-rw-r--r-- | arm7/arm7.lsf | 1 | ||||
-rw-r--r-- | arm7/asm/OS_mutex_s.s (renamed from arm7/asm/OS_mutex.s) | 10 | ||||
-rw-r--r-- | arm7/lib/include/OS_mutex.h | 9 | ||||
-rw-r--r-- | arm7/lib/src/OS_mutex.c | 8 | ||||
-rw-r--r-- | include/nitro/OS_context_shared.h | 25 | ||||
-rw-r--r-- | include/nitro/OS_mutex_shared.h | 14 | ||||
-rw-r--r-- | include/nitro/OS_thread_shared.h | 93 |
7 files changed, 150 insertions, 10 deletions
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.s index 981842b8..22ac4ef6 100644 --- a/arm7/asm/OS_mutex.s +++ b/arm7/asm/OS_mutex_s.s @@ -119,13 +119,3 @@ _037F9B50: 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/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; +} diff --git a/include/nitro/OS_context_shared.h b/include/nitro/OS_context_shared.h new file mode 100644 index 00000000..3ec722eb --- /dev/null +++ b/include/nitro/OS_context_shared.h @@ -0,0 +1,25 @@ +#ifndef GUARD_OS_CONTEXT_SHARED_H +#define GUARD_OS_CONTEXT_SHARED_H + +#include "nitro/types.h" + +typedef struct CPContext { + u64 div_numer; + u64 div_denom; + u64 sqrt; + u16 div_mode; + u16 sqrt_mode; +} CPContext; + +typedef struct OSContext +{ + u32 cpsr; + u32 r[13]; + u32 sp; + u32 lr; + u32 pc_plus4; + u32 sp_svc; + CPContext cp_context; +} OSContext; + +#endif diff --git a/include/nitro/OS_mutex_shared.h b/include/nitro/OS_mutex_shared.h new file mode 100644 index 00000000..bd181f55 --- /dev/null +++ b/include/nitro/OS_mutex_shared.h @@ -0,0 +1,14 @@ +#ifndef GUARD_OS_SHARED_MUTEX_H +#define GUARD_OS_SHARED_MUTEX_H + +#include "nitro/types.h" +#include "nitro/OS_thread_shared.h" + +struct OSMutex { + OSThreadQueue queue; + OSThread *thread; + s32 count; + OSMutexLink link; +}; + +#endif diff --git a/include/nitro/OS_thread_shared.h b/include/nitro/OS_thread_shared.h new file mode 100644 index 00000000..5855ee21 --- /dev/null +++ b/include/nitro/OS_thread_shared.h @@ -0,0 +1,93 @@ +#ifndef GUARD_OS_THREAD_SHARED_H +#define GUARD_OS_THREAD_SHARED_H + +#include "nitro/types.h" +#include "nitro/OS_context_shared.h" + +typedef struct OSiAlarm OSAlarm; + +typedef struct _OSThread OSThread; + +typedef struct _OSThreadQueue OSThreadQueue; +typedef struct _OSThreadLink OSThreadLink; +typedef struct _OSMutexQueue OSMutexQueue; +typedef struct _OSMutexLink OSMutexLink; +typedef struct OSMutex OSMutex; + +struct _OSThreadQueue +{ + OSThread *head; + OSThread *tail; +}; + +struct _OSThreadLink +{ + OSThread *prev; + OSThread *next; +}; + +struct _OSMutexQueue +{ + OSMutex *head; + OSMutex *tail; +}; + +struct _OSMutexLink +{ + OSMutex *next; + OSMutex *prev; +}; + +typedef struct OSThreadInfo { + u16 isNeedRescheduling; + u16 irqDepth; + OSThread* current; + OSThread* list; + void* switchCallback; // type: OSSwitchThreadCallback +} OSThreadInfo; + +typedef enum { + OS_THREAD_STATE_WAITING = 0, + OS_THREAD_STATE_READY = 1, + OS_THREAD_STATE_TERMINATED = 2 +} OSThreadState; + +typedef void (*OSSwitchThreadCallback) (OSThread *from, OSThread *to); + +typedef void (*OSThreadDestructor) (void *); + +struct _OSThread +{ + OSContext context; + OSThreadState state; + OSThread *next; + u32 id; + u32 priority; + void *profiler; + + OSThreadQueue *queue; + OSThreadLink link; + + OSMutex *mutex; + OSMutexQueue mutexQueue; + + u32 stackTop; + u32 stackBottom; + u32 stackWarningOffset; + + OSThreadQueue joinQueue; + + void *specific[3]; + OSAlarm *alarmForSleep; + OSThreadDestructor destructor; + void *userParameter; + + u32 systemErrno; +}; + +static inline void OS_InitThreadQueue(OSThreadQueue * queue) +{ + queue->head = queue->tail = NULL; +} + +#endif |