diff --git a/dist-scripts/retroarch-wii-readme.txt b/dist-scripts/retroarch-wii-readme.txt index 9305a30428..e5e956ab59 100644 --- a/dist-scripts/retroarch-wii-readme.txt +++ b/dist-scripts/retroarch-wii-readme.txt @@ -1,5 +1,5 @@ ------------------------------------------------------------------------------ -RETROARCH WII - 0.9.8.4 +RETROARCH GX - WII - 0.9.8.4 ------------------------------------------------------------------------------ RetroConsole Level: 1 Author: Themaister, Toad King, Squarepusher/Twin Aphex diff --git a/frontend/platform/platform_gx_exec.c b/frontend/platform/platform_gx_exec.c new file mode 100644 index 0000000000..0985279564 --- /dev/null +++ b/frontend/platform/platform_gx_exec.c @@ -0,0 +1,115 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2013 - Hans-Kristian Arntzen + * Copyright (C) 2011-2013 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#if defined(HW_RVL) +#include +#include +#include +#include +#include +#include +#include +#include + +#define EXECUTE_ADDR ((uint8_t *) 0x91800000) +#define BOOTER_ADDR ((uint8_t *) 0x93000000) +#define ARGS_ADDR ((uint8_t *) 0x93200000) + +extern uint8_t _binary_wii_app_booter_app_booter_bin_start[]; +extern uint8_t _binary_wii_app_booter_app_booter_bin_end[]; +#define booter_start _binary_wii_app_booter_app_booter_bin_start +#define booter_end _binary_wii_app_booter_app_booter_bin_end + +#elif defined(HW_DOL) +#include "../../ngc/sidestep.h" +#endif + +#include "../../retroarch_logger.h" + +#ifdef HW_RVL +// NOTE: this does not update the path to point to the new loading .dol file. +// we only need it for keeping the current directory anyway. +void dol_copy_argv_path(void) +{ + struct __argv *argv = (struct __argv *) ARGS_ADDR; + memset(ARGS_ADDR, 0, sizeof(struct __argv)); + char *cmdline = (char *) ARGS_ADDR + sizeof(struct __argv); + argv->argvMagic = ARGV_MAGIC; + argv->commandLine = cmdline; + size_t len = strlen(__system_argv->argv[0]); + memcpy(cmdline, __system_argv->argv[0], ++len); + cmdline[len++] = 0; + cmdline[len++] = 0; + argv->length = len; + DCFlushRange(ARGS_ADDR, sizeof(struct __argv) + argv->length); +} +#endif + +// WARNING: after we move any data into EXECUTE_ADDR, we can no longer use any +// heap memory and are restricted to the stack only +static void rarch_console_exec(const char *path) +{ + RARCH_LOG("Attempt to load executable: [%s].\n", path); +#if defined(HW_RVL) + FILE * fp = fopen(path, "rb"); + if (fp == NULL) + { + RARCH_ERR("Could not open DOL file %s.\n", path); + return; + } + + fseek(fp, 0, SEEK_END); + size_t size = ftell(fp); + fseek(fp, 0, SEEK_SET); + // try to allocate a buffer for it. if we can't, fail + void *dol = malloc(size); + if (!dol) + { + RARCH_ERR("Could not execute DOL file %s.\n", path); + fclose(fp); + return; + } + + fread(dol, 1, size, fp); + fclose(fp); + + fatUnmount("carda:"); + fatUnmount("cardb:"); + fatUnmount("sd:"); + fatUnmount("usb:"); + __io_wiisd.shutdown(); + __io_usbstorage.shutdown(); + + // luckily for us, newlib's memmove doesn't allocate a seperate buffer for + // copying in situations of overlap, so it's safe to do this + memmove(EXECUTE_ADDR, dol, size); + DCFlushRange(EXECUTE_ADDR, size); + + dol_copy_argv_path(); + + size_t booter_size = booter_end - booter_start; + memcpy(BOOTER_ADDR, booter_start, booter_size); + DCFlushRange(BOOTER_ADDR, booter_size); + + RARCH_LOG("jumping to %08x\n", (unsigned) BOOTER_ADDR); + SYS_ResetSystem(SYS_SHUTDOWN,0,0); + __lwp_thread_stopmultitasking((void (*)(void)) BOOTER_ADDR); +#elif defined(HW_DOL) + DOLtoARAM(path); +#endif +}