static int lv2_unpatch_storage_421(void) { lv1_reg regs_i, regs_o; if(!is_patched) return -1; //search bin "5F 6F 66 5F 70 72 6F 64 75 63 74 5F 6D 6F 64 65" to find // LV2 disable syscall storage pokeq(0x80000000002E7920ULL, save_lv2_storage_patch); regs_i.reg11 = 0xB7; regs_i.reg3 = 0x16f758; regs_i.reg4 = save_lv1_storage_patches[0]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f77c; regs_i.reg4 = save_lv1_storage_patches[1]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f7f4; regs_i.reg4 = save_lv1_storage_patches[2]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f7fc; regs_i.reg4 = save_lv1_storage_patches[3]; sys8_lv1_syscall(®s_i, ®s_o); return 0; }
static int lv2_unpatch_storage_446(void) { lv1_reg regs_i, regs_o; if(!is_patched) return -1; //search bin "5F 6F 66 5F 70 72 6F 64 75 63 74 5F 6D 6F 64 65" to find // LV2 disable syscall storage pokeq(0x80000000002E9CC8ULL, save_lv2_storage_patch); // LV1 Offsets regs_i.reg11 = 0xB7; regs_i.reg3 = 0x16fa60; regs_i.reg4 = save_lv1_storage_patches[0]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16fa84; regs_i.reg4 = save_lv1_storage_patches[1]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16fafc; regs_i.reg4 = save_lv1_storage_patches[2]; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16fb04; regs_i.reg4 = save_lv1_storage_patches[3]; sys8_lv1_syscall(®s_i, ®s_o); return 0; }
static int lv2_patch_storage_421(void) { lv1_reg regs_i, regs_o; // test if LV1 Peek is supported memset(®s_i, 0, sizeof(regs_i)); regs_i.reg11 = 0xB6; sys8_lv1_syscall(®s_i, ®s_o); if(((int) regs_o.reg3) <0) { return -1; } //search bin "5F 6F 66 5F 70 72 6F 64 75 63 74 5F 6D 6F 64 65" to find // LV2 enable syscall storage save_lv2_storage_patch= peekq(0x80000000002E7920ULL); pokeq32(0x80000000002E7920ULL, 0x40000000); regs_i.reg3 = 0x16f758; regs_i.reg4 = 0x7f83e37860000000ULL; regs_i.reg11 = 0xB6; sys8_lv1_syscall(®s_i, ®s_o); save_lv1_storage_patches[0]= regs_o.reg4; regs_i.reg11 = 0xB7; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f77c; regs_i.reg4 = 0x7f85e37838600001ULL; regs_i.reg11 = 0xB6; sys8_lv1_syscall(®s_i, ®s_o); save_lv1_storage_patches[1]= regs_o.reg4; regs_i.reg11 = 0xB7; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f7f4; regs_i.reg4 = 0x7f84e3783be00001ULL; regs_i.reg11 = 0xB6; sys8_lv1_syscall(®s_i, ®s_o); save_lv1_storage_patches[2]= regs_o.reg4; regs_i.reg11 = 0xB7; sys8_lv1_syscall(®s_i, ®s_o); regs_i.reg3 = 0x16f7fc; regs_i.reg4 = 0x9be1007038600000ULL; regs_i.reg11 = 0xB6; sys8_lv1_syscall(®s_i, ®s_o); save_lv1_storage_patches[3]= regs_o.reg4; regs_i.reg11 = 0xB7; sys8_lv1_syscall(®s_i, ®s_o); is_patched = 1; return 0; }
static void write_htab(void) { u64 cont = 0; lv1_reg regs_i, regs_o; u32 val; while(cont < 0x80) { val = (cont << 7); regs_i.reg3 = 0; regs_i.reg4 = (cont << 3ULL); regs_i.reg5 = lv2peek(0x800000000f000000ULL | ((u64) val)); regs_i.reg6 = lv2peek(0x800000000f000008ULL | ((u64) val)); regs_i.reg6 = (regs_i.reg6 & 0xff0000ULL) | 0x190ULL; regs_i.reg11= 1; sys8_lv1_syscall(®s_i, ®s_o); cont++; } }