]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
API change: make the handling of syscall-denoting instructions a bit
authorJulian Seward <jseward@acm.org>
Thu, 3 Nov 2005 13:27:24 +0000 (13:27 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 3 Nov 2005 13:27:24 +0000 (13:27 +0000)
more general, so as to facilitate handling different combinations of
syscall/int more easily.

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

VEX/priv/guest-amd64/toIR.c
VEX/priv/guest-ppc32/toIR.c
VEX/priv/guest-x86/toIR.c
VEX/priv/host-amd64/hdefs.c
VEX/priv/host-ppc32/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 ac80db19000b68215b64dfd6522212955d8725c2..24781e7527ffa92201092b21929e8a2186b6b433 100644 (file)
@@ -11516,6 +11516,27 @@ DisResult disInstr_AMD64_WRK (
          goto decode_failure;
       }
 
+   /* ------------------------ INT ------------------------ */
+
+   case 0xCD: { /* INT imm8 */
+      IRJumpKind jk = Ijk_Boring;
+      if (have66orF2orF3(pfx)) goto decode_failure;
+      d64 = getUChar(delta); delta++;
+      switch (d64) {
+         case 32: jk = Ijk_Sys_int32; break;
+         default: goto decode_failure;
+      }
+      guest_RIP_next_mustcheck = True;
+      guest_RIP_next_assumed = guest_RIP_bbstart + delta;
+      jmp_lit(jk, guest_RIP_next_assumed);
+      /* It's important that all ArchRegs carry their up-to-date value
+         at this point.  So we declare an end-of-block here, which
+         forces any TempRegs caching ArchRegs to be flushed. */
+      dres.whatNext = Dis_StopHere;
+      DIP("int $0x%02x\n", (UInt)d64);
+      break;
+   }
+
    /* ------------------------ Jcond, byte offset --------- */
 
    case 0xEB: /* Jb (jump, byte offset) */
@@ -13221,10 +13242,10 @@ DisResult disInstr_AMD64_WRK (
          /* It's important that all guest state is up-to-date
             at this point.  So we declare an end-of-block here, which
             forces any cached guest state to be flushed. */
-        jmp_lit(Ijk_Syscall, guest_RIP_next_assumed);
-        dres.whatNext = Dis_StopHere;
-        DIP("syscall\n");
-        break;
+         jmp_lit(Ijk_Sys_syscall, guest_RIP_next_assumed);
+         dres.whatNext = Dis_StopHere;
+         DIP("syscall\n");
+         break;
 
       /* =-=-=-=-=-=-=-=-=- XADD -=-=-=-=-=-=-=-=-=-= */
 
index 66cb95281353c16e20c6489b5f6b2e51b417dcb0..2a38fa19ab3926d11c13468fd2f867560e310839 100644 (file)
@@ -3132,7 +3132,7 @@ static Bool dis_syslink ( UInt theInstr, DisResult* dres )
       at this point.  So we declare an end-of-block here, which
       forces any TempRegs caching ArchRegs to be flushed. */
    irbb->next     = mkU32( guest_CIA_curr_instr + 4 );
-   irbb->jumpkind = Ijk_Syscall;
+   irbb->jumpkind = Ijk_Sys_syscall;
    
    dres->whatNext = Dis_StopHere;
    return True;
index 0a8dea27f67c876b16d8e80394aa6a23e7042d6a..1fa3e0d04e99bc7c635787e7c80eb35e59b69a6c 100644 (file)
@@ -10637,7 +10637,7 @@ DisResult disInstr_X86_WRK (
       /* It's important that all ArchRegs carry their up-to-date value
          at this point.  So we declare an end-of-block here, which
          forces any TempRegs caching ArchRegs to be flushed. */
-      jmp_lit(Ijk_Syscall,((Addr32)guest_EIP_bbstart)+delta);
+      jmp_lit(Ijk_Sys_int128,((Addr32)guest_EIP_bbstart)+delta);
       dres.whatNext = Dis_StopHere;
       DIP("int $0x80\n");
       break;
@@ -12245,13 +12245,13 @@ DisResult disInstr_X86_WRK (
             is that the return address is not known -- that is
             something that is beyond Vex's knowledge.  So this IR
             forces a return to the scheduler, which can do what it
-            likes to simulate the systemter, but it MUST set this
+            likes to simulate the systenter, but it MUST set this
             thread's guest_EIP field with the continuation address
             before resuming execution.  If that doesn't happen, the
             thread will jump to address zero, which is probably
             fatal. 
          */ 
-         jmp_lit(Ijk_SysenterX86, 0/*bogus next EIP value*/);
+         jmp_lit(Ijk_Sys_sysenter, 0/*bogus next EIP value*/);
          dres.whatNext = Dis_StopHere;
          DIP("sysenter");
          break;
index 383ec274c0b22aac3c696787e698779183d252d2..d361b2333cb6e7e17985790d4121173ad3e0aa61 100644 (file)
@@ -2585,9 +2585,12 @@ Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr* i )
          case Ijk_ClientReq: 
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_CLIENTREQ); break;
-         case Ijk_Syscall: 
+         case Ijk_Sys_syscall: 
             *p++ = 0xBD;
-            p = emit32(p, VEX_TRC_JMP_SYSCALL); break;
+            p = emit32(p, VEX_TRC_JMP_SYS_SYSCALL); break;
+         case Ijk_Sys_int32: 
+            *p++ = 0xBD;
+            p = emit32(p, VEX_TRC_JMP_SYS_INT32); break;
          case Ijk_Yield: 
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_YIELD); break;
index d51161939c419ef98422666573f5369bd56648b7..9764884ae1e6a10eae81afca4ca616a3ccf46373 100644 (file)
@@ -2491,13 +2491,13 @@ Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i )
       
       /* If a non-boring, set GuestStatePtr appropriately. */
       switch (i->Pin.Goto.jk) {
-         case Ijk_ClientReq: trc = VEX_TRC_JMP_CLIENTREQ; break;
-         case Ijk_Syscall:   trc = VEX_TRC_JMP_SYSCALL;   break;
-         case Ijk_Yield:     trc = VEX_TRC_JMP_YIELD;     break;
-         case Ijk_EmWarn:    trc = VEX_TRC_JMP_EMWARN;    break;
-         case Ijk_MapFail:   trc = VEX_TRC_JMP_MAPFAIL;   break;
-         case Ijk_NoDecode:  trc = VEX_TRC_JMP_NODECODE;  break;
-         case Ijk_TInval:    trc = VEX_TRC_JMP_TINVAL;    break;
+         case Ijk_ClientReq:   trc = VEX_TRC_JMP_CLIENTREQ;   break;
+         case Ijk_Sys_syscall: trc = VEX_TRC_JMP_SYS_SYSCALL; break;
+         case Ijk_Yield:       trc = VEX_TRC_JMP_YIELD;       break;
+         case Ijk_EmWarn:      trc = VEX_TRC_JMP_EMWARN;      break;
+         case Ijk_MapFail:     trc = VEX_TRC_JMP_MAPFAIL;     break;
+         case Ijk_NoDecode:    trc = VEX_TRC_JMP_NODECODE;    break;
+         case Ijk_TInval:      trc = VEX_TRC_JMP_TINVAL;      break;
          case Ijk_Ret:
          case Ijk_Call:
          case Ijk_Boring:
index 411553c6257d88f7216b23c432836ab56cb48f12..6355a5772ad19ac992725e5393d767549d87394c 100644 (file)
@@ -2147,9 +2147,9 @@ Int emit_X86Instr ( UChar* buf, Int nbuf, X86Instr* i )
          case Ijk_ClientReq: 
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_CLIENTREQ); break;
-         case Ijk_Syscall: 
+         case Ijk_Sys_int128:
             *p++ = 0xBD;
-            p = emit32(p, VEX_TRC_JMP_SYSCALL); break;
+            p = emit32(p, VEX_TRC_JMP_SYS_INT128); break;
          case Ijk_Yield: 
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_YIELD); break;
@@ -2165,9 +2165,9 @@ Int emit_X86Instr ( UChar* buf, Int nbuf, X86Instr* i )
          case Ijk_TInval:
             *p++ = 0xBD;
             p = emit32(p, VEX_TRC_JMP_TINVAL); break;
-         case Ijk_SysenterX86:
+         case Ijk_Sys_sysenter:
             *p++ = 0xBD;
-            p = emit32(p, VEX_TRC_JMP_SYSENTER_X86); break;
+            p = emit32(p, VEX_TRC_JMP_SYS_SYSENTER); break;
          case Ijk_Ret:
         case Ijk_Call:
          case Ijk_Boring:
index 1dcdd1cbcb9828f702eb4bf057958aeb85f4912d..7297ac1f3d266b9b50c1e068e086b20d9317e8dd 100644 (file)
@@ -653,18 +653,20 @@ void ppIRDirty ( IRDirty* d )
 void ppIRJumpKind ( IRJumpKind kind )
 {
    switch (kind) {
-      case Ijk_Boring:      vex_printf("Boring"); break;
-      case Ijk_Call:        vex_printf("Call"); break;
-      case Ijk_Ret:         vex_printf("Return"); break;
-      case Ijk_ClientReq:   vex_printf("ClientReq"); break;
-      case Ijk_Syscall:     vex_printf("Syscall"); break;
-      case Ijk_Yield:       vex_printf("Yield"); break;
-      case Ijk_EmWarn:      vex_printf("EmWarn"); break;
-      case Ijk_NoDecode:    vex_printf("NoDecode"); break;
-      case Ijk_MapFail:     vex_printf("MapFail"); break;
-      case Ijk_TInval:      vex_printf("Invalidate"); break;
-      case Ijk_SysenterX86: vex_printf("SysenterX86"); break;
-      default:              vpanic("ppIRJumpKind");
+      case Ijk_Boring:       vex_printf("Boring"); break;
+      case Ijk_Call:         vex_printf("Call"); break;
+      case Ijk_Ret:          vex_printf("Return"); break;
+      case Ijk_ClientReq:    vex_printf("ClientReq"); break;
+      case Ijk_Yield:        vex_printf("Yield"); break;
+      case Ijk_EmWarn:       vex_printf("EmWarn"); break;
+      case Ijk_NoDecode:     vex_printf("NoDecode"); break;
+      case Ijk_MapFail:      vex_printf("MapFail"); break;
+      case Ijk_TInval:       vex_printf("Invalidate"); 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;
+      case Ijk_Sys_sysenter: vex_printf("Sys_sysenter"); break;
+      default:               vpanic("ppIRJumpKind");
    }
 }
 
index b0d2de4398559d8ce9e4cb552b5ec0f7e18e2460..2f4049dbc1627506894a3f634760233992e8d2f8 100644 (file)
@@ -833,14 +833,18 @@ typedef
       Ijk_Call,           /* guest is doing a call */
       Ijk_Ret,            /* guest is doing a return */
       Ijk_ClientReq,      /* do guest client req before continuing */
-      Ijk_Syscall,        /* do guest syscall before continuing */
       Ijk_Yield,          /* client is yielding to thread scheduler */
       Ijk_EmWarn,         /* report emulation warning before continuing */
       Ijk_NoDecode,       /* next instruction cannot be decoded */
       Ijk_MapFail,        /* Vex-provided address translation failed */
       Ijk_TInval,         /* Invalidate translations before continuing. */
-      Ijk_SysenterX86     /* X86 sysenter.  guest_EIP becomes invalid
-                             at the point this happens. */
+      /* Unfortunately, various guest-dependent syscall kinds.  They
+        all mean: do a syscall before continuing. */
+      Ijk_Sys_syscall,    /* amd64 'syscall', ppc32 'sc' */
+      Ijk_Sys_int32,      /* amd64/x86 'int $0x20' */
+      Ijk_Sys_int128,     /* amd64/x86 'int $0x80' */
+      Ijk_Sys_sysenter    /* x86 'sysenter'.  guest_EIP becomes 
+                             invalid at the point this happens. */
    }
    IRJumpKind;
 
index 8de587dd03b2ea818d0d9cce83d8a945e80f45bb..757ceead25a8b9c003acbf4e4149aa4a9c74f063 100644 (file)
    C-specific constructs in it.
 */
 
-#define VEX_TRC_JMP_TINVAL     13  /* invalidate translations before
+#define VEX_TRC_JMP_TINVAL     61  /* invalidate translations before
                                       continuing */
-#define VEX_TRC_JMP_EMWARN     17  /* deliver emulation warning before
+#define VEX_TRC_JMP_EMWARN     63  /* deliver emulation warning before
                                       continuing */
-#define VEX_TRC_JMP_SYSCALL    19  /* do a system call before continuing */
-#define VEX_TRC_JMP_CLIENTREQ  23  /* do a client req before continuing */
-#define VEX_TRC_JMP_YIELD      27  /* yield to thread sched 
+#define VEX_TRC_JMP_CLIENTREQ  65  /* do a client req before continuing */
+#define VEX_TRC_JMP_YIELD      67  /* yield to thread sched 
                                       before continuing */
-#define VEX_TRC_JMP_NODECODE   29  /* next instruction in not decodable */
-#define VEX_TRC_JMP_MAPFAIL    31  /* address translation failed */
-
-#define VEX_TRC_JMP_SYSENTER_X86 9  /* simulate X86 sysenter before
-                                       continuing */
+#define VEX_TRC_JMP_NODECODE   69  /* next instruction is not decodable */
+#define VEX_TRC_JMP_MAPFAIL    71  /* address translation failed */
 
+#define VEX_TRC_JMP_SYS_SYSCALL  73 /* do syscall before continuing */
+#define VEX_TRC_JMP_SYS_INT32    75 /* do syscall before continuing */
+#define VEX_TRC_JMP_SYS_INT128   77 /* do syscall before continuing */
+#define VEX_TRC_JMP_SYS_SYSENTER 79 /* do syscall before continuing */
 
 #endif /* ndef __LIBVEX_TRC_VALUES_H */