29 #define ExitHandler() __asm__ __volatile__("sync\nei\n")
32 #define EE_SYNC() __asm__ __volatile__("sync")
33 #define EE_SYNCL() __asm__ __volatile__("sync.l")
34 #define EE_SYNCP() __asm__ __volatile__("sync.p")
36 #define UNCACHED_SEG(x) \
37 ((void *)(((u32)(x)) | 0x20000000))
39 #define IS_UNCACHED_SEG(x) \
40 (((u32)(x)) & 0x20000000)
43 ((void *)(((u32)(x)) | 0x30000000))
45 #define PUSHDATA(t, x, v, l) \
49 #define POPDATA(t, x, v, l) \
53 #define ALIGNED(x) __attribute__((aligned((x))))
56 extern void *ChangeGP(
void *gp);
57 extern void SetGP(
void *gp);
58 extern void *GetGP(
void);
61 #define SetModuleGP() ChangeGP(&_gp)
71 #define MAX_THREADS 256 // A few will be used for the kernel patches. Thread 0 is always the idle thread.
72 #define MAX_SEMAPHORES 256 // A few will be used for the kernel patches.
73 #define MAX_PRIORITY 128
74 #define MAX_HANDLERS 128
78 #define WRITEBACK_DCACHE 0
79 #define INVALIDATE_DCACHE 1
80 #define INVALIDATE_ICACHE 2
81 #define INVALIDATE_CACHE 3 // Invalidate both data & instruction caches.
103 #define kINTC_GS INTC_GS
104 #define kINTC_SBUS INTC_SBUS
105 #define kINTC_VBLANK_START INTC_VBLANK_S
106 #define kINTC_VBLANK_END INTC_VBLANK_E
107 #define kINTC_VIF0 INTC_VIF0
108 #define kINTC_VIF1 INTC_VIF1
109 #define kINTC_VU0 INTC_VU0
110 #define kINTC_VU1 INTC_VU1
111 #define kINTC_IPU INTC_IPU
112 #define kINTC_TIMER0 INTC_TIM0
113 #define kINTC_TIMER1 INTC_TIM1
134 #define INIT_DMAC 0x01
135 #define INIT_VU1 0x02
136 #define INIT_VIF1 0x04
137 #define INIT_GIF 0x08
138 #define INIT_VU0 0x10
139 #define INIT_VIF0 0x20
140 #define INIT_IPU 0x40
142 static inline void nopdelay(
void)
147 __asm__ __volatile__(
"nop\nnop\nnop\nnop\nnop\n");
151 static inline int ee_get_opmode(
void)
157 return ((status >> 3) & 3);
160 static inline int ee_set_opmode(u32 opmode)
168 return ((status >> 3) & 3);
171 static inline int ee_kmode_enter()
182 static inline int ee_kmode_exit()
210 int initial_priority;
211 int current_priority;
219 #define THS_READY 0x02
220 #define THS_WAIT 0x04
221 #define THS_SUSPEND 0x08
222 #define THS_WAITSUSPEND 0x0c
223 #define THS_DORMANT 0x10
226 #define TSW_NONE 0 // Thread is not in WAIT state
238 int initial_priority;
239 int current_priority;
249 CPU_CONFIG_ENABLE_DIE = 0,
250 CPU_CONFIG_ENABLE_ICE,
251 CPU_CONFIG_ENABLE_DCE,
252 CPU_CONFIG_DISBLE_DIE,
253 CPU_CONFIG_DISBLE_ICE,
254 CPU_CONFIG_DISBLE_DCE
258 #define CPU_DATA_CACHE 1
259 #define CPU_INSTRUCTION_CACHE 2
295 extern void _InitSys(
void);
297 extern void TerminateLibrary(
void);
300 extern int InitThread(
void);
302 extern s32 iWakeupThread(s32 thread_id);
303 extern s32 iRotateThreadReadyQueue(s32 priority);
304 extern s32 iSuspendThread(s32 thread_id);
307 extern void InitTLBFunctions(
void);
309 extern void InitTLB(
void);
311 extern s32 ExecPS2(
void *entry,
void *gp,
int num_args,
char *args[]);
312 extern void LoadExecPS2(
const char *filename, s32 num_args,
char *args[])
__attribute__((noreturn));
313 extern void ExecOSD(
int num_args,
char *args[])
__attribute__((noreturn));
316 extern void InitAlarm(
void);
319 extern void InitExecPS2(
void);
320 extern void InitOsd(
void);
322 extern int PatchIsNeeded(
void);
325 extern void InitDebug(
void);
328 extern int DIntr(
void);
329 extern int EIntr(
void);
331 extern int EnableIntc(
int intc);
332 extern int DisableIntc(
int intc);
333 extern int EnableDmac(
int dmac);
334 extern int DisableDmac(
int dmac);
336 extern int iEnableIntc(
int intc);
337 extern int iDisableIntc(
int intc);
338 extern int iEnableDmac(
int dmac);
339 extern int iDisableDmac(
int dmac);
341 extern void SyncDCache(
void *start,
void *end);
342 extern void iSyncDCache(
void *start,
void *end);
343 extern void InvalidDCache(
void *start,
void *end);
344 extern void iInvalidDCache(
void *start,
void *end);
347 extern void ResetEE(u32 init_bitfield);
348 extern void SetGsCrt(s16 interlace, s16 pal_ntsc, s16 field);
350 extern void _LoadExecPS2(
const char *filename, s32 num_args,
char *args[])
__attribute__((noreturn));
351 extern s32 _ExecPS2(
void *entry,
void *gp,
int num_args,
char *args[]);
352 extern void RFU009(u32 arg0, u32 arg1);
353 extern s32 AddSbusIntcHandler(s32 cause,
void (*handler)(
int call));
354 extern s32 RemoveSbusIntcHandler(s32 cause);
355 extern s32 Interrupt2Iop(s32 cause);
356 extern void SetVTLBRefillHandler(s32 handler_num,
void *handler_func);
357 extern void SetVCommonHandler(s32 handler_num,
void *handler_func);
358 extern void SetVInterruptHandler(s32 handler_num,
void *handler_func);
359 extern s32 AddIntcHandler(s32 cause, s32 (*handler_func)(s32 cause), s32 next);
360 extern s32 AddIntcHandler2(s32 cause, s32 (*handler_func)(s32 cause,
void *arg,
void *addr), s32 next,
void *arg);
361 extern s32 RemoveIntcHandler(s32 cause, s32 handler_id);
362 extern s32 AddDmacHandler(s32 channel, s32 (*handler)(s32 channel), s32 next);
363 extern s32 AddDmacHandler2(s32 channel, s32 (*handler)(s32 channel,
void *arg,
void *addr), s32 next,
void *arg);
364 extern s32 RemoveDmacHandler(s32 channel, s32 handler_id);
365 extern s32 _EnableIntc(s32 cause);
366 extern s32 _DisableIntc(s32 cause);
367 extern s32 _EnableDmac(s32 channel);
368 extern s32 _DisableDmac(s32 channel);
371 extern s32 SetAlarm(u16 time,
void (*callback)(s32 alarm_id, u16 time,
void *common),
void *common);
372 extern s32 _SetAlarm(u16 time,
void (*callback)(s32 alarm_id, u16 time,
void *common),
void *common);
373 extern s32 ReleaseAlarm(s32 alarm_id);
374 extern s32 _ReleaseAlarm(s32 alarm_id);
376 extern s32 _iEnableIntc(s32 cause);
377 extern s32 _iDisableIntc(s32 cause);
378 extern s32 _iEnableDmac(s32 channel);
379 extern s32 _iDisableDmac(s32 channel);
381 extern s32 iSetAlarm(u16 time,
void (*callback)(s32 alarm_id, u16 time,
void *common),
void *common);
382 extern s32 _iSetAlarm(u16 time,
void (*callback)(s32 alarm_id, u16 time,
void *common),
void *common);
383 extern s32 iReleaseAlarm(s32 alarm_id);
384 extern s32 _iReleaseAlarm(s32 alarm_id);
387 extern s32 DeleteThread(s32 thread_id);
388 extern s32 StartThread(s32 thread_id,
void *args);
389 extern void ExitThread(
void);
390 extern void ExitDeleteThread(
void);
391 extern s32 TerminateThread(s32 thread_id);
392 extern s32 iTerminateThread(s32 thread_id);
395 extern s32 ChangeThreadPriority(s32 thread_id, s32 priority);
396 extern s32 iChangeThreadPriority(s32 thread_id, s32 priority);
397 extern s32 RotateThreadReadyQueue(s32 priority);
398 extern s32 _iRotateThreadReadyQueue(s32 priority);
399 extern s32 ReleaseWaitThread(s32 thread_id);
400 extern s32 iReleaseWaitThread(s32 thread_id);
401 extern s32 GetThreadId(
void);
402 extern s32 _iGetThreadId(
void);
405 extern s32 SleepThread(
void);
406 extern s32 WakeupThread(s32 thread_id);
407 extern s32 _iWakeupThread(s32 thread_id);
408 extern s32 CancelWakeupThread(s32 thread_id);
409 extern s32 iCancelWakeupThread(s32 thread_id);
410 extern s32 SuspendThread(s32 thread_id);
411 extern s32 _iSuspendThread(s32 thread_id);
412 extern s32 ResumeThread(s32 thread_id);
413 extern s32 iResumeThread(s32 thread_id);
415 extern u8 RFU059(
void);
417 extern void *SetupThread(
void *gp,
void *stack, s32 stack_size,
void *args,
void *root_func);
418 extern void SetupHeap(
void *heap_start, s32 heap_size);
419 extern void *EndOfHeap(
void);
422 extern s32 DeleteSema(s32 sema_id);
423 extern s32 SignalSema(s32 sema_id);
424 extern s32 iSignalSema(s32 sema_id);
425 extern s32 WaitSema(s32 sema_id);
426 extern s32 PollSema(s32 sema_id);
427 extern s32 iPollSema(s32 sema_id);
428 extern s32 ReferSemaStatus(s32 sema_id,
ee_sema_t *sema);
429 extern s32 iReferSemaStatus(s32 sema_id,
ee_sema_t *sema);
430 extern s32 iDeleteSema(s32 sema_id);
431 extern void SetOsdConfigParam(
void *addr);
432 extern void GetOsdConfigParam(
void *addr);
433 extern void GetGsHParam(
void *addr1,
void *addr2,
void *addr3);
434 extern s32 GetGsVParam(
void);
435 extern void SetGsHParam(
void *addr1,
void *addr2,
void *addr3,
void *addr4);
436 extern void SetGsVParam(s32 arg1);
439 extern int PutTLBEntry(
unsigned int PageMask,
unsigned int EntryHi,
unsigned int EntryLo0,
unsigned int EntryLo1);
440 extern int iPutTLBEntry(
unsigned int PageMask,
unsigned int EntryHi,
unsigned int EntryLo0,
unsigned int EntryLo1);
441 extern int _SetTLBEntry(
unsigned int index,
unsigned int PageMask,
unsigned int EntryHi,
unsigned int EntryLo0,
unsigned int EntryLo1);
442 extern int iSetTLBEntry(
unsigned int index,
unsigned int PageMask,
unsigned int EntryHi,
unsigned int EntryLo0,
unsigned int EntryLo1);
443 extern int GetTLBEntry(
unsigned int index,
unsigned int *PageMask,
unsigned int *EntryHi,
unsigned int *EntryLo0,
unsigned int *EntryLo1);
444 extern int iGetTLBEntry(
unsigned int index,
unsigned int *PageMask,
unsigned int *EntryHi,
unsigned int *EntryLo0,
unsigned int *EntryLo1);
445 extern int ProbeTLBEntry(
unsigned int EntryHi,
unsigned int *PageMask,
unsigned int *EntryLo0,
unsigned int *EntryLo1);
446 extern int iProbeTLBEntry(
unsigned int EntryHi,
unsigned int *PageMask,
unsigned int *EntryLo0,
unsigned int *EntryLo1);
447 extern int ExpandScratchPad(
unsigned int page);
449 extern void EnableIntcHandler(u32 cause);
450 extern void iEnableIntcHandler(u32 cause);
451 extern void DisableIntcHandler(u32 cause);
452 extern void iDisableIntcHandler(u32 cause);
453 extern void EnableDmacHandler(u32 channel);
454 extern void iEnableDmacHandler(u32 channel);
455 extern void DisableDmacHandler(u32 channel);
456 extern void iDisableDmacHandler(u32 channel);
457 extern void KSeg0(s32 arg1);
458 extern s32 EnableCache(s32 cache);
459 extern s32 DisableCache(s32 cache);
460 extern u32 GetCop0(s32 reg_id);
461 extern void FlushCache(s32 operation);
462 extern u32 CpuConfig(u32 config);
463 extern u32 iGetCop0(s32 reg_id);
464 extern void iFlushCache(s32 operation);
465 extern u32 iCpuConfig(u32 config);
466 extern void SetCPUTimerHandler(
void (*handler)(
void));
467 extern void SetCPUTimer(s32 compval);
470 extern void SetOsdConfigParam2(
void *config, s32 size, s32 offset);
471 extern void GetOsdConfigParam2(
void *config, s32 size, s32 offset);
473 extern u64 GsGetIMR(
void);
474 extern u64 iGsGetIMR(
void);
475 extern u64 GsPutIMR(u64 imr);
476 extern u64 iGsPutIMR(u64 imr);
477 extern void SetPgifHandler(
void *handler);
478 extern void SetVSyncFlag(u32 *, u64 *);
479 extern void SetSyscall(s32 syscall_num,
void *handler);
480 extern void _print(
const char *fmt, ...);
482 extern void sceSifStopDma(
void);
484 extern int sceSifDmaStat(
int trid);
485 extern int sceiSifDmaStat(
int trid);
490 extern void sceSifSetDChain(
void);
491 extern void isceSifSetDChain(
void);
494 extern int sceSifSetReg(u32 register_num,
int register_value);
495 extern int sceSifGetReg(u32 register_num);
497 extern void _ExecOSD(
int num_args,
char *args[])
__attribute__((noreturn));
498 extern s32 Deci2Call(s32, u32 *);
499 extern void PSMode(
void);
500 extern s32 MachineType(
void);
501 extern s32 GetMemorySize(
void);
504 extern void _GetGsDxDyOffset(
int mode,
int *dx,
int *dy,
int *dw,
int *dh);
507 extern int _InitTLB(
void);
511 extern int SetMemoryMode(
int mode);
513 extern int GetMemoryMode(
void);
515 extern void _SyncDCache(
void *start,
void *end);
516 extern void _InvalidDCache(
void *start,
void *end);
518 extern void *GetSyscallHandler(
int syscall_no);
519 extern void *GetExceptionHandler(
int except_no);
520 extern void *GetInterruptHandler(
int intr_no);
523 extern int kCopy(
void *dest,
const void *src,
int size);
524 extern int kCopyBytes(
void *dest,
const void *src,
int size);
525 extern int Copy(
void *dest,
const void *src,
int size);
526 extern void setup(
int syscall_num,
void *handler);
527 extern void *GetEntryAddress(
int syscall);
530 #define SifStopDma(...) sceSifStopDma(__VA_ARGS__)
532 #define iSifDmaStat(...) isceSifDmaStat(__VA_ARGS__)
534 #define iSifSetDma(...) isceSifSetDma(__VA_ARGS__)
535 #define SifSetDChain(...) sceSifSetDChain(__VA_ARGS__)
536 #define iSifSetDChain(...) isceSifSetDChain(__VA_ARGS__)
537 #define SifSetReg(...) sceSifSetReg(__VA_ARGS__)
538 #define SifGetReg(...) sceSifGetReg(__VA_ARGS__)
542 #define DISABLE_PATCHED_Exit() \
543 void Exit(s32 exit_code) { KExit(exit_code); }
545 #define DISABLE_PATCHED_LoadExecPS2() \
546 void LoadExecPS2(const char *filename, s32 num_args, char *args[]) { _LoadExecPS2(filename, num_args, args); }
548 #define NO_PATCHED_ExecOSD() \
549 void ExecOSD(int num_args, char *args[]) { _ExecOSD(num_args, args); }
551 #define DISABLE_TimerSystemTime() \
552 void _ps2sdk_init_timer() {} \
553 void _ps2sdk_deinit_timer() {}
555 #define DISABLE_TimerAlarm() \
556 void ForTimer_InitAlarm(void) {}
558 #define DISABLE_PATCHED_ALARMS() \
559 void InitAlarm(void) {}
561 #define DISABLE_PATCHED_THREADS() \
562 int InitThread(void) { return 0; } \
563 s32 iRotateThreadReadyQueue(s32 priority) { return _iRotateThreadReadyQueue(priority); } \
564 s32 iWakeupThread(s32 thread_id) { return _iWakeupThread(thread_id); } \
565 s32 iSuspendThread(s32 thread_id) { return _iSuspendThread(thread_id); }
567 #define DISABLE_PATCHED_ExecPS2() \
568 void InitExecPS2(void) {} \
569 s32 ExecPS2(void *entry, void *gp, int num_args, char *args[]) { return _ExecPS2(entry, gp, num_args, args); }
571 #define DISABLE_PATCHED_TLBFunctions() \
572 void InitTLBFunctions(void) {} \
573 void InitTLB(void) {}
575 #define DISABLE_PATCHED_FUNCTIONS() \
576 DISABLE_PATCHED_ALARMS() \
577 DISABLE_PATCHED_THREADS() \
578 DISABLE_PATCHED_ExecPS2() \
579 DISABLE_PATCHED_TLBFunctions() \
580 DISABLE_PATCHED_Exit() \
581 DISABLE_PATCHED_LoadExecPS2()
583 #define DISABLE_EXTRA_TIMERS_FUNCTIONS() \
584 DISABLE_TimerSystemTime() \