89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
#ifndef _CPU_HLE_OS_
|
|
#define _CPU_HLE_OS_
|
|
|
|
#include "cpu_hle.h"
|
|
|
|
|
|
#pragma pack(1)
|
|
|
|
|
|
#define OS_STATE_STOPPED 1
|
|
#define OS_STATE_RUNNABLE 2
|
|
#define OS_STATE_RUNNING 4
|
|
#define OS_STATE_WAITING 8
|
|
|
|
typedef uint32_t OSPri;
|
|
typedef uint32_t OSId;
|
|
typedef
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
float f_odd;
|
|
float f_even;
|
|
} f;
|
|
double d;
|
|
}
|
|
__OSfp;
|
|
|
|
typedef struct {
|
|
uint64_t at, v0, v1, a0, a1, a2, a3;
|
|
uint64_t t0, t1, t2, t3, t4, t5, t6, t7;
|
|
uint64_t s0, s1, s2, s3, s4, s5, s6, s7;
|
|
uint64_t t8, t9, gp, sp, s8, ra;
|
|
uint64_t lo, hi;
|
|
uint32_t sr, pc, cause, badvaddr, rcp;
|
|
uint32_t fpcsr;
|
|
__OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14;
|
|
__OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
|
|
} __OSThreadContext;
|
|
|
|
typedef struct OSThread_s
|
|
{
|
|
uint32_t next; // run/mesg queue link
|
|
OSPri priority; // run/mesg queue priority
|
|
uint32_t queue; // queue thread is on
|
|
uint32_t tlnext; // all threads queue link
|
|
#if 0
|
|
uint16_t state; // OS_STATE_*
|
|
uint16_t flags; // flags for rmon
|
|
#endif
|
|
//swap these because of byteswapping
|
|
uint16_t flags; // flags for rmon
|
|
uint16_t state; // OS_STATE_*
|
|
OSId id; // id for debugging
|
|
int fp; // thread has used fp unit
|
|
__OSThreadContext context; // register/interrupt mask
|
|
} OSThread;
|
|
|
|
typedef void * OSMesg;
|
|
|
|
//
|
|
// Structure for message queue
|
|
//
|
|
typedef struct OSMesgQueue_s
|
|
{
|
|
OSThread *mtqueue; // Queue to store threads blocked
|
|
// on empty mailboxes (receive)
|
|
OSThread *fullqueue; // Queue to store threads blocked
|
|
// on full mailboxes (send)
|
|
int32_t validCount; // Contains number of valid message
|
|
int32_t first; // Points to first valid message
|
|
int32_t msgCount; // Contains total # of messages
|
|
OSMesg *msg; // Points to message buffer array
|
|
} OSMesgQueue;
|
|
|
|
|
|
int __osRestoreInt(usf_state_t *, int n);
|
|
int __osDisableInt(usf_state_t *, int n);
|
|
int __osEnqueueThread(usf_state_t *, int n) ;
|
|
|
|
int osStartThread(usf_state_t *, int n);
|
|
int osRecvMesg(usf_state_t *, int n);
|
|
int osSetIntMask(usf_state_t *, int paddr) ;
|
|
int osVirtualToPhysical(usf_state_t *, int paddr);
|
|
int osAiSetNextBuffer(usf_state_t *, int paddr);
|
|
|
|
int saveThreadContext(usf_state_t *, int paddr);
|
|
int loadThreadContext(usf_state_t *, int paddr);
|
|
#endif
|