34 #define JAL(addr) (0x0c000000 | (0x3ffffff & ((addr) >> 2)))
35 #define HI16(addr) (0x3c110000 | (((addr) >> 16) & 0xffff))
36 #define LO16(addr) (0x36310000 | ((addr) & 0xffff))
38 static const u32 g_lmb_patch[32] = {
63 0x00000000, 0x00000000,
64 0x7962424c, 0x00004545,
65 0x00000000, 0x00000000, 0x00000000, 0x00000000
73 static u32 lmb_patch[
sizeof(g_lmb_patch)] ALIGNED(16);
78 void *pStartModule, *pLoadModuleBuffer, *patch_addr, *lf_rpc_dispatch;
82 memcpy(UNCACHED_SEG(lmb_patch), g_lmb_patch,
sizeof(g_lmb_patch));
89 pStartModule = modload_lib->exports[8];
90 pLoadModuleBuffer = modload_lib->exports[10];
112 if(loadfile_info.text_size < 0x4c4 + 128)
115 lf_rpc_dispatch = (
void *)(loadfile_info.text_start + 0x4c4);
117 if(sceSifGetOtherData(&RData, (
void*)lf_rpc_dispatch, &
smem_buf, 128, 0)>=0){
119 if(data[0]==0x27bdffe8 && data[1]==0x2c820006 && data[2]==0x14400003 && data[3]==0xafbf0010 && data[5]==0x00001021 && data[6]==0x00041080){
120 void *lf_jump_table_end, *lf_fno_check;
121 unsigned short int JumpTableOffset_hi, JumpTableOffset_lo;
123 lf_fno_check = (
void*)((u8 *)lf_rpc_dispatch+4);
126 JumpTableOffset_hi=*(
unsigned short int*)&data[7];
127 JumpTableOffset_lo=*(
unsigned short int*)&data[9];
129 lf_jump_table_end = (
void*)((JumpTableOffset_hi<<16) + (
short int)JumpTableOffset_lo + 0x18);
133 if ((patch_addr = SifAllocIopHeap(
sizeof lmb_patch)) == NULL)
137 result = (u32)patch_addr + 96;
138 ((u32 *)(UNCACHED_SEG(lmb_patch)))[5] = JAL((u32)pLoadModuleBuffer);
139 ((u32 *)(UNCACHED_SEG(lmb_patch)))[7] = HI16(result);
140 ((u32 *)(UNCACHED_SEG(lmb_patch)))[9] = LO16(result);
141 ((u32 *)(UNCACHED_SEG(lmb_patch)))[15] = JAL((u32)pStartModule);
144 dmat.size=
sizeof(lmb_patch);
145 dmat.dest=patch_addr;
148 sceSifSetDma(&dmat, 1);
153 smem_write_word(lf_jump_table_end, (u32)patch_addr);
154 smem_write_word(lf_fno_check, 0x2C820007);