mirror of https://github.com/PCSX2/pcsx2.git
448 lines
12 KiB
C
448 lines
12 KiB
C
#ifndef __EEKERNEL_H__
|
|
#define __EEKERNEL_H__
|
|
|
|
#include <tamtypes.h>
|
|
#include <kernel.h>
|
|
|
|
|
|
#define RCNT0_COUNT *(volatile int*)0xB0000000
|
|
#define RCNT0_MODE *(volatile int*)0xB0000010
|
|
#define RCNT0_TARGET *(volatile int*)0xB0000020
|
|
#define RCNT0_HOLD *(volatile int*)0xB0000030
|
|
|
|
#define RCNT1_COUNT *(volatile int*)0xB0000800
|
|
#define RCNT1_MODE *(volatile int*)0xB0000810
|
|
#define RCNT1_TARGET *(volatile int*)0xB0000820
|
|
#define RCNT1_HOLD *(volatile int*)0xB0000830
|
|
|
|
#define RCNT2_COUNT *(volatile int*)0xB0001000
|
|
#define RCNT2_MODE *(volatile int*)0xB0001010
|
|
#define RCNT2_TARGET *(volatile int*)0xB0001020
|
|
|
|
#define RCNT3_COUNT *(volatile int*)0xB0001800
|
|
#define RCNT3_MODE *(volatile int*)0xB0001810
|
|
#define RCNT3_TARGET *(volatile int*)0xB0001820
|
|
|
|
#define GIF_CTRL *(volatile int*)0xB0003000
|
|
|
|
#define GIF_FIFO *(volatile u128*)0xB0006000
|
|
|
|
//SIF0
|
|
#define D5_CHCR *(volatile int*)0xB000C000
|
|
#define D5_MADR *(volatile int*)0xB000C010
|
|
#define D5_QWC *(volatile int*)0xB000C020
|
|
|
|
//SIF1
|
|
#define D6_CHCR *(volatile int*)0xB000C400
|
|
#define D6_MADR *(volatile int*)0xB000C410
|
|
#define D6_QWC *(volatile int*)0xB000C420
|
|
#define D6_TAG *(volatile int*)0xB000C430
|
|
|
|
#define DMAC_CTRL *(volatile int*)0xB000E000
|
|
#define DMAC_STAT *(volatile int*)0xB000E010
|
|
#define DMAC_PCR *(volatile int*)0xB000E020
|
|
#define DMAC_SQWC *(volatile int*)0xB000E030
|
|
#define DMAC_RBSR *(volatile int*)0xB000E040
|
|
#define DMAC_RBOR *(volatile int*)0xB000E050
|
|
#define DMAC_STADR *(volatile int*)0xB000E060
|
|
|
|
#define INTC_STAT *(volatile int*)0xB000F000
|
|
#define INTC_MASK *(volatile int*)0xB000F010
|
|
|
|
#define SBUS_MSFLG *(volatile int*)0xB000F220
|
|
#define SBUS_SMFLG *(volatile int*)0xB000F230
|
|
#define SBUS_F240 *(volatile int*)0xB000F240
|
|
|
|
#define DMAC_ENABLER *(volatile int*)0xB000F520
|
|
#define DMAC_ENABLEW *(volatile int*)0xB000F590
|
|
|
|
#define SBFLG_IOPALIVE 0x10000
|
|
#define SBFLG_IOPSYNC 0x40000
|
|
|
|
#define GS_PMODE *(volatile u64*)0xB2000000
|
|
#define GS_SMODE1 *(volatile u64*)0xB2000010
|
|
#define GS_SMODE2 *(volatile u64*)0xB2000020
|
|
#define GS_SRFSH *(volatile u64*)0xB2000030
|
|
#define GS_SYNCH1 *(volatile u64*)0xB2000040
|
|
#define GS_SYNCH2 *(volatile u64*)0xB2000050
|
|
#define GS_SYNCV *(volatile u64*)0xB2000060
|
|
#define GS_DISPFB1 *(volatile u64*)0xB2000070
|
|
#define GS_DISPLAY1 *(volatile u64*)0xB2000080
|
|
#define GS_DISPFB2 *(volatile u64*)0xB2000090
|
|
#define GS_DISPLAY2 *(volatile u64*)0xB20000A0
|
|
#define GS_EXTBUF *(volatile u64*)0xB20000B0
|
|
#define GS_EXTDATA *(volatile u64*)0xB20000C0
|
|
#define GS_EXTWRITE *(volatile u64*)0xB20000D0
|
|
#define GS_BGCOLOR *(volatile u64*)0xB20000E0
|
|
#define GS_CSR *(volatile u64*)0xB2001000
|
|
#define GS_IMR *(volatile u64*)0xB2001010
|
|
#define GS_BUSDIR *(volatile u64*)0xB2001040
|
|
#define GS_SIGLBLID *(volatile u64*)0xB2001080
|
|
|
|
#define INTC_GS 0
|
|
#define INTC_SBUS 1
|
|
#define INTC_VBLANK_S 2
|
|
#define INTC_VBLANK_E 3
|
|
#define INTC_VIF0 4
|
|
#define INTC_VIF1 5
|
|
#define INTC_VU0 6
|
|
#define INTC_VU1 7
|
|
#define INTC_IPU 8
|
|
#define INTC_TIM0 9
|
|
#define INTC_TIM1 10
|
|
#define INTC_TIM2 11
|
|
#define INTC_TIM3 12 //threads
|
|
//#define INTC_13 13 //not used
|
|
//#define INTC_14 14 //not used
|
|
|
|
#define DMAC_VIF0 0
|
|
#define DMAC_VIF1 1
|
|
#define DMAC_GIF 2
|
|
#define DMAC_FROM_IPU 3
|
|
#define DMAC_TO_IPU 4
|
|
#define DMAC_SIF0 5
|
|
#define DMAC_SIF1 6
|
|
#define DMAC_SIF2 7
|
|
#define DMAC_FROM_SPR 8
|
|
#define DMAC_TO_SPR 9
|
|
//#define DMAC_10 10 //not used
|
|
//#define DMAC_11 11 //not used
|
|
//#define DMAC_12 12 //not used
|
|
//#define DMAC_13 13 //not used
|
|
//#define DMAC_14 14 //not used
|
|
#define DMAC_ERROR 15
|
|
|
|
///////////////////////
|
|
// DMA TAG REGISTERS //
|
|
///////////////////////
|
|
#define DMA_TAG_REFE 0x00
|
|
#define DMA_TAG_CNT 0x01
|
|
#define DMA_TAG_NEXT 0x02
|
|
#define DMA_TAG_REF 0x03
|
|
#define DMA_TAG_REFS 0x04
|
|
#define DMA_TAG_CALL 0x05
|
|
#define DMA_TAG_RET 0x06
|
|
#define DMA_TAG_END 0x07
|
|
|
|
// Modes for DMA transfers
|
|
#define SIF_DMA_FROM_IOP 0x0
|
|
#define SIF_DMA_TO_IOP 0x1
|
|
#define SIF_DMA_FROM_EE 0x0
|
|
#define SIF_DMA_TO_EE 0x1
|
|
|
|
#define SIF_DMA_INT_I 0x2
|
|
#define SIF_DMA_INT_O 0x4
|
|
#define SIF_DMA_SPR 0x8
|
|
#define SIF_DMA_BSN 0x10 /* ? what is this? */
|
|
#define SIF_DMA_TAG 0x20
|
|
#define SIF_DMA_ERT 0x40
|
|
#define DMA_TAG_IRQ 0x80000000
|
|
#define DMA_TAG_PCE 0x0C000000
|
|
|
|
#define KSEG1_ADDR(x) (((u32)(x))|0xA0000000)
|
|
#define KUSEG_ADDR(x) (((u32)(x))&0x1FFFFFFF)
|
|
|
|
#define MAX_SEMAS 256
|
|
#define STACK_RES 0x2A0
|
|
|
|
//?
|
|
#define SRInitVal 0x70030C13
|
|
#define ConfigInitVal 0x73003
|
|
|
|
enum {
|
|
THS_RUN = 0x01,
|
|
THS_READY = 0x02,
|
|
THS_WAIT = 0x04,
|
|
THS_SUSPEND = 0x08,
|
|
THS_DORMANT = 0x10,
|
|
};
|
|
|
|
typedef struct {
|
|
u128 gpr[24]; // v0-t9 (skip r0,at,k0-ra)
|
|
u128 gp;
|
|
u128 fp;
|
|
u128 hi;
|
|
u128 lo;
|
|
u32 sa;
|
|
} eeRegs;
|
|
|
|
struct ThreadParam {
|
|
int status;
|
|
void (*entry)(void*);
|
|
void *stack;
|
|
int stackSize;
|
|
void *gpReg;
|
|
int initPriority;
|
|
int currentPriority;
|
|
u32 attr;
|
|
u32 option;
|
|
int waitSema; // waitType?
|
|
int waitId;
|
|
int wakeupCount;
|
|
};
|
|
|
|
struct TCB { //internal struct
|
|
struct TCB *next; //+00
|
|
struct TCB *prev; //+04
|
|
int status;//+08
|
|
void (*entry)(void*); //+0C
|
|
void *stack_res; //+10 initial $sp
|
|
void *gpReg; //+14
|
|
short currentPriority; //+18
|
|
short initPriority; //+1A
|
|
int waitSema, //+1C waitType?
|
|
semaId, //+20
|
|
wakeupCount, //+24
|
|
attr, //+28
|
|
option; //+2C
|
|
void (*entry_)(void*); //+30
|
|
int argc; //+34
|
|
char *argstring;//+38
|
|
void *stack;//+3C
|
|
int stackSize; //+40
|
|
int (*root)(); //+44
|
|
void* heap_base; //+48
|
|
};
|
|
|
|
struct threadCtx {
|
|
u128 gpr[25]; // at-t9, (skip r0,k0-ra)
|
|
u128 gp; //+190
|
|
u128 sp; //+1A0
|
|
u128 fp; //+1B0
|
|
u128 ra; //+1C0
|
|
u128 hi; //+1D0
|
|
u128 lo; //+1E0
|
|
u32 sa; //+1F0
|
|
u32 cf31;//+1F4
|
|
u32 acc; //+1F8
|
|
u32 res; //+1FC
|
|
u32 fpr[32];//+200
|
|
};
|
|
|
|
typedef struct tag_ARGS{
|
|
int argc;
|
|
char *argv[16];
|
|
char args[256];
|
|
} ARGS;
|
|
|
|
struct SemaParam {
|
|
int count;
|
|
int max_count;
|
|
int init_count;
|
|
int wait_threads;
|
|
int attr;
|
|
u32 option;
|
|
};
|
|
|
|
struct kSema { // internal struct
|
|
struct kSema *free;//+00
|
|
int count;//+04
|
|
int max_count;//+08
|
|
int attr;//+0C
|
|
int option;//+10
|
|
int wait_threads;//+14
|
|
struct TCB *wait_next,//+18
|
|
*wait_prev;//+1C
|
|
};
|
|
|
|
struct ll { struct ll *next, *prev; }; //linked list
|
|
|
|
//internal struct
|
|
struct IDhandl { //intc dmac handler
|
|
struct ll *next, //+00
|
|
*prev; //+04
|
|
int (*handler)(int); //+08
|
|
u32 gp; //+0C
|
|
void *arg; //+10
|
|
int flag; //+14
|
|
};
|
|
|
|
//internal struct
|
|
struct HCinfo{ //handler cause info
|
|
int count;
|
|
struct ll l;
|
|
};
|
|
|
|
extern u128 SavedSP;
|
|
extern u128 SavedRA;
|
|
extern u128 SavedAT;
|
|
extern u64 SavedT9;
|
|
|
|
extern eeRegs SavedRegs;
|
|
|
|
extern u32 excepRA;
|
|
extern u32 excepSP;
|
|
|
|
extern u32 (*table_CpuConfig[6])(u32);
|
|
extern void (*table_SYSCALL[0x80])();
|
|
|
|
extern void (*VCRTable[14])();
|
|
extern void (*VIntTable[8])();
|
|
extern void (*INTCTable[16])(int);
|
|
extern void (*DMACTable[16])(int);
|
|
|
|
extern int threadId;
|
|
extern int threadPrio;
|
|
extern int threadStatus;
|
|
|
|
extern u64 hvParam;
|
|
|
|
extern u32 machineType;
|
|
extern u64 gsIMR;
|
|
extern u32 memorySize;
|
|
|
|
extern u32 g_kernelstackend;
|
|
|
|
extern u32 dmac_CHCR[10];
|
|
|
|
extern int VSyncFlag0;
|
|
extern int VSyncFlag1;
|
|
|
|
extern int _HandlersCount;
|
|
extern struct ll handler_ll_free, *ihandlers_last, *ihandlers_first;
|
|
extern struct HCinfo intcs_array[14];
|
|
extern struct ll *dhandlers_last, *dhandlers_first;
|
|
extern struct HCinfo dmacs_array[15];
|
|
extern struct IDhandl pgifhandlers_array[161];
|
|
extern void (*sbus_handlers[32])(int ca);
|
|
|
|
extern int rcnt3Code;
|
|
extern int rcnt3TargetTable[0x142];
|
|
extern u8 rcnt3TargetNum[0x40];
|
|
extern int threads_count;
|
|
extern struct ll thread_ll_free;
|
|
extern struct ll thread_ll_priorities[128];
|
|
extern int semas_count;
|
|
extern struct kSema* semas_last;
|
|
|
|
extern struct TCB threads_array[256];
|
|
extern struct kSema semas_array[256];
|
|
|
|
extern char tagindex;
|
|
extern short transferscount;
|
|
extern struct TAG{
|
|
int id_qwc;
|
|
int addr;
|
|
int unk[2];
|
|
} tadrptr[31];
|
|
extern int extrastorage[(16/4) * 8][31];
|
|
|
|
extern int osdConfigParam;
|
|
|
|
// syscalls
|
|
// Every syscall is officially prefixed with _ (to avoid clashing with ps2sdk)
|
|
void _SetSYSCALL(int num, int address);
|
|
int __EnableIntc(int ch);
|
|
int __DisableIntc(int ch);
|
|
int __EnableDmac(int ch);
|
|
int __DisableDmac(int ch);
|
|
void *_SetVTLBRefillHandler(int cause, void (*handler)());
|
|
void *_SetVCommonHandler(int cause, void (*handler)());
|
|
void *_SetVInterruptHandler(int cause, void (*handler)());
|
|
void _PSMode();
|
|
u32 _MachineType();
|
|
u32 _SetMemorySize(u32 size);
|
|
u32 _GetMemorySize();
|
|
u64 _GsGetIMR();
|
|
u64 _GsPutIMR(u64 val);
|
|
int _Exit(); // 3
|
|
void _RFU___(); // 0
|
|
void _SetVSyncFlag(int flag0, int flag1);
|
|
int _AddIntcHandler(int cause, int (*handler)(int), int next, void *arg);
|
|
int _AddIntcHandler2(int cause, int (*handler)(int), int next, void *arg);
|
|
int _RemoveIntcHandler(int cause, int hid);
|
|
int _AddDmacHandler(int cause, int (*handler)(int), int next, void *arg);
|
|
int _AddDmacHandler2(int cause, int (*handler)(int), int next, void *arg);
|
|
int _RemoveDmacHandler(int code, int hid);
|
|
int _AddSbusIntcHandler(int cause, void (*handler)(int ca));
|
|
int _RemoveSbusIntcHandler(int cause);
|
|
int _Interrupt2Iop(int cause);
|
|
void _RFU005();
|
|
int _GetCop0(int reg);
|
|
int _ExecPS2(void *, void *, int, char **);
|
|
int _DeleteThread(int tid);
|
|
int _StartThread(int tid, void *arg);
|
|
int _ExitThread();
|
|
int _ExitDeleteThread();
|
|
int _SleepThread();
|
|
int _WakeupThread(int tid);
|
|
int _WaitSema(int sid);
|
|
void _ChangeThreadPriority(int tid, int prio);
|
|
int _CreateThread(struct ThreadParam *param);
|
|
int _iChangeThreadPriority(int tid, int prio);
|
|
int _GetThreadId();
|
|
int _ReferThreadStatus(int tid, struct ThreadParam *info);
|
|
int _iWakeupThread(int tid);
|
|
int _SuspendThread(int thid);
|
|
int _iResumeThread(int tid);
|
|
int _CancelWakeupThread(int tid);
|
|
int _CreateEventFlag();
|
|
int _CreateSema(struct SemaParam *sema);
|
|
int _RFU073(int sid);
|
|
int _iSignalSema(int sid);
|
|
int _PollSema(int sid);
|
|
int _ReferSemaStatus(int sid, struct SemaParam *sema);
|
|
int _DeleteEventFlag();
|
|
void*_InitializeMainThread(u32 gp, void *stack, int stack_size,
|
|
char *args, int root);
|
|
void *_InitializeHeapArea(void *heap_base, int heap_size);
|
|
void *_EndOfHeap();
|
|
int _LoadPS2Exe(char *filename, int argc, char **argv);
|
|
int _ExecOSD(int argc, char **argv);
|
|
void _SifSetDChain();
|
|
void _SifStopDma();
|
|
u32 _SifSetDma(SifDmaTransfer_t *sdd, int len);
|
|
void _SetGsCrt(short arg0, short arg1, short arg2); // 2
|
|
void _GetGsHParam(int *p0, int *p1, int *p2, int *p3);
|
|
int _GetGsVParam();
|
|
void _SetGsVParam(int VParam);
|
|
void _GetOsdConfigParam(int *result);
|
|
void _SetOsdConfigParam(int *param);
|
|
int _ResetEE(int init); // 1
|
|
int _TlbWriteRandom(u32 PageMask, u32 EntryHi, u32 EntryLo0, u32 EntryLo1);
|
|
int _SetAlarm(short a0, int a1, int a2);
|
|
void _ReleaseAlarm();
|
|
int _TerminateThread(int tid);
|
|
void _RotateThreadReadyQueue(int prio);
|
|
int _iTerminateThread(int tid);
|
|
int _DisableDispatchThread();
|
|
int _EnableDispatchThread();
|
|
int _iRotateThreadReadyQueue(int prio);
|
|
void _ReleaseWaitThread(int tid);
|
|
int _iReleaseWaitThread(int tid);
|
|
int _ResumeThread(int tid);
|
|
int _iResumeThread(int tid);
|
|
void _JoinThread();
|
|
int _DeleteSema(int sid);
|
|
int _iDeleteSema(int sid);
|
|
void _SignalSema(int sid);
|
|
void _SetGsHParam(int a0, int a1, int a2, int a3);
|
|
int _SetEventFlag(int ef, u32 bits); // bits is EF_X
|
|
int _iSetEventFlag(int ef, u32 bits);
|
|
void _EnableIntcHandler(u32 id);
|
|
void _DisableIntcHandler(u32 id);
|
|
void _EnableDmacHandler(u32 id);
|
|
void _DisableDmacHandler(u32 id);
|
|
void _KSeg0(u32 arg);
|
|
int _EnableCache(int cache);
|
|
int _DisableCache(int cache);
|
|
void _FlushCache(int op);
|
|
void _105(int op1, int op2);
|
|
u32 _CpuConfig(u32 op);
|
|
void _SetCPUTimerHandler(void (*handler)());
|
|
void _SetCPUTimer(int compval);
|
|
void _SetPgifHandler(void (*handler)(int));
|
|
void _print();
|
|
int _SifDmaStat(int id);
|
|
|
|
int _SifGetReg(int reg);
|
|
int _SifSetReg(int reg, u32 val);
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// KERNEL BSS //
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#endif
|
|
|