Files
SpaghettiKart/src/os/osCreateThread.c
T
Faris Awan 5c23113592 Match/split all of libultra (#23)
* libultra from sm64 integrated; 3 libultra functions matched

* All of libultra done!

authored-by: farisawan-2000 <farisawan.2000@gmail.com>
2021-04-27 22:35:30 -06:00

37 lines
1.0 KiB
C

#include "libultra_internal.h"
void __osCleanupThread(void);
extern OSThread *__osActiveQueue;
// Don't warn about pointer->u64 cast
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
void osCreateThread(OSThread *thread, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri pri) {
register u32 int_disabled;
u32 tmp;
thread->id = id;
thread->priority = pri;
thread->next = NULL;
thread->queue = NULL;
thread->context.pc = (u32) entry;
thread->context.a0 = (u64) arg;
thread->context.sp = (u64) sp - 16;
thread->context.ra = (u64) __osCleanupThread;
tmp = OS_IM_ALL;
thread->context.sr = 65283;
thread->context.rcp = (tmp & 0x3f0000) >> 16;
thread->context.fpcsr = (u32) 0x01000800;
thread->fp = 0;
thread->state = OS_STATE_STOPPED;
thread->flags = 0;
int_disabled = __osDisableInt();
thread->tlnext = __osActiveQueue;
__osActiveQueue = thread;
__osRestoreInt(int_disabled);
}
#pragma GCC diagnostic pop