ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
ExecPS2.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Licenced under Academic Free License version 2.0
7 # Review ps2sdk README & LICENSE files for further details.
8 */
9 
10 #include <kernel.h>
11 
12 #include "ExecPS2.h"
13 
14 static int *p_ThreadID=(int*)0x800125EC; //Pointer to a variable containing the running thread's ID.
15 static int *p_ThreadStatus=(int*)0x800125F4; //Pointer to a variable containing the running thread's status.
16 static int (*p_CancelWakeupThread)(int ThreadID)=(void*)0x80004970;
17 static int (*p_ChangeThreadPriority)(int ThreadID, int priority)=(void*)0x80004288;
18 static int (*p_InitPgifHandler2)(void)=(void*)0x800021b0;
19 static int (*p_InitSemaphores)(void)=(void*)0x80004e68;
20 static int (*p_DeleteThread)(int thread_id)=(void*)0x80003f00;
21 static int (*p_TerminateThread)(int ThreadID)=(void*)0x80003e00;
22 static struct TCB *p_TCBs=(struct TCB *)0x80017400;
23 static void (*p_InitializeINTC)(int interrupts)=(void*)0x8000b8d0;
24 static void (*p_InitializeTIMER)(void)=(void*)0x8000b900;
25 static void (*p_InitializeFPU)(void)=(void*)0x8000b7a8;
26 static void (*p_InitializeScratchPad)(void)=(void*)0x8000b840;
27 static int (*p_ResetEE)(int flags)=(void*)0x8000ad68;
28 static void (*p_InitializeGS)(void)=(void*)0x8000aa60;
29 static void (*p_SetGSCrt)(unsigned short int interlace, unsigned short int mode, unsigned short int ffmd)=(void*)0x8000a060;
30 
31 #ifndef REUSE_EXECPS2
32 
33 static void (*p_FlushDCache)(void)=(void*)0x80002a80;
34 static void (*p_FlushICache)(void)=(void*)0x80002ac0;
35 static char *(*p_eestrcpy)(char* dst, const char* src)=(void*)0x80005560;
36 //static void *p_unk80012600=(void*)0x80012600; //Not sure what this is, as it isn't used by the patch.
37 static char *p_ArgsBuffer=(char*)0x80012608;
38 
39 #else
40 
41 static void* (*p_ExecPS2)(void *entry, void *gp, int argc, char *argv[])=(void*)0x800057E8; //Not part of the SONY patch. See below.
42 
43 #endif
44 
45 //Taken from PCSX2's FPS2BIOS
46 struct TCB { //internal struct
47  struct TCB *next; //+00
48  struct TCB *prev; //+04
49  int status;//+08
50  void (*entry)(void*); //+0C
51  void *stack_res; //+10 initial $sp
52  void *gpReg; //+14
53  short currentPriority; //+18
54  short initPriority; //+1A
55  int waitSema, //+1C waitType?
56  semaId, //+20
57  wakeupCount, //+24
58  attr, //+28
59  option; //+2C
60  void (*entry_)(void*); //+30
61  int argc; //+34
62  char *argstring;//+38
63  void *stack;//+3C
64  int stackSize; //+40
65  int (*root)(); //+44
66  void* heap_base; //+48
67 };
68 
69 static inline void SoftPeripheralEEReset(void){
70  *(volatile unsigned int *)0x1000f000=4;
71  while((*(volatile unsigned int *)0x1000f000&4)==0){};
72  *(volatile unsigned int *)0x1000f000=4;
73 
75  p_SetGSCrt(1, 2, 1); //Interlaced, NTSC, field mode.
76  p_InitializeINTC(0xdffd);
78  p_ResetEE(0x7F);
81 }
82 
83 void *ExecPS2Patch(void *EntryPoint, void *gp, int argc, char *argv[]){
84  int i, CurrentThreadID;
85  struct TCB *tcb;
86 #ifndef REUSE_EXECPS2
87  char *ArgsPtr;
88 #endif
89 
90  CurrentThreadID=*p_ThreadID;
91  p_CancelWakeupThread(CurrentThreadID);
92  p_ChangeThreadPriority(CurrentThreadID, 0);
93 
94  //Like IOP kernels, the first thread is the idle thread.
95  for(i=1,tcb=&p_TCBs[1]; i<MAX_THREADS; i++,tcb++){
96  if(tcb->status!=0 && i!=CurrentThreadID){
98 
99  p_DeleteThread(i);
100  }
101  }
102 
105 
106  *p_ThreadStatus=0;
108 
109 #ifdef REUSE_EXECPS2
110  //Unlike the Sony patch, why don't we just reuse the original function in the kernel?
111  return p_ExecPS2(EntryPoint, gp, argc, argv);
112 #else
113  for(i=0,ArgsPtr=p_ArgsBuffer; i<argc; i++){
114  ArgsPtr=p_eestrcpy(ArgsPtr, argv[i]);
115  }
116 
117  tcb=&p_TCBs[CurrentThreadID];
118  tcb->argstring=p_ArgsBuffer;
119  tcb->argc=argc;
120  tcb->entry=EntryPoint;
121  tcb->entry_=EntryPoint;
122  tcb->gpReg=gp;
123  tcb->initPriority=0;
124  tcb->currentPriority=0;
125  tcb->wakeupCount=0;
126  tcb->waitSema=0;
127  tcb->semaId=0;
128 
129  p_FlushICache();
130  p_FlushDCache();
131 
132  return EntryPoint;
133 #endif
134 }
135 
static int(* p_ResetEE)(int flags)
Definition: ExecPS2.c:27
static int * p_ThreadID
Definition: ExecPS2.c:14
static void(* p_InitializeINTC)(int interrupts)
Definition: ExecPS2.c:23
static char * p_ArgsBuffer
Definition: ExecPS2.c:37
static void(* p_InitializeGS)(void)
Definition: ExecPS2.c:28
static void(* p_SetGSCrt)(unsigned short int interlace, unsigned short int mode, unsigned short int ffmd)
Definition: ExecPS2.c:29
static struct TCB * p_TCBs
Definition: ExecPS2.c:22
static int * p_ThreadStatus
Definition: ExecPS2.c:15
static int(* p_InitSemaphores)(void)
Definition: ExecPS2.c:19
static void SoftPeripheralEEReset(void)
Definition: ExecPS2.c:69
static void(* p_FlushDCache)(void)
Definition: ExecPS2.c:33
static int(* p_DeleteThread)(int thread_id)
Definition: ExecPS2.c:20
static char *(* p_eestrcpy)(char *dst, const char *src)
Definition: ExecPS2.c:35
static void(* p_FlushICache)(void)
Definition: ExecPS2.c:34
static int(* p_TerminateThread)(int ThreadID)
Definition: ExecPS2.c:21
static int(* p_InitPgifHandler2)(void)
Definition: ExecPS2.c:18
static void(* p_InitializeScratchPad)(void)
Definition: ExecPS2.c:26
static void(* p_InitializeTIMER)(void)
Definition: ExecPS2.c:24
static void(* p_InitializeFPU)(void)
Definition: ExecPS2.c:25
static int(* p_ChangeThreadPriority)(int ThreadID, int priority)
Definition: ExecPS2.c:17
static int(* p_CancelWakeupThread)(int ThreadID)
Definition: ExecPS2.c:16
void * ExecPS2Patch(void *EntryPoint, void *gp, int argc, char *argv[])
Definition: ExecPS2.c:83
#define gp
Definition: as_reg_compat.h:84
#define THS_DORMANT
Definition: kernel.h:244
#define MAX_THREADS
Definition: kernel.h:68
s32 mode
Definition: rpc_client.c:15
Definition: ExecPS2.c:46
int stackSize
Definition: ExecPS2.c:64
struct TCB * next
Definition: ExecPS2.c:47
short initPriority
Definition: ExecPS2.c:54
int semaId
Definition: ExecPS2.c:56
void * gpReg
Definition: ExecPS2.c:52
int status
Definition: ExecPS2.c:49
void(* entry_)(void *)
Definition: ExecPS2.c:60
int argc
Definition: ExecPS2.c:61
int(* root)()
Definition: ExecPS2.c:65
int wakeupCount
Definition: ExecPS2.c:57
struct TCB * prev
Definition: ExecPS2.c:48
int option
Definition: ExecPS2.c:59
char * argstring
Definition: ExecPS2.c:62
short currentPriority
Definition: ExecPS2.c:53
int waitSema
Definition: ExecPS2.c:55
void(* entry)(void *)
Definition: ExecPS2.c:50
int attr
Definition: ExecPS2.c:58
void * heap_base
Definition: ExecPS2.c:66
void * stack
Definition: ExecPS2.c:63
void * stack_res
Definition: ExecPS2.c:51