mirror of
https://github.com/emu-russia/pureikyubu.git
synced 2025-04-02 10:42:15 -04:00
126 lines
3.3 KiB
C
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 );
|