]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle REX prefixed JMP instruction.
authorMark Wielaard <mark@klomp.org>
Sun, 26 Jul 2020 19:17:23 +0000 (21:17 +0200)
committerMark Wielaard <mark@klomp.org>
Mon, 17 Aug 2020 19:02:39 +0000 (21:02 +0200)
The NET Core runtime might generate a JMP with a REX prefix.
For Jv (32bit offset) and Jb (8bit offset) this is valid.
Prefixes that change operand size are ignored for such JMPs.
So remove the check for sz == 4 and force sz = 4 for Jv.

https://bugs.kde.org/show_bug.cgi?id=422174

NEWS
VEX/priv/guest_amd64_toIR.c

diff --git a/NEWS b/NEWS
index 976344cdc01336d7a31d9fcc5907102653bba948..cc492fc9a98a0423ca98cd6fde149b4b1c30dafa 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,7 @@ where XXXXXX is the bug number as listed below.
 369029  handle linux syscalls sched_getattr and sched_setattr
 n-i-bz  helgrind: If hg_cli__realloc fails, return NULL.
 
+422174  unhandled instruction bytes: 0x48 0xE9 (REX prefixed JMP instruction)
 422623  epoll_ctl warns for uninitialized padding on non-amd64 64bit arches
 423021  PPC:  Add missing ISA 3.0 documentation link and HWCAPS test.
 
index fadf47d41d6ba6f63a5ca3800409b11da94c5f7e..7888132ebda8253c44bd07ebea7dcfc4f6c92d1d 100644 (file)
@@ -21392,8 +21392,8 @@ Long dis_ESC_NONE (
 
    case 0xE9: /* Jv (jump, 16/32 offset) */
       if (haveF3(pfx)) goto decode_failure;
-      if (sz != 4) 
-         goto decode_failure; /* JRS added 2004 July 11 */
+      sz = 4; /* Prefixes that change operand size are ignored for this
+                 instruction. Operand size is forced to 32bit. */
       if (haveF2(pfx)) DIP("bnd ; "); /* MPX bnd prefix. */
       d64 = (guest_RIP_bbstart+delta+sz) + getSDisp(sz,delta); 
       delta += sz;
@@ -21404,8 +21404,7 @@ Long dis_ESC_NONE (
 
    case 0xEB: /* Jb (jump, byte offset) */
       if (haveF3(pfx)) goto decode_failure;
-      if (sz != 4) 
-         goto decode_failure; /* JRS added 2004 July 11 */
+      /* Prefixes that change operand size are ignored for this instruction. */
       if (haveF2(pfx)) DIP("bnd ; "); /* MPX bnd prefix. */
       d64 = (guest_RIP_bbstart+delta+1) + getSDisp8(delta); 
       delta++;