fps2bios: more work on the EE kernel

This commit is contained in:
zerofrog
2008-01-05 14:17:17 +00:00
parent 057efdf878
commit a351608ac8
6 changed files with 818 additions and 797 deletions

View File

@@ -42,7 +42,7 @@ all: eeload
LDFLAGS = -L$(PS2LIB)/ee/lib
LDADD = -lmc -lpad -lc -lkernel
OBJECTS = eeirq.o eedata.o eekernel.o eeinit.o eeelf.o eedebug.o romdir.o
OBJECTS = eeirq.o eedata.o eekernel.o eeinit.o eeload.o eeelf.o eedebug.o romdir.o
eeload: $(OBJECTS)
$(EELD) -Wl,--oformat,binary,--Map,eeload.map -T linkfile $(EECFLAGS) $(OBJECTS) $(LDFLAGS) $(LDADD) -o ../../build/EELOAD

View File

@@ -16,8 +16,14 @@ u128 SavedRA __attribute((aligned(16)));
u128 SavedAT __attribute((aligned(16)));
u64 SavedT9 __attribute((aligned(16)));
u32 excepRA=0;
u32 excepSP=0;
u32 _CpuConfig_0(u32);
u32 _CpuConfig_1(u32);
u32 _CpuConfig_2(u32);
u32 _CpuConfig_3(u32);
u32 _CpuConfig_4(u32);
u32 _CpuConfig_5(u32);
u32 (*table_CpuConfig[6])(u32) = {_CpuConfig_0, _CpuConfig_1, _CpuConfig_2,
_CpuConfig_3, _CpuConfig_4, _CpuConfig_5};
u32 dmac_CHCR[10] = {
0xB0008000,
@@ -85,14 +91,14 @@ void (*table_SYSCALL[0x80])() = {
(void (*))__DisableIntc,
(void (*))__EnableDmac,
(void (*))__DisableDmac,
(void (*))__SetAlarm, // 0x18
(void (*))__ReleaseAlarm,
(void (*))_SetAlarm, // 0x18
(void (*))_ReleaseAlarm,
(void (*))__EnableIntc,
(void (*))__DisableIntc,
(void (*))__EnableDmac, // 0x1C
(void (*))__DisableDmac,
(void (*))__SetAlarm,
(void (*))__ReleaseAlarm,
(void (*))_SetAlarm,
(void (*))_ReleaseAlarm,
(void (*))_CreateThread, // 0x20
(void (*))_DeleteThread,
(void (*))_StartThread,
@@ -134,7 +140,7 @@ void (*table_SYSCALL[0x80])() = {
(void (*))_PollSema,
(void (*))_ReferSemaStatus,
(void (*))_ReferSemaStatus,
(void (*))_RFU073,
(void (*))_iDeleteSema,
(void (*))_SetOsdConfigParam,
(void (*))_GetOsdConfigParam,
(void (*))_GetGsHParam,
@@ -168,11 +174,11 @@ void (*table_SYSCALL[0x80])() = {
(void (*))_FlushCache,
(void (*))_105,
(void (*))_CpuConfig,
(void (*))_sceSifStopDma, //_sceSifStopDma,
(void (*))_SifStopDma, //_sceSifStopDma,
(void (*))_SetCPUTimerHandler,
(void (*))_SetCPUTimer,
(void (*))0,
(void (*))0,
(void (*))0,//_SetOsdConfigParam2,
(void (*))0,//_GetOsdConfigParam2,
(void (*))_GsGetIMR, // 0x70
(void (*))_GsPutIMR,
(void (*))_SetPgifHandler,

View File

@@ -3,7 +3,8 @@
#include <tamtypes.h>
#include <stdio.h>
#include "eeload.h"
#include "eekernel.h"
#include "eeirq.h"
void InitializeGS();
void InitializeGIF();
@@ -235,7 +236,7 @@ void InitializeFPU()
"mtc1 $0, $29\n"
"mtc1 $0, $30\n"
"mtc1 $0, $31\n"
"adda.s $0, $1\n"
"adda.s $f0, $f1\n"
"sync\n"
"ctc1 $0, $31\n"
);
@@ -259,7 +260,8 @@ void InitializeUserMemory(u32 base)
u128 *memsz;
u128 *p = (u128*)base;
for (memsz=(u128*)_GetMemorySize(); p<memsz; p++) *p = 0;
for (memsz=(u128*)_GetMemorySize(); p<memsz; p++)
*p = 0;
}
////////////////////////////////////////////////////////////////////
@@ -366,28 +368,6 @@ void _TlbSet(u32 Index, u32 PageMask, u32 EntryHi, u32 EntryLo0, u32 EntryLo1) {
);
}
int _SemasInit() {
int i;
// memset(bSema, 0, sizeof(bSema));
for (i=0; i<256; i++) {
semas_array[i].free = &semas_array[i+1];
semas_array[i].count = -1;
semas_array[i].wait_threads = 0;
semas_array[i].wait_next = (struct TCB*)&semas_array[i].wait_next;
semas_array[i].wait_prev = (struct TCB*)&semas_array[i].wait_next;
}
semas_array[255].free = 0;
semas_last = semas_array;
semas_count = 0;
return 256;
}
void TlbInit() {
int i, last;
u32 *ptr;
@@ -442,21 +422,10 @@ void TlbInit() {
__printf("Ok\n");
}
////////////////////////////////////////////////////////////////////
//80001630
////////////////////////////////////////////////////////////////////
void DefaultINTCHandler(int n)
{
//TODO
}
////////////////////////////////////////////////////////////////////
//80001798
////////////////////////////////////////////////////////////////////
void DefaultDMACHandler(int n)
{
//TODO
}
void DefaultINTCHandler(int n);
void DefaultDMACHandler(int n);
void rcnt3Handler();
void sbusHandler();
////////////////////////////////////////////////////////////////////
//80002050
@@ -469,8 +438,8 @@ int InitPgifHandler() {
for (i=0; i<15; i++) {
intcs_array[i].count = 0;
// intcs_array[-1] = ihandlers_last,first
intcs_array[i-1].l.prev = &intcs_array[i-1].l.next;
intcs_array[i-1].l.next = &intcs_array[i-1].l.next;
intcs_array[i-1].l.prev = (struct ll*)&intcs_array[i-1].l.next;
intcs_array[i-1].l.next = (struct ll*)&intcs_array[i-1].l.next;
setINTCHandler(i, DefaultINTCHandler);
}
@@ -485,8 +454,8 @@ int InitPgifHandler() {
for (i=0; i<16; i++) {
dmacs_array[i].count = 0;
dmacs_array[i-1].l.prev = &dmacs_array[i-1].l.next;
dmacs_array[i-1].l.next = &dmacs_array[i-1].l.next;
dmacs_array[i-1].l.prev = (struct ll*)&dmacs_array[i-1].l.next;
dmacs_array[i-1].l.next = (struct ll*)&dmacs_array[i-1].l.next;
setDMACHandler(i, DefaultDMACHandler);
}
@@ -515,8 +484,8 @@ int InitPgifHandler2()
if(i != 1 ) {
intcs_array[i].count = 0;
// intcs_array[-1] = ihandlers_last,first
intcs_array[i-1].l.prev = &intcs_array[i-1].l.next;
intcs_array[i-1].l.next = &intcs_array[i-1].l.next;
intcs_array[i-1].l.prev = (struct ll*)&intcs_array[i-1].l.next;
intcs_array[i-1].l.next = (struct ll*)&intcs_array[i-1].l.next;
setINTCHandler(i, DefaultINTCHandler);
}
}
@@ -525,8 +494,8 @@ int InitPgifHandler2()
for (i=0; i<16; i++) {
dmacs_array[i].count = 0;
dmacs_array[i-1].l.prev = &dmacs_array[i-1].l.next;
dmacs_array[i-1].l.next = &dmacs_array[i-1].l.next;
dmacs_array[i-1].l.prev = (struct ll*)&dmacs_array[i-1].l.next;
dmacs_array[i-1].l.next = (struct ll*)&dmacs_array[i-1].l.next;
setDMACHandler(i, DefaultDMACHandler);
}

View File

@@ -32,128 +32,3 @@ void Kmemcpy(void *dest, const void *src, int n) {
}
}
int _ResetSif1()
{
sif1tagdata = 0xFFFF001E;
//*(int*)0xa0001e330 = 0x20000000;
//*(int*)0xa0001e334 = (u32)ptag&0x0fffffff;
D6_QWC = 0;
D6_TAG = (u32)&sif1tagdata&0x0fffffff;
}
void SifDmaInit()
{
int msflg;
memset(sifEEbuff, 0, sizeof(sifEEbuff));
memset(sifRegs, 0, sizeof(sifRegs));
*(u32*)0xB000F260 = 0xFF;
D5_CHCR = 0;
D6_CHCR = 0;
_SifSetDChain();
*(u32*)0xB000F200 = sifEEbuff;
__printf("MSFLG = 0x10000\n");
SBUS_MSFLG = 0x10000;
msflg = SBUS_MSFLG;
_ResetSif1();
_SifSetReg(1, 0);
while (!(_SifGetReg(4) & 0x10000)) { __asm__ ("nop\nnop\nnop\nnop\n"); }
sifIOPbuff = *(u32*)0xB000F210;
SBUS_MSFLG = 0x20000;
SBUS_MSFLG;
}
int _TlbWriteRandom(u32 PageMask, u32 EntryHi, u32 EntryLo0, u32 EntryLo1) {
if ((EntryHi >> 24) != 4) return -1;
__asm__ (
"mfc0 $2, $1\n"
"mtc0 $2, $0\n"
"mtc0 $4, $5\n"
"mtc0 $5, $10\n"
"mtc0 $6, $2\n"
"mtc0 $7, $3\n"
"sync\n"
"tlbwi\n"
"sync\n"
);
}
int _sifGetMSFLG() {
u32 msflg;
for (;;) {
msflg = SBUS_MSFLG;
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
if (msflg == SBUS_MSFLG) return msflg;
}
}
int _sifGetSMFLG() {
u32 smflg;
for (;;) {
smflg = SBUS_SMFLG;
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm__ ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
if (smflg == SBUS_SMFLG) return smflg;
}
}
int _SifSetReg(int reg, u32 val) {
__printf("%s: reg=%d; val=%x\n", __FUNCTION__, reg, val);
if (reg == 1) {
*(u32*)0xB000F200 = val;
return *(u32*)0xB000F200;
} else
if (reg == 3) {
SBUS_MSFLG = val;
return _sifGetMSFLG();
} else
if (reg == 4) {
SBUS_SMFLG = val;
return _sifGetSMFLG();
} else
if (reg >= 0) {
return 0;
}
reg&= 0x7FFFFFFF;
if (reg >= 32) return 0;
sifRegs[reg] = val;
return val;
}
int _SifGetReg(int reg) {
//__printf("%s: reg=%x\n", __FUNCTION__, reg);
if (reg == 1) {
return *(u32*)0xB000F200;
} else
if (reg == 2) {
return *(u32*)0xB000F210;
} else
if (reg == 3) {
return _sifGetMSFLG();
} else
if (reg == 4) {
return _sifGetSMFLG();
} else
if (reg >= 0) {
return 0;
}
reg&= 0x7FFFFFFF;
if (reg >= 32) return 0;
//__printf("ret=%x\n", sifRegs[reg]);
return sifRegs[reg];
}

File diff suppressed because it is too large Load Diff

View File

@@ -112,6 +112,36 @@
//#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
@@ -146,7 +176,7 @@ struct ThreadParam {
int currentPriority;
u32 attr;
u32 option;
int waitType;
int waitSema; // waitType?
int waitId;
int wakeupCount;
};
@@ -160,7 +190,7 @@ struct TCB { //internal struct
void *gpReg; //+14
short currentPriority; //+18
short initPriority; //+1A
int waitSema, //+1C
int waitSema, //+1C waitType?
semaId, //+20
wakeupCount, //+24
attr, //+28
@@ -171,7 +201,7 @@ struct TCB { //internal struct
void *stack;//+3C
int stackSize; //+40
int (*root)(); //+44
int heap_base; //+48
void* heap_base; //+48
};
struct threadCtx {
@@ -205,25 +235,26 @@ struct SemaParam {
};
struct kSema { // internal struct
struct kSema *free;
int count;
int max_count;
int attr;
int option;
int wait_threads;
struct TCB *wait_next,
*wait_prev;
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, *prev;
int (*handler)(int);
u32 gp;
void *arg;
int flag;
struct ll *next, //+00
*prev; //+04
int (*handler)(int); //+08
u32 gp; //+0C
void *arg; //+10
int flag; //+14
};
//internal struct
@@ -232,7 +263,6 @@ struct HCinfo{ //handler cause info
struct ll l;
};
extern u128 SavedSP;
extern u128 SavedRA;
extern u128 SavedAT;
@@ -243,6 +273,7 @@ extern eeRegs SavedRegs;
extern u32 excepRA;
extern u32 excepSP;
extern u32 (*table_CpuConfig[6])(u32);
extern void (*table_SYSCALL[0x80])();
extern void (*VCRTable[14])();
@@ -275,14 +306,14 @@ extern struct HCinfo dmacs_array[15];
extern struct IDhandl pgifhandlers_array[161];
extern void (*sbus_handlers[32])(int ca);
extern int rcnt3Mode;
extern int rcnt3TargetTable[0x140];
extern char rcnt3TargetNum;
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 int semas_last;
extern struct kSema* semas_last;
extern struct TCB threads_array[256];
extern struct kSema semas_array[256];
@@ -298,15 +329,6 @@ extern int extrastorage[(16/4) * 8][31];
extern int osdConfigParam;
extern u32 sifEEbuff[32];
extern u32 sifRegs[32];
extern u32 sifIOPbuff;
extern u32 sif1tagdata;
// internal functions
void Kmemcpy(void *dest, const void *src, int n);
void SifDmaInit();
// syscalls
// Every syscall is officially prefixed with _ (to avoid clashing with ps2sdk)
void _SetSYSCALL(int num, int address);
@@ -319,8 +341,8 @@ void *_SetVCommonHandler(int cause, void (*handler)());
void *_SetVInterruptHandler(int cause, void (*handler)());
void _PSMode();
u32 _MachineType();
long _SetMemorySize(long size);
long _GetMemorySize();
u32 _SetMemorySize(u32 size);
u32 _GetMemorySize();
u64 _GsGetIMR();
u64 _GsPutIMR(u64 val);
int _Exit(); // 3
@@ -348,7 +370,6 @@ int _WaitSema(int sid);
void _ChangeThreadPriority(int tid, int prio);
int _CreateThread(struct ThreadParam *param);
int _iChangeThreadPriority(int tid, int prio);
int _iRotateThreadReadyQueue(int prio);
int _GetThreadId();
int _ReferThreadStatus(int tid, struct ThreadParam *info);
int _iWakeupThread(int tid);
@@ -362,15 +383,15 @@ int _iSignalSema(int sid);
int _PollSema(int sid);
int _ReferSemaStatus(int sid, struct SemaParam *sema);
int _DeleteEventFlag();
char *_InitializeMainThread(int gp, void *stack, int stack_size,
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(const char *filename, int argc, char **argv);
int _LoadPS2Exe(char *filename, int argc, char **argv);
int _ExecOSD(int argc, char **argv);
void _sceSifSetDChain();
void _sceSifStopDma();
void _sceSifSetDma(SifDmaTransfer_t *sdd, int len);
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();
@@ -379,45 +400,41 @@ void _GetOsdConfigParam(int *result);
void _SetOsdConfigParam(int *param);
int _ResetEE(int init); // 1
int _TlbWriteRandom(u32 PageMask, u32 EntryHi, u32 EntryLo0, u32 EntryLo1);
void __SetAlarm();
void __ReleaseAlarm();
int _SetAlarm(short a0, int a1, int a2);
void _ReleaseAlarm();
int _TerminateThread(int tid);
void _RotateThreadReadyQueue(int prio);
int _iTerminateThread(int tid);
void _DisableDispatchThread();
void _EnableDispatchThread();
void _RotateThreadReadyQueue();
int _DisableDispatchThread();
int _EnableDispatchThread();
int _iRotateThreadReadyQueue(int prio);
void _ReleaseWaitThread();
void _iReleaseWaitThread();
void _ResumeThread();
void _ReleaseWaitThread(int tid);
int _iReleaseWaitThread(int tid);
int _ResumeThread(int tid);
int _iResumeThread(int tid);
void _JoinThread();
void _DeleteSema();
void _SignalSema();
void _SetGsHParam();
void _SetEventFlag();
void _iSetEventFlag();
void _EnableIntcHandler();
void _DisableIntcHandler();
void _EnableDmacHandler();
void _DisableDmacHandler();
void _KSeg0();
void _EnableCache();
void _DisableCache();
void _FlushCache();
void _105();
void _CpuConfig();
void _SetCPUTimerHandler();
void _SetCPUTimer();
void _SetPgifHandler();
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();
void _sceSifDmaStat();
int _sceSifSetReg(int reg, u32 val);
int _sceSifGetReg(int reg);
int _SifDmaStat(int id);
void _SifDmaStat();
void _SifSetDma(SifDmaTransfer_t *sdd, int len);
void _SifSetDChain();
int _SifGetReg(int reg);
int _SifSetReg(int reg, u32 val);