|
From: <sv...@va...> - 2005-11-03 13:27:32
|
Author: sewardj
Date: 2005-11-03 13:27:24 +0000 (Thu, 03 Nov 2005)
New Revision: 1429
Log:
API change: make the handling of syscall-denoting instructions a bit
more general, so as to facilitate handling different combinations of
syscall/int more easily.
Modified:
trunk/priv/guest-amd64/toIR.c
trunk/priv/guest-ppc32/toIR.c
trunk/priv/guest-x86/toIR.c
trunk/priv/host-amd64/hdefs.c
trunk/priv/host-ppc32/hdefs.c
trunk/priv/host-x86/hdefs.c
trunk/priv/ir/irdefs.c
trunk/pub/libvex_ir.h
trunk/pub/libvex_trc_values.h
Modified: trunk/priv/guest-amd64/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-amd64/toIR.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/guest-amd64/toIR.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -11516,6 +11516,27 @@
goto decode_failure;
}
=20
+ /* ------------------------ INT ------------------------ */
+
+ case 0xCD: { /* INT imm8 */
+ IRJumpKind jk =3D Ijk_Boring;
+ if (have66orF2orF3(pfx)) goto decode_failure;
+ d64 =3D getUChar(delta); delta++;
+ switch (d64) {
+ case 32: jk =3D Ijk_Sys_int32; break;
+ default: goto decode_failure;
+ }
+ guest_RIP_next_mustcheck =3D True;
+ guest_RIP_next_assumed =3D 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 =3D Dis_StopHere;
+ DIP("int $0x%02x\n", (UInt)d64);
+ break;
+ }
+
/* ------------------------ Jcond, byte offset --------- */
=20
case 0xEB: /* Jb (jump, byte offset) */
@@ -13221,10 +13242,10 @@
/* 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 =3D Dis_StopHere;
- DIP("syscall\n");
- break;
+ jmp_lit(Ijk_Sys_syscall, guest_RIP_next_assumed);
+ dres.whatNext =3D Dis_StopHere;
+ DIP("syscall\n");
+ break;
=20
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- XADD -=3D-=3D-=3D-=3D-=3D-=
=3D-=3D-=3D-=3D-=3D */
=20
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/guest-ppc32/toIR.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -3132,7 +3132,7 @@
at this point. So we declare an end-of-block here, which
forces any TempRegs caching ArchRegs to be flushed. */
irbb->next =3D mkU32( guest_CIA_curr_instr + 4 );
- irbb->jumpkind =3D Ijk_Syscall;
+ irbb->jumpkind =3D Ijk_Sys_syscall;
=20
dres->whatNext =3D Dis_StopHere;
return True;
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/guest-x86/toIR.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -10637,7 +10637,7 @@
/* 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 =3D Dis_StopHere;
DIP("int $0x80\n");
break;
@@ -12245,13 +12245,13 @@
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.=20
*/=20
- jmp_lit(Ijk_SysenterX86, 0/*bogus next EIP value*/);
+ jmp_lit(Ijk_Sys_sysenter, 0/*bogus next EIP value*/);
dres.whatNext =3D Dis_StopHere;
DIP("sysenter");
break;
Modified: trunk/priv/host-amd64/hdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-amd64/hdefs.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/host-amd64/hdefs.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -2585,9 +2585,12 @@
case Ijk_ClientReq:=20
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_CLIENTREQ); break;
- case Ijk_Syscall:=20
+ case Ijk_Sys_syscall:=20
*p++ =3D 0xBD;
- p =3D emit32(p, VEX_TRC_JMP_SYSCALL); break;
+ p =3D emit32(p, VEX_TRC_JMP_SYS_SYSCALL); break;
+ case Ijk_Sys_int32:=20
+ *p++ =3D 0xBD;
+ p =3D emit32(p, VEX_TRC_JMP_SYS_INT32); break;
case Ijk_Yield:=20
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_YIELD); break;
Modified: trunk/priv/host-ppc32/hdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-ppc32/hdefs.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/host-ppc32/hdefs.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -2491,13 +2491,13 @@
=20
/* If a non-boring, set GuestStatePtr appropriately. */
switch (i->Pin.Goto.jk) {
- case Ijk_ClientReq: trc =3D VEX_TRC_JMP_CLIENTREQ; break;
- case Ijk_Syscall: trc =3D VEX_TRC_JMP_SYSCALL; break;
- case Ijk_Yield: trc =3D VEX_TRC_JMP_YIELD; break;
- case Ijk_EmWarn: trc =3D VEX_TRC_JMP_EMWARN; break;
- case Ijk_MapFail: trc =3D VEX_TRC_JMP_MAPFAIL; break;
- case Ijk_NoDecode: trc =3D VEX_TRC_JMP_NODECODE; break;
- case Ijk_TInval: trc =3D VEX_TRC_JMP_TINVAL; break;
+ case Ijk_ClientReq: trc =3D VEX_TRC_JMP_CLIENTREQ; break;
+ case Ijk_Sys_syscall: trc =3D VEX_TRC_JMP_SYS_SYSCALL; break;
+ case Ijk_Yield: trc =3D VEX_TRC_JMP_YIELD; break;
+ case Ijk_EmWarn: trc =3D VEX_TRC_JMP_EMWARN; break;
+ case Ijk_MapFail: trc =3D VEX_TRC_JMP_MAPFAIL; break;
+ case Ijk_NoDecode: trc =3D VEX_TRC_JMP_NODECODE; break;
+ case Ijk_TInval: trc =3D VEX_TRC_JMP_TINVAL; break;
case Ijk_Ret:
case Ijk_Call:
case Ijk_Boring:
Modified: trunk/priv/host-x86/hdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-x86/hdefs.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/host-x86/hdefs.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -2147,9 +2147,9 @@
case Ijk_ClientReq:=20
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_CLIENTREQ); break;
- case Ijk_Syscall:=20
+ case Ijk_Sys_int128:
*p++ =3D 0xBD;
- p =3D emit32(p, VEX_TRC_JMP_SYSCALL); break;
+ p =3D emit32(p, VEX_TRC_JMP_SYS_INT128); break;
case Ijk_Yield:=20
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_YIELD); break;
@@ -2165,9 +2165,9 @@
case Ijk_TInval:
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_TINVAL); break;
- case Ijk_SysenterX86:
+ case Ijk_Sys_sysenter:
*p++ =3D 0xBD;
- p =3D emit32(p, VEX_TRC_JMP_SYSENTER_X86); break;
+ p =3D emit32(p, VEX_TRC_JMP_SYS_SYSENTER); break;
case Ijk_Ret:
case Ijk_Call:
case Ijk_Boring:
Modified: trunk/priv/ir/irdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/ir/irdefs.c 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/priv/ir/irdefs.c 2005-11-03 13:27:24 UTC (rev 1429)
@@ -653,18 +653,20 @@
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");
}
}
=20
Modified: trunk/pub/libvex_ir.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/pub/libvex_ir.h 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/pub/libvex_ir.h 2005-11-03 13:27:24 UTC (rev 1429)
@@ -833,14 +833,18 @@
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=20
+ invalid at the point this happens. */
}
IRJumpKind;
=20
Modified: trunk/pub/libvex_trc_values.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/pub/libvex_trc_values.h 2005-11-03 13:19:33 UTC (rev 1428)
+++ trunk/pub/libvex_trc_values.h 2005-11-03 13:27:24 UTC (rev 1429)
@@ -56,21 +56,21 @@
C-specific constructs in it.
*/
=20
-#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=20
+#define VEX_TRC_JMP_CLIENTREQ 65 /* do a client req before continuing =
*/
+#define VEX_TRC_JMP_YIELD 67 /* yield to thread sched=20
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_NODECODE 69 /* next instruction is not decodable =
*/
+#define VEX_TRC_JMP_MAPFAIL 71 /* address translation failed */
=20
-#define VEX_TRC_JMP_SYSENTER_X86 9 /* simulate X86 sysenter before
- continuing */
+#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 */
=20
-
#endif /* ndef __LIBVEX_TRC_VALUES_H */
=20
/*---------------------------------------------------------------*/
|