PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
ldrsrc.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include <elf_loader_common.h>
12#include <kernel.h>
13#include <ps2sdkapi.h>
14#include <stdint.h>
15#include <string.h>
16#include <tamtypes.h>
17
18#ifdef LOADER_ENABLE_DEBUG_COLORS
19#define SET_GS_BGCOLOUR(colour) \
20 do \
21 { \
22 *((volatile unsigned long int *)0x120000E0) = colour; \
23 } while ( 0 )
24#else
25#define SET_GS_BGCOLOUR(colour) \
26 do \
27 { \
28 } while ( 0 )
29#endif
30
31// Color status helper in BGR format
32#define WHITE_BG 0xFFFFFF // start main
33#define CYAN_BG 0xFFFF00 // move memory
34#define GREEN_BG 0x00FF00 // set memory to 0
35#define RED_BG 0x0000FF // never encountered execution command
36#define MAGENTA_BG 0xFF00FF // malformed loader info
37#define BROWN_BG 0x2A2AA5 // before FlushCache
38#define PURPLE_BG 0x800080 // before ExecPS2
39
40//--------------------------------------------------------------
41// Redefinition of init/deinit libc:
42//--------------------------------------------------------------
43// DON'T REMOVE, as it is for reducing binary size.
44// These functions are defined as weak in /libc/src/init.c
45//--------------------------------------------------------------
46void _libcglue_init() {}
47void _libcglue_deinit() {}
48void _libcglue_args_parse(int argc, char **argv) {}
49
50DISABLE_PATCHED_FUNCTIONS();
51DISABLE_EXTRA_TIMERS_FUNCTIONS();
52PS2_DISABLE_AUTOSTART_PTHREAD();
53
54void __attribute__((section(".start"))) ldr_proc(void);
55void ldr_proc(void)
56{
58 elf_loader_arginfo_t *arginfo;
59
60 SET_GS_BGCOLOUR(WHITE_BG);
61 ldrinfo = (void *)0x11004000;
62 arginfo = (void *)0x00088000;
63
64 {
65 int i;
66 for ( i = 0; i < (sizeof(ldrinfo->items) / sizeof(ldrinfo->items[0])); i += 1 )
67 {
69
70 item = &(ldrinfo->items[i]);
71 if ( item->dest_addr != NULL && item->src_addr != NULL && item->size != 0 )
72 {
73 SET_GS_BGCOLOUR(CYAN_BG);
74 memmove(item->dest_addr, item->src_addr, item->size);
75 }
76 else if ( item->dest_addr != NULL && item->src_addr == NULL && item->size != 0 )
77 {
78 SET_GS_BGCOLOUR(GREEN_BG);
79 memset(item->dest_addr, 0, item->size);
80 }
81 else if ( item->dest_addr != NULL && item->size == 0 )
82 {
83 SET_GS_BGCOLOUR(BROWN_BG);
84 FlushCache(0);
85 FlushCache(2);
86 SET_GS_BGCOLOUR(PURPLE_BG);
87 ExecPS2(item->dest_addr, item->src_addr, arginfo->argc, arginfo->argv);
88 }
89 else
90 {
91 SET_GS_BGCOLOUR(MAGENTA_BG);
92 break;
93 }
94 }
95 }
96 SET_GS_BGCOLOUR(RED_BG);
97 __builtin_trap();
98}
typedef __attribute__
Definition tlbfunc.c:60