pureikyubu/SRC/HighLevel/OS.h
2020-06-28 16:01:58 +03:00

126 lines
3.3 KiB
C

// Dolphin OS structures and definitions
// Note: all structures are big-endian (like on GC), use swap on access!
/* ---------------------------------------------------------------------------
OS low memory vars
--------------------------------------------------------------------------- */
#define OS_PHYSICAL_CONTEXT 0x800000C0 // OSContext *
#define OS_CURRENT_CONTEXT 0x800000D4 // OSContext *
#define OS_DEFAULT_THREAD 0x800000D8 // OSThread *
#define OS_LINK_ACTIVE 0x800000DC // OSThreadLink
#define OS_CURRENT_THREAD 0x800000E4 // OSThread *
/* ---------------------------------------------------------------------------
Context API
--------------------------------------------------------------------------- */
// floating point context modes
#define OS_CONTEXT_MODE_FPU 1 // normal mode
#define OS_CONTEXT_MODE_PSFP 2 // gekko paired-single
// context status
#define OS_CONTEXT_STATE_FPSAVED 1 // set when FPU is saved
#define OS_CONTEXT_STATE_EXC 2 // set when saved by exception
#define OS_CONTEXT_FRAME_SIZE 768
#pragma pack(push, 1)
// CPU context
struct OSContext
{
// GPRs
uint32_t gpr[32];
uint32_t cr, lr, ctr, xer;
// FPRs (or paired-single 0-part)
union
{
double fpr[32];
uint64_t fprAsUint[32];
};
uint32_t fpscr_pad;
uint32_t fpscr; // dummy in emulator
// exception handling regs
uint32_t srr[2];
// context flags
uint16_t mode; // one of OS_CONTEXT_MODE*
uint16_t state; // or'ed OS_CONTEXT_STATE*
// gekko-specific regs
uint32_t gqr[8]; // quantization mode regs
uint32_t padding;
union
{
double psr[32]; // paired-single 1-part
uint64_t psrAsUint[32];
};
};
struct OSThreadLink
{
uint32_t next;
uint32_t prev;
};
struct OSThreadQueue
{
uint32_t head;
uint32_t tail;
};
typedef OSThreadQueue OSMutexQueue;
struct OSThread
{
OSContext context;
uint16_t state;
uint16_t attr;
int32_t suspend;
uint32_t priority;
uint32_t base;
uint32_t val;
uint32_t queue;
OSThreadLink link;
OSThreadQueue queueJoin;
uint32_t mutex;
OSMutexQueue queueMutex;
OSThreadLink linkActive;
uint32_t stackBase;
uint32_t stackEnd;
};
#pragma pack(pop)
// os calls
void OSSetCurrentContext ( void );
void OSGetCurrentContext ( void );
void OSSaveContext ( void );
void OSLoadContext ( void );
void OSClearContext ( void );
void OSInitContext ( void );
void OSLoadFPUContext ( void );
void OSSaveFPUContext ( void );
void OSFillFPUContext ( void );
void __OSContextInit ( void );
/* ---------------------------------------------------------------------------
Interrupt handling
--------------------------------------------------------------------------- */
void OSDisableInterrupts ( void );
void OSEnableInterrupts ( void );
void OSRestoreInterrupts ( void );