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);
  }
}
Beispiel #2
0
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);
  }
}