|
From: <sv...@va...> - 2014-05-07 11:09:47
|
Author: sewardj
Date: Wed May 7 11:09:28 2014
New Revision: 2857
Log:
Handle "blr lr" correctly -- read the destination register
_before_ writing the return address in LR.
Modified:
trunk/priv/guest_arm64_toIR.c
Modified: trunk/priv/guest_arm64_toIR.c
==============================================================================
--- trunk/priv/guest_arm64_toIR.c (original)
+++ trunk/priv/guest_arm64_toIR.c Wed May 7 11:09:28 2014
@@ -4453,8 +4453,10 @@
return True;
}
if (branch_type == BITS2(0,1) /* CALL */) {
+ IRTemp dst = newTemp(Ity_I64);
+ assign(dst, getIReg64orZR(nn));
putIReg64orSP(30, mkU64(guest_PC_curr_instr + 4));
- putPC(getIReg64orZR(nn));
+ putPC(mkexpr(dst));
dres->whatNext = Dis_StopHere;
dres->jk_StopHere = Ijk_Call;
DIP("blr %s\n", nameIReg64orZR(nn));
|