-
Notifications
You must be signed in to change notification settings - Fork 51
/
loader.c
135 lines (121 loc) · 4.86 KB
/
loader.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//--------------------------------------------------------------
// File name: loader.c
//--------------------------------------------------------------
// dlanor: This subprogram has been modified to minimize the code
// dlanor: size of the resident loader portion. Some of the parts
// dlanor: that were moved into the main program include loading
// dlanor: of all IRXs and mounting pfs0: for ELFs on hdd.
// dlanor: Another change was to skip threading in favor of ExecPS2
/*==================================================================
== ==
== Copyright(c)2004 Adam Metcalf([email protected]) ==
== Copyright(c)2004 Thomas Hawcroft([email protected]) ==
== This file is subject to terms and conditions shown in the ==
== file LICENSE which should be kept in the top folder of ==
== this distribution. ==
== ==
== Portions of this code taken from PS2Link: ==
== pkoLoadElf ==
== wipeUserMemory ==
== (C) 2003 Tord Lindstrom ([email protected]) ==
== (C) 2003 adresd ([email protected]) ==
== Portions of this code taken from Independence MC exploit ==
== tLoadElf ==
== LoadAndRunHDDElf ==
== (C) 2003 Marcus Brown <[email protected]> ==
== ==
==================================================================*/
#include "tamtypes.h"
#include "debug.h"
#include "kernel.h"
#include "iopcontrol.h"
#include "sifrpc.h"
#include "loadfile.h"
#include "string.h"
#include "iopheap.h"
#include "errno.h"
#include "ps2sdkapi.h"
//--------------------------------------------------------------
//--------------------------------------------------------------
// Redefinition of init/deinit libc:
//--------------------------------------------------------------
// DON'T REMOVE is for reducing binary size.
// These funtios are defined as weak in /libc/src/init.c
//--------------------------------------------------------------
void _libcglue_init() {}
void _libcglue_deinit() {}
void _libcglue_args_parse(int argc, char **argv) {}
DISABLE_PATCHED_FUNCTIONS();
DISABLE_EXTRA_TIMERS_FUNCTIONS();
PS2_DISABLE_AUTOSTART_PTHREAD();
//--------------------------------------------------------------
// End of data declarations
//--------------------------------------------------------------
// Start of function code:
//--------------------------------------------------------------
// Clear user memory
// PS2Link (C) 2003 Tord Lindstrom ([email protected])
// (C) 2003 adresd ([email protected])
//--------------------------------------------------------------
static void wipeUserMem(void)
{
int i;
for (i = 0x100000; i < GetMemorySize(); i += 64) {
asm volatile(
"\tsq $0, 0(%0) \n"
"\tsq $0, 16(%0) \n"
"\tsq $0, 32(%0) \n"
"\tsq $0, 48(%0) \n" ::"r"(i));
}
}
//--------------------------------------------------------------
// End of func: void wipeUserMem(void)
//--------------------------------------------------------------
// *** MAIN ***
//--------------------------------------------------------------
int main(int argc, char *argv[])
{
static t_ExecData elfdata;
char *target, *path;
int ret;
// Initialize
SifInitRpc(0);
wipeUserMem();
if (argc != 2) { // arg1=path to ELF, arg2=partition to mount
SifExitRpc();
return -EINVAL;
}
target = argv[0];
path = argv[1];
// Writeback data cache before loading ELF.
FlushCache(0);
ret = SifLoadElf(target, &elfdata);
if (ret == 0) {
char *args[1];
args[0] = path;
if (strncmp(path, "hdd", 3) == 0 && (path[3] >= '0' && path[3] <= ':')) { /* Final IOP reset, to fill the IOP with the default modules.
It appears that it was once a thing for the booting software to leave the IOP with the required IOP modules.
This can be seen in OSDSYS v1.0x (no IOP reboot) and the mechanism to boot DVD player updates (OSDSYS will get LoadExecPS2 to load SIO2 modules).
However, it changed with the introduction of the HDD unit, as the software booted may be built with a different SDK revision.
Reboot the IOP, to leave it in a clean & consistent state.
But do not do that for boot targets on other devices, for backward-compatibility with older (homebrew) software. */
while (!SifIopReset("", 0)) {
};
while (!SifIopSync()) {
};
}
SifExitRpc();
FlushCache(0);
FlushCache(2);
ExecPS2((void *)elfdata.epc, (void *)elfdata.gp, 1, args);
return 0;
} else {
SifExitRpc();
return -ENOENT;
}
}
//--------------------------------------------------------------
// End of func: int main(int argc, char *argv[])
//--------------------------------------------------------------
// End of file: loader.c
//--------------------------------------------------------------