From: Julian Seward Date: Sat, 27 Aug 2011 21:00:22 +0000 (+0000) Subject: Support "ENTER $imm16, $0"; some part of the OSX 10.7 library stack X-Git-Tag: svn/VALGRIND_3_7_0^2~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcb08752d0734f40e1f89256741f74a83ef1ebbb;p=thirdparty%2Fvalgrind.git Support "ENTER $imm16, $0"; some part of the OSX 10.7 library stack needs it (I forget which bit). git-svn-id: svn://svn.valgrind.org/vex/trunk@2197 --- diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c index 2d99586061..da41b9d9e2 100644 --- a/VEX/priv/guest_amd64_toIR.c +++ b/VEX/priv/guest_amd64_toIR.c @@ -16174,6 +16174,37 @@ DisResult disInstr_AMD64_WRK ( //.. //-- DIP("enter 0x%x, 0x%x", d32, abyte); //.. //-- break; + case 0xC8: /* ENTER */ + /* Same comments re operand size as for LEAVE below apply. + Also, only handles the case "enter $imm16, $0"; other cases + for the second operand (nesting depth) are not handled. */ + if (sz != 4) + goto decode_failure; + d64 = getUDisp16(delta); + delta += 2; + vassert(d64 >= 0 && d64 <= 0xFFFF); + if (getUChar(delta) != 0) + goto decode_failure; + delta++; + /* Intel docs seem to suggest: + push rbp + temp = rsp + rbp = temp + rsp = rsp - imm16 + */ + t1 = newTemp(Ity_I64); + assign(t1, getIReg64(R_RBP)); + t2 = newTemp(Ity_I64); + assign(t2, binop(Iop_Sub64, getIReg64(R_RSP), mkU64(8))); + putIReg64(R_RSP, mkexpr(t2)); + storeLE(mkexpr(t2), mkexpr(t1)); + putIReg64(R_RBP, mkexpr(t2)); + if (d64 > 0) { + putIReg64(R_RSP, binop(Iop_Sub64, mkexpr(t2), mkU64(d64))); + } + DIP("enter $%u, $0\n", (UInt)d64); + break; + case 0xC9: /* LEAVE */ /* In 64-bit mode this defaults to a 64-bit operand size. There is no way to encode a 32-bit variant. Hence sz==4 but we do