void assert_tc_saved_rip(void* saved_lr_pointer) { // saved on enterTCHelper auto const saved_lr = *reinterpret_cast<uint8_t**>(saved_lr_pointer); auto const branch_block = saved_lr; // next instruction after resumetc's callr auto const jccLen = smashableJccLen() - ppc64_asm::instr_size_in_bytes; auto const branch_instr = branch_block + jccLen; auto const exittc = mcg->ustubs().enterTCExit; ppc64_asm::DecodedInstruction di(branch_instr); if (di.isJmp()) { auto const jmp_target = TCA(ppc64_asm::Assembler::getLi64(branch_block)); always_assert(di.isJmp() && jmp_target == exittc); } else { always_assert(saved_lr == exittc); } }
void assert_tc_saved_rip(void* saved_lr_pointer) { // saved on enterTCHelper auto const saved_lr = *reinterpret_cast<uint8_t**>(saved_lr_pointer); auto const branch_block = saved_lr; // next instruction after resumetc's callr auto const jccLen = smashableJccLen() - ppc64_asm::instr_size_in_bytes; auto const branch_instr = branch_block + jccLen; auto const exittc = tc::ustubs().enterTCExit; ppc64_asm::DecodedInstruction const di(branch_instr); if (di.isJmp()) { ppc64_asm::DecodedInstruction const di_target(branch_block); always_assert(di.isJmp() && (di_target.farBranchTarget() == exittc)); } else { always_assert(saved_lr == exittc); } }