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) */
/* 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 -=-=-=-=-=-=-=-=-=-= */
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;
/* 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;
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;
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;
/* 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:
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;
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:
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");
}
}
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;
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 */