]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Support x86 $int 0x40 .. 0x43 instructions on Linux. Apparently these
authorJulian Seward <jseward@acm.org>
Wed, 29 Aug 2007 09:09:17 +0000 (09:09 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 29 Aug 2007 09:09:17 +0000 (09:09 +0000)
generate a segfault and then restart the instruction.

git-svn-id: svn://svn.valgrind.org/vex/trunk@1786

VEX/priv/guest-amd64/toIR.c
VEX/priv/guest-ppc/toIR.c
VEX/priv/guest-x86/toIR.c
VEX/priv/host-amd64/hdefs.c
VEX/priv/host-ppc/hdefs.c
VEX/priv/host-x86/hdefs.c
VEX/priv/ir/irdefs.c
VEX/pub/libvex_ir.h
VEX/pub/libvex_trc_values.h

index aff9971d2af5de87e94b36294ec0e919ae32128b..bd0a422012d7bd48db84031ab5e89ca16522ca70 100644 (file)
@@ -12446,7 +12446,7 @@ DisResult disInstr_AMD64_WRK (
    /* ------------------------ INT ------------------------ */
 
    case 0xCC: /* INT 3 */
-      jmp_lit(Ijk_Trap, guest_RIP_bbstart + delta);
+      jmp_lit(Ijk_SigTRAP, guest_RIP_bbstart + delta);
       dres.whatNext = Dis_StopHere;
       DIP("int $0x3\n");
       break;
index 35a066e4231cdf8ea9bc99d3e1e727cf24251861..35431d329359f5b60c45c8389d7f66fb977f7d05 100644 (file)
@@ -4586,7 +4586,7 @@ static Bool do_trap ( UChar TO,
          testing the arguments. */
       stmt( IRStmt_Exit( 
                binop(opCMPEQ, const0, const0), 
-               Ijk_Trap,
+               Ijk_SigTRAP,
                mode64 ? IRConst_U64(cia) : IRConst_U32((UInt)cia) 
       ));
       return True; /* unconditional trap */
@@ -4629,7 +4629,7 @@ static Bool do_trap ( UChar TO,
    }
    stmt( IRStmt_Exit( 
             binop(opCMPNE, cond, const0), 
-            Ijk_Trap,
+            Ijk_SigTRAP,
             mode64 ? IRConst_U64(cia) : IRConst_U32((UInt)cia) 
    ));
    return False; /* not an unconditional trap */
index 0a5c5de014fb278a73a4529e83a30e44baa214d8..2f206ea551c25dd92e86a92530e6d7852f084ea9 100644 (file)
@@ -11232,13 +11232,26 @@ DisResult disInstr_X86_WRK (
    /* ------------------------ INT ------------------------ */
 
    case 0xCC: /* INT 3 */
-      jmp_lit(Ijk_Trap,((Addr32)guest_EIP_bbstart)+delta);
+      jmp_lit(Ijk_SigTRAP,((Addr32)guest_EIP_bbstart)+delta);
       dres.whatNext = Dis_StopHere;
       DIP("int $0x3\n");
       break;
 
    case 0xCD: /* INT imm8 */
       d32 = getIByte(delta); delta++;
+
+      /* Handle int $0x40 .. $0x43 by synthesising a segfault and a
+         restart of this instruction (hence the "-2" two lines below,
+         to get the restart EIP to be this instruction.  This is
+         probably Linux-specific and it would be more correct to only
+         do this if the VexAbiInfo says that is what we should do. */
+      if (d32 >= 0x40 && d32 <= 0x43) {
+         jmp_lit(Ijk_SigSEGV,((Addr32)guest_EIP_bbstart)+delta-2);
+         dres.whatNext = Dis_StopHere;
+         DIP("int $0x%x\n", (Int)d32);
+         break;
+      }
+
       if (d32 != 0x80) goto decode_failure;
       /* It's important that all ArchRegs carry their up-to-date value
          at this point.  So we declare an end-of-block here, which
index 401dc46e2fb57705d38094e1d3dfab2df8f0d171..2ff737f03631c38328742fb582067360ecf010a7 100644 (file)
@@ -2689,9 +2689,9 @@ Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr* i,
          case Ijk_NoRedir:
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_NOREDIR); break;
-         case Ijk_Trap:
+         case Ijk_SigTRAP:
             *p++ = 0xBD;
-            p = emit32(p, VEX_TRC_JMP_TRAP); break;
+            p = emit32(p, VEX_TRC_JMP_SIGTRAP); break;
          case Ijk_Ret:
          case Ijk_Call:
          case Ijk_Boring:
index 60752ec7d4b865061e407c5cf2d271b841da5ba3..f8163bb3e073bcbf01fc0f94090b7d64a88fdf9d 100644 (file)
@@ -2949,7 +2949,7 @@ Int emit_PPCInstr ( UChar* buf, Int nbuf, PPCInstr* i,
          case Ijk_NoDecode:    trc = VEX_TRC_JMP_NODECODE;    break;
          case Ijk_TInval:      trc = VEX_TRC_JMP_TINVAL;      break;
          case Ijk_NoRedir:     trc = VEX_TRC_JMP_NOREDIR;     break;
-         case Ijk_Trap:        trc = VEX_TRC_JMP_TRAP;        break;
+         case Ijk_SigTRAP:     trc = VEX_TRC_JMP_SIGTRAP;     break;
          case Ijk_Ret:
          case Ijk_Call:
          case Ijk_Boring:
index ec3b6566e43c789c55e710009369d3bde722db64..171663d6c4bd6de126a472c17f50505c894bc726 100644 (file)
@@ -2297,9 +2297,12 @@ Int emit_X86Instr ( UChar* buf, Int nbuf, X86Instr* i,
          case Ijk_Sys_sysenter:
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_SYS_SYSENTER); break;
-         case Ijk_Trap:
+         case Ijk_SigTRAP:
             *p++ = 0xBD;
-            p = emit32(p, VEX_TRC_JMP_TRAP); break;
+            p = emit32(p, VEX_TRC_JMP_SIGTRAP); break;
+         case Ijk_SigSEGV:
+            *p++ = 0xBD;
+            p = emit32(p, VEX_TRC_JMP_SIGSEGV); break;
          case Ijk_Ret:
         case Ijk_Call:
          case Ijk_Boring:
index 03b29626d33c43a95e64c3f1136055b2043ff3c6..cff1c5318e182a9f5ea3071f20c5210318952e88 100644 (file)
@@ -726,7 +726,8 @@ void ppIRJumpKind ( IRJumpKind kind )
       case Ijk_MapFail:      vex_printf("MapFail"); break;
       case Ijk_TInval:       vex_printf("Invalidate"); break;
       case Ijk_NoRedir:      vex_printf("NoRedir"); break;
-      case Ijk_Trap:         vex_printf("Trap"); break;
+      case Ijk_SigTRAP:      vex_printf("SigTRAP"); break;
+      case Ijk_SigSEGV:      vex_printf("SigSEGV"); break;
       case Ijk_Sys_syscall:  vex_printf("Sys_syscall"); break;
       case Ijk_Sys_int32:    vex_printf("Sys_int32"); break;
       case Ijk_Sys_int128:   vex_printf("Sys_int128"); break;
index 0dc8b2bd3c8dacf3876ea68909731b50425704b7..84daa6aea8c587ea6ccc27ee4ded51dea17cf774 100644 (file)
@@ -1192,7 +1192,8 @@ typedef
       Ijk_MapFail,        /* Vex-provided address translation failed */
       Ijk_TInval,         /* Invalidate translations before continuing. */
       Ijk_NoRedir,        /* Jump to un-redirected guest addr */
-      Ijk_Trap,           /* current instruction did a user trap */
+      Ijk_SigTRAP,        /* current instruction synths SIGTRAP */
+      Ijk_SigSEGV,        /* current instruction synths SIGSEGV */
       /* Unfortunately, various guest-dependent syscall kinds.  They
         all mean: do a syscall before continuing. */
       Ijk_Sys_syscall,    /* amd64 'syscall', ppc 'sc' */
index 91dbf983cf85bce708f11afe564ccdb62e3140dc..4d8a0644ab925a84a1cfea1ca9c268fafffbd95e 100644 (file)
@@ -62,7 +62,9 @@
 #define VEX_TRC_JMP_TINVAL     61  /* invalidate translations before
                                       continuing */
 #define VEX_TRC_JMP_NOREDIR    81  /* jump to undirected guest addr */
-#define VEX_TRC_JMP_TRAP       85  /* deliver trap (SIGTRAP?) before
+#define VEX_TRC_JMP_SIGTRAP    85  /* deliver trap (SIGTRAP) before
+                                      continuing */
+#define VEX_TRC_JMP_SIGSEGV    87  /* deliver segv (SIGSEGV) before
                                       continuing */
 #define VEX_TRC_JMP_EMWARN     63  /* deliver emulation warning before
                                       continuing */