Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ee/elf-loader/include/elf-loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ extern int LoadELFFromFile(const char *filename, int argc, char *argv[]);
*/
extern int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]);

extern int LoadELFFromFileWithPartitionNoReset(const char *filename, const char *partition, int argc, char *argv[]);

#ifdef __cplusplus
}
#endif
Expand Down
17 changes: 13 additions & 4 deletions ee/elf-loader/src/elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,13 @@ static void wipe_bramMem(void) {
#endif
}

int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]) {
static int LoadELFFromFileResetCommon(const char *filename, const char *partition, int reset, int argc, char *argv[]) {
u8 *boot_elf;
elf_header_t *eh;
elf_pheader_t *eph;
void *pdata;
int i;
int new_argc = argc + 2;
int new_argc = argc + 3;

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

// Preparing filename and partition to be sent in the argv
char *new_argv[argc + 2];
char *new_argv[argc + 3];
new_argv[0] = partition != NULL ? (char *)partition : "";
new_argv[1] = (char *)filename;
new_argv[2] = reset ? "1" : "0";
for (i = 0; i < argc; i++) {
new_argv[i + 2] = argv[i];
new_argv[i + 3] = argv[i];
}

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

int LoadELFFromFileWithPartition(const char *filename, const char *partition, int argc, char *argv[]) {
return LoadELFFromFileResetCommon(filename, partition, 1, argc, argv);
}

int LoadELFFromFileWithPartitionNoReset(const char *filename, const char *partition, int argc, char *argv[]) {
return LoadELFFromFileResetCommon(filename, partition, 0, argc, argv);
}

int LoadELFFromFile(const char *filename, int argc, char *argv[])
{
return LoadELFFromFileWithPartition(filename, NULL, argc, argv);
Expand Down
41 changes: 23 additions & 18 deletions ee/elf-loader/src/loader/src/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,20 +90,23 @@ int main(int argc, char *argv[])
SET_GS_BGCOLOUR(WHITE_BG);
// arg[0] partition if exists, otherwise is ""
// arg[1]=path to ELF
if (argc < 2) {
// arg[2]=reset flag ("0" = keep IOP, otherwise reset)
if (argc < 3) {
SET_GS_BGCOLOUR(RED_BG);
return -EINVAL;
}

char *new_argv[argc - 1];
int reset = (argv[2][0] != '0');

char *new_argv[argc - 2];
int fullPath_length = 1 + strlen(argv[0]) + strlen(argv[1]);
char fullPath[fullPath_length];
strcpy(fullPath, argv[0]);
strcat(fullPath, argv[1]);
// final new_argv[0] is partition + path to elf
new_argv[0] = fullPath;
for (i = 2; i < argc; i++) {
new_argv[i - 1] = argv[i];
for (i = 3; i < argc; i++) {
new_argv[i - 2] = argv[i];
}

SET_GS_BGCOLOUR(CYAN_BG);
Expand All @@ -122,29 +125,31 @@ int main(int argc, char *argv[])
if (ret == 0 && elfdata.epc != 0) {
SET_GS_BGCOLOUR(YELLOW_BG);

// Let's reset IOP because ELF was already loaded in memory
while(!SifIopReset(NULL, 0)){};
while (!SifIopSync()) {};
if (reset) {
// Let's reset IOP because ELF was already loaded in memory
while(!SifIopReset(NULL, 0)){};
while (!SifIopSync()) {};

SET_GS_BGCOLOUR(ORANGE_BG);
SET_GS_BGCOLOUR(ORANGE_BG);

sceSifInitRpc(0);
// Load modules.
SifLoadFileInit();
SifLoadModule("rom0:SIO2MAN", 0, NULL);
SifLoadModule("rom0:MCMAN", 0, NULL);
SifLoadModule("rom0:MCSERV", 0, NULL);
SifLoadFileExit();
sceSifExitRpc();
sceSifInitRpc(0);
// Load modules.
SifLoadFileInit();
SifLoadModule("rom0:SIO2MAN", 0, NULL);
SifLoadModule("rom0:MCMAN", 0, NULL);
SifLoadModule("rom0:MCSERV", 0, NULL);
SifLoadFileExit();
sceSifExitRpc();
}

SET_GS_BGCOLOUR(BROWN_BG);

FlushCache(0);
FlushCache(2);

SET_GS_BGCOLOUR(PURPBLE_BG);
return ExecPS2((void *)elfdata.epc, (void *)elfdata.gp, argc-1, new_argv);

return ExecPS2((void *)elfdata.epc, (void *)elfdata.gp, argc - 2, new_argv);
} else {
SET_GS_BGCOLOUR(MAGENTA_BG);
sceSifExitRpc();
Expand Down
Loading