Skip to content

Commit baecd0e

Browse files
authored
Merge pull request #878 from KrahJohlito/el_rtnr
elf-loader: add no-IOP-reset loader variant and NoReset entry point
2 parents 9affab7 + 8890d8b commit baecd0e

3 files changed

Lines changed: 39 additions & 22 deletions

File tree

ee/elf-loader/include/elf-loader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ extern int LoadELFFromFile(const char *filename, int argc, char *argv[]);
5050
*/
5151
extern int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]);
5252

53+
extern int LoadELFFromFileWithPartitionNoReset(const char *filename, const char *partition, int argc, char *argv[]);
54+
5355
#ifdef __cplusplus
5456
}
5557
#endif

ee/elf-loader/src/elf.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ static void wipe_bramMem(void) {
5454
#endif
5555
}
5656

57-
int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]) {
57+
static int LoadELFFromFileResetCommon(const char *filename, const char *partition, int reset, int argc, char *argv[]) {
5858
u8 *boot_elf;
5959
elf_header_t *eh;
6060
elf_pheader_t *eph;
6161
void *pdata;
6262
int i;
63-
int new_argc = argc + 2;
63+
int new_argc = argc + 3;
6464

6565
// We need to check that the ELF file before continue
6666
if (!file_exists(filename)) {
@@ -70,11 +70,12 @@ int LoadELFFromFileWithPartition(const char *filename, const char *partition, in
7070
wipe_bramMem();
7171

7272
// Preparing filename and partition to be sent in the argv
73-
char *new_argv[argc + 2];
73+
char *new_argv[argc + 3];
7474
new_argv[0] = partition != NULL ? (char *)partition : "";
7575
new_argv[1] = (char *)filename;
76+
new_argv[2] = reset ? "1" : "0";
7677
for (i = 0; i < argc; i++) {
77-
new_argv[i + 2] = argv[i];
78+
new_argv[i + 3] = argv[i];
7879
}
7980

8081
/* NB: LOADER.ELF is embedded */
@@ -105,6 +106,14 @@ int LoadELFFromFileWithPartition(const char *filename, const char *partition, in
105106
return ExecPS2((void *)eh->entry, NULL, new_argc, new_argv);
106107
}
107108

109+
int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]) {
110+
return LoadELFFromFileResetCommon(filename, partition, 1, argc, argv);
111+
}
112+
113+
int LoadELFFromFileWithPartitionNoReset(const char *filename, const char *partition, int argc, char *argv[]) {
114+
return LoadELFFromFileResetCommon(filename, partition, 0, argc, argv);
115+
}
116+
108117
int LoadELFFromFile(const char *filename, int argc, char *argv[])
109118
{
110119
return LoadELFFromFileWithPartition(filename, NULL, argc, argv);

ee/elf-loader/src/loader/src/loader.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,26 @@ int main(int argc, char *argv[])
9090
SET_GS_BGCOLOUR(WHITE_BG);
9191
// arg[0] partition if exists, otherwise is ""
9292
// arg[1]=path to ELF
93-
if (argc < 2) {
93+
// arg[2]=reset flag ("0" = keep IOP, otherwise reset)
94+
if (argc < 3) {
9495
SET_GS_BGCOLOUR(RED_BG);
9596
return -EINVAL;
9697
}
9798

98-
char *new_argv[argc - 1];
99+
int reset = (argv[2][0] != '0');
100+
101+
char *new_argv[argc - 2];
99102
int argv0_len = strlen(argv[0]);
100103
int argv1_len = strlen(argv[1]);
101104
char fullPath[argv0_len + argv1_len + 1];
105+
102106
memcpy(&fullPath[0], argv[0], argv0_len);
103107
memcpy(&fullPath[argv0_len], argv[1], argv1_len);
104108
fullPath[argv0_len + argv1_len] = 0;
105109
// final new_argv[0] is partition + path to elf
106110
new_argv[0] = fullPath;
107-
for (i = 2; i < argc; i++) {
108-
new_argv[i - 1] = argv[i];
111+
for (i = 3; i < argc; i++) {
112+
new_argv[i - 2] = argv[i];
109113
}
110114

111115
SET_GS_BGCOLOUR(CYAN_BG);
@@ -124,29 +128,31 @@ int main(int argc, char *argv[])
124128
if (ret == 0 && elfdata.epc != 0) {
125129
SET_GS_BGCOLOUR(YELLOW_BG);
126130

127-
// Let's reset IOP because ELF was already loaded in memory
128-
while(!SifIopReset(NULL, 0)){};
129-
while (!SifIopSync()) {};
131+
if (reset) {
132+
// Let's reset IOP because ELF was already loaded in memory
133+
while(!SifIopReset(NULL, 0)){};
134+
while (!SifIopSync()) {};
130135

131-
SET_GS_BGCOLOUR(ORANGE_BG);
136+
SET_GS_BGCOLOUR(ORANGE_BG);
132137

133-
sceSifInitRpc(0);
134-
// Load modules.
135-
SifLoadFileInit();
136-
SifLoadModule("rom0:SIO2MAN", 0, NULL);
137-
SifLoadModule("rom0:MCMAN", 0, NULL);
138-
SifLoadModule("rom0:MCSERV", 0, NULL);
139-
SifLoadFileExit();
140-
sceSifExitRpc();
138+
sceSifInitRpc(0);
139+
// Load modules.
140+
SifLoadFileInit();
141+
SifLoadModule("rom0:SIO2MAN", 0, NULL);
142+
SifLoadModule("rom0:MCMAN", 0, NULL);
143+
SifLoadModule("rom0:MCSERV", 0, NULL);
144+
SifLoadFileExit();
145+
sceSifExitRpc();
146+
}
141147

142148
SET_GS_BGCOLOUR(BROWN_BG);
143149

144150
FlushCache(0);
145151
FlushCache(2);
146152

147153
SET_GS_BGCOLOUR(PURPBLE_BG);
148-
149-
return ExecPS2((void *)elfdata.epc, (void *)elfdata.gp, argc-1, new_argv);
154+
155+
return ExecPS2((void *)elfdata.epc, (void *)elfdata.gp, argc - 2, new_argv);
150156
} else {
151157
SET_GS_BGCOLOUR(MAGENTA_BG);
152158
sceSifExitRpc();

0 commit comments

Comments
 (0)