void kernel_function() { /* Set k1 */ asm("move $k1, $0\n"); /* Repair sysmem */ _sw(0x0200D821, 0x8800F714); _sw(0x3C038801, 0x8800F718); _sw(0x8C654384, 0x8800F71C); /* Patch loadexec */ SceModule2 *mod = _sceKernelFindModuleByName("sceLoadExec"); u32 text_addr = mod->text_addr; MAKE_JUMP(text_addr + 0x2E30, Reboot_Entry); /* Allow LoadExecVSH in whatever user level */ _sh(0x1000, text_addr + 0x241E); _sw(0, text_addr + 0x2460); _sceKernelIcacheInvalidateAll(); _sceKernelDcacheWritebackInvalidateAll(); MakeFileList(); /* Load Eboot */ int (* LoadExecVSH)(int apitype, const char *file, struct SceKernelLoadExecVSHParam *param, int unk2) = (void *)text_addr + 0x23D0; char program[64]; strcpy(program, rebootex_config.savedata_path); strcat(program, "/MENU.PBP"); struct SceKernelLoadExecVSHParam param; memset(¶m, 0, sizeof(param)); param.size = sizeof(param); param.argp = program; param.args = strlen(param.argp) + 1; param.key = "game"; LoadExecVSH(PSP_INIT_APITYPE_MS2, program, ¶m, 0x10000); }
//our 6.35 kernel permission call int kernel_permission_call(void) { struct sceLoadExecPatch *patch; //cache invalidation functions void (* _sceKernelIcacheInvalidateAll)(void) = (void *)(SYSMEM_TEXT_ADDR + g_offs->sysmem_patch.sceKernelIcacheInvalidateAll); void (* _sceKernelDcacheWritebackInvalidateAll)(void) = (void *)(SYSMEM_TEXT_ADDR + g_offs->sysmem_patch.sceKernelDcacheWritebackInvalidateAll); #ifdef CONFIG_639 if(psp_fw_version == FW_639) { recovery_sysmem_639(); } #endif #ifdef CONFIG_635 if(psp_fw_version == FW_635) { recovery_sysmem_635(); } #endif #ifdef CONFIG_620 if(psp_fw_version == FW_620) { recovery_sysmem_620(); } #endif //sync cache _sceKernelIcacheInvalidateAll(); _sceKernelDcacheWritebackInvalidateAll(); //LoadCoreForKernel_EF8A0BEA SceModule2 * (* _sceKernelFindModuleByName)(const char * libname) = (void *)g_offs->sceKernelFindModuleByName; //find LoadExec module SceModule2 * loadexec = _sceKernelFindModuleByName("sceLoadExec"); //SysMemForKernel_458A70B5 int (* _sceKernelGetModel)(void) = (void *)(SYSMEM_TEXT_ADDR + g_offs->sysmem_patch.sceKernelGetModel); psp_model = _sceKernelGetModel(); if(psp_model == PSP_GO) { patch = &g_offs->loadexec_patch_05g; } else { patch = &g_offs->loadexec_patch_other; } //replace LoadReboot function _sw(MAKE_CALL(_LoadReboot), loadexec->text_addr + patch->LoadRebootCall); //patch Rebootex position to 0x88FC0000 _sw(0x3C0188FC, loadexec->text_addr + patch->RebootJump); // lui $at, 0x88FC //save LoadReboot function LoadReboot = (void*)loadexec->text_addr + patch->LoadReboot; _sceKernelIcacheInvalidateAll(); _sceKernelDcacheWritebackInvalidateAll(); //return success return 0xC01DB15D; }