void powerpc_ipc(volatile ipc_request *req) { switch (req->req) { case IPC_PPC_BOOT: if (req->args[0]) { // Enqueued from ARM side, do not invalidate mem nor ipc_post powerpc_boot_mem((u8 *) req->args[1], req->args[2]); } else { dc_invalidaterange((void *) req->args[1], req->args[2]); int res = powerpc_boot_mem((u8 *) req->args[1], req->args[2]); if (res) ipc_post(req->code, req->tag, 1, res); } break; case IPC_PPC_BOOT_FILE: if (req->args[0]) { // Enqueued from ARM side, do not invalidate mem nor ipc_post powerpc_boot_file((char *) req->args[1]); } else { dc_invalidaterange((void *) req->args[1], strnlen((char *) req->args[1], 256)); int res = powerpc_boot_file((char *) req->args[1]); if (res) ipc_post(req->code, req->tag, 1, res); } break; default: gecko_printf("IPC: unknown SLOW PPC request %04X\n", req->req); } }
u32 _main(void *base) { FRESULT fres; int res; u32 vector; (void)base; gecko_init(); gecko_printf("mini %s loading\n", git_version); gecko_printf("Initializing exceptions...\n"); exception_initialize(); gecko_printf("Configuring caches and MMU...\n"); mem_initialize(); gecko_printf("IOSflags: %08x %08x %08x\n", read32(0xffffff00), read32(0xffffff04), read32(0xffffff08)); gecko_printf(" %08x %08x %08x\n", read32(0xffffff0c), read32(0xffffff10), read32(0xffffff14)); irq_initialize(); irq_enable(IRQ_TIMER); // irq_enable(IRQ_GPIO1B); irq_enable(IRQ_GPIO1); irq_enable(IRQ_RESET); gecko_timer_initialize(); gecko_printf("Interrupts initialized\n"); crypto_initialize(); gecko_printf("crypto support initialized\n"); nand_initialize(); gecko_printf("NAND initialized.\n"); boot2_init(); gecko_printf("Initializing IPC...\n"); ipc_initialize(); gecko_printf("Initializing SDHC...\n"); sdhc_init(); gecko_printf("Mounting SD...\n"); fres = f_mount(0, &fatfs); if (read32(0x0d800190) & 2) { gecko_printf("GameCube compatibility mode detected...\n"); vector = boot2_run(1, 0x101); goto shutdown; } if(fres != FR_OK) { gecko_printf("Error %d while trying to mount SD\n", fres); panic2(0, PANIC_MOUNT); } gecko_printf("Trying to boot:" PPC_BOOT_FILE "\n"); res = powerpc_boot_file(PPC_BOOT_FILE); if(res < 0) { gecko_printf("Failed to boot PPC: %d\n", res); gecko_printf("Continuing anyway\n"); } gecko_printf("Going into IPC mainloop...\n"); vector = ipc_process_slow(); gecko_printf("IPC mainloop done!\n"); gecko_printf("Shutting down IPC...\n"); ipc_shutdown(); shutdown: gecko_printf("Shutting down interrupts...\n"); irq_shutdown(); gecko_printf("Shutting down caches and MMU...\n"); mem_shutdown(); gecko_printf("Vectoring to 0x%08x...\n", vector); return vector; }