void patchMemPartitionInfo() { if ( model == PSP_MODEL_STANDARD ) sceKernelSetDdrMemoryProtection( ( void * )0x88300000, 0x00100000, 0xf ); else sceKernelSetDdrMemoryProtection( ( void * )0x88600000, 0x00200000, 0xf ); tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceSystemMemoryManager" ); // 0x02001021 move $v0 $s0 int offset = 0x00001304; if ( fw_version == FW_371 || fw_version == FW_380 || fw_version == FW_390 ) { offset = 0x00001304; //for 3.71, 3.80, 3.90 } else if ( fw_version == FW_401 ) { offset = 0x00003A68; //for 4.01 } else if ( fw_version == FW_500 || fw_version == FW_550 ) { offset = 0x00003AA8; //for 5.00 } _sw( 0x02001021, pMod->text_addr + offset ); sceKernelIcacheInvalidateAll(); sceKernelDcacheWritebackInvalidateAll(); PspSysmemPartitionInfo info; memset( &info, 0, sizeof( PspSysmemPartitionInfo ) ); info.size = sizeof( PspSysmemPartitionInfo ); PspSysmemPartitionInfo * p_info = ( PspSysmemPartitionInfo * )sceKernelQueryMemoryPartitionInfo( 4, &info ); if ( model == PSP_MODEL_STANDARD ) p_info->startaddr = 0x08300000; else p_info->startaddr = 0x08600000; p_info->attr = 0xf; //restore _sw( 0x00001021, pMod->text_addr + offset ); sceKernelIcacheInvalidateAll(); sceKernelDcacheWritebackInvalidateAll(); }
static SceBool sub_0CFC(SceLoadCoreBootModuleInfo *mod) { SceSysmemPartitionInfo partInfo; partInfo.size = sizeof(SceSysmemPartitionInfo); sceKernelQueryMemoryPartitionInfo(SCE_KERNEL_SC_USER_PARTITION, &partInfo); return ((u32)UCACHED(mod->modBuf + mod->modSize)) >= partInfo.startAddr; }