summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:14:40 +0300
committerEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:14:40 +0300
commit70556fc300ba85dad248d20b3c79c415e2ef88e5 (patch)
tree900bcd9bfbc5101d4d8f01ce057429658909e273
parentc4263506fa96acc210d1cf356023a3ffde805a0b (diff)
Begin decompiling OS_mutex
-rw-r--r--arm7/arm7.lsf1
-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.h9
-rw-r--r--arm7/lib/src/OS_mutex.c8
-rw-r--r--include/nitro/OS_context_shared.h25
-rw-r--r--include/nitro/OS_mutex_shared.h14
-rw-r--r--include/nitro/OS_thread_shared.h93
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