|
From: Daniel L. <dle...@gm...> - 2019-06-13 04:35:39
|
https://bugs.kde.org/show_bug.cgi?id=400538 See also: https://bugs.kde.org/show_bug.cgi?id=253657 Signed-off-by: Daniel Lehman <dle...@gm...> --- VEX/priv/guest_amd64_toIR.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c index 7a20d4523..68fc88924 100644 --- a/VEX/priv/guest_amd64_toIR.c +++ b/VEX/priv/guest_amd64_toIR.c @@ -21052,6 +21052,41 @@ Long dis_ESC_NONE ( } goto decode_failure; + case 0xCF: /* IRET */ + /* Note, this is an extremely kludgey and limited implementation of iret + based on the extremely kludgey and limited implementation of iret for x86 + popq %RIP; popl %CS; popq %RFLAGS; popq %RSP; popl %SS + %CS and %SS are ignored */ + if (sz != 8) goto decode_failure; + + t1 = newTemp(Ity_I64); /* RSP */ + t2 = newTemp(Ity_I64); /* new RIP */ + /* t3 = newTemp(Ity_I32); new CS */ + t4 = newTemp(Ity_I64); /* new RFLAGS */ + t5 = newTemp(Ity_I64); /* new RSP */ + /* t6 = newTemp(Ity_I32); new SS */ + + assign(t1, getIReg64(R_RSP)); + assign(t2, loadLE(Ity_I64, binop(Iop_Add64,mkexpr(t1),mkU64(0)))); + /* assign(t3, loadLE(Ity_I32, binop(Iop_Add64,mkexpr(t1),mkU64(8)))); */ + assign(t4, loadLE(Ity_I64, binop(Iop_Add64,mkexpr(t1),mkU64(16)))); + assign(t5, loadLE(Ity_I64, binop(Iop_Add64,mkexpr(t1),mkU64(24)))); + /* assign(t6, loadLE(Ity_I32, binop(Iop_Add64,mkexpr(t1),mkU64(32)))); */ + + /* set %RFLAGS */ + stmt( IRStmt_Put( OFFB_CC_OP, mkU64(AMD64G_CC_OP_COPY) )); + stmt( IRStmt_Put( OFFB_CC_DEP1, mkexpr(t4) )); + stmt( IRStmt_Put( OFFB_CC_DEP2, mkU64(0) )); + stmt( IRStmt_Put( OFFB_CC_NDEP, mkU64(0) )); + + /* set new stack */ + putIReg64(R_RSP, mkexpr(t5)); + + /* goto new RIP value */ + jmp_treg(dres, Ijk_Ret, t2); + DIP("iret (very kludgey)\n"); + return delta; + case 0xD0: { /* Grp2 1,Eb */ Bool decode_OK = True; if (haveF2orF3(pfx)) goto decode_failure; -- 2.17.1 |