|
From: <sv...@va...> - 2005-12-02 13:53:53
|
Author: sewardj
Date: 2005-12-02 13:53:39 +0000 (Fri, 02 Dec 2005)
New Revision: 1481
Log:
When requested by Valgrind, put a "no-redirect" test at the start of
translations. This checks a new guest pseudo-register (guest_NOREDIR)
and if non-zero, it causes the translation to exit immediately,
requesting a transfer to a non-redirected version of itself. This is
a minimal hook needed to get from a function's wrapper back to the
original function, without being endlessly diverted to the wrapper.
Currently is inadequate (will go wrong if any other intercepted
function is encountered on the path between f's wrapper and f) but
that can be fixed.
Modified:
branches/FNWRAP/priv/guest-generic/bb_to_IR.c
branches/FNWRAP/priv/guest-generic/bb_to_IR.h
branches/FNWRAP/priv/guest-x86/ghelpers.c
branches/FNWRAP/priv/host-x86/hdefs.c
branches/FNWRAP/priv/ir/irdefs.c
branches/FNWRAP/priv/main/vex_main.c
branches/FNWRAP/pub/libvex.h
branches/FNWRAP/pub/libvex_guest_amd64.h
branches/FNWRAP/pub/libvex_guest_ppc32.h
branches/FNWRAP/pub/libvex_guest_x86.h
branches/FNWRAP/pub/libvex_ir.h
branches/FNWRAP/pub/libvex_trc_values.h
branches/FNWRAP/test_main.c
Modified: branches/FNWRAP/priv/guest-generic/bb_to_IR.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
--- branches/FNWRAP/priv/guest-generic/bb_to_IR.c 2005-12-02 13:30:11 UTC=
(rev 1480)
+++ branches/FNWRAP/priv/guest-generic/bb_to_IR.c 2005-12-02 13:53:39 UTC=
(rev 1481)
@@ -82,13 +82,16 @@
/*IN*/ DisOneInstrFn dis_instr_fn,
/*IN*/ UChar* guest_code,
/*IN*/ Addr64 guest_IP_bbstart,
+ /*IN*/ Addr64 guest_IP_bbstart_noredir,
/*IN*/ Bool (*chase_into_ok)(Addr64),
/*IN*/ Bool host_bigendian,
/*IN*/ VexArchInfo* archinfo_guest,
/*IN*/ IRType guest_word_type,
/*IN*/ Bool do_self_check,
+ /*IN*/ Bool do_noredir_check,
/*IN*/ Int offB_TISTART,
- /*IN*/ Int offB_TILEN )
+ /*IN*/ Int offB_TILEN,
+ /*IN*/ Int offB_NOREDIR )
{
Long delta;
Int i, n_instrs, first_stmt_idx;
@@ -100,6 +103,8 @@
Int selfcheck_idx =3D 0;
IRBB* irbb;
Addr64 guest_IP_curr_instr;
+ IRConst* guest_IP_bbstart_IRConst =3D NULL;
+ IRConst* guest_IP_bbstart_noredir_IRConst =3D NULL;
=20
Bool (*resteerOKfn)(Addr64) =3D NULL;
=20
@@ -131,6 +136,48 @@
delta =3D 0;
n_instrs =3D 0;
=20
+ /* Guest addresses as IRConsts. Used in the two self-checks
+ generated. */
+ if (do_self_check) {
+ guest_IP_bbstart_IRConst
+ =3D guest_word_type=3D=3DIty_I32=20
+ ? IRConst_U32(toUInt(guest_IP_bbstart))
+ : IRConst_U64(guest_IP_bbstart);
+ }
+
+ if (do_noredir_check) {
+ guest_IP_bbstart_noredir_IRConst
+ =3D guest_word_type=3D=3DIty_I32=20
+ ? IRConst_U32(toUInt(guest_IP_bbstart_noredir))
+ : IRConst_U64(guest_IP_bbstart_noredir);
+ }
+
+ /* If asked to make a noredir-check, put it before the self-check.
+ The noredir-check checks whether we should be running code at
+ this guest address at all, whereas the self-check establishes
+ whether the translation is still valid once we've decided we
+ should be here. So the noredir check comes first. */
+ if (do_noredir_check) {
+ IRTemp noredir_tmp =3D newIRTemp(irbb->tyenv, guest_word_type);
+ IRExpr* zero =3D guest_word_type=3D=3DIty_I32=20
+ ? IRExpr_Const(IRConst_U32(0))=20
+ : IRExpr_Const(IRConst_U64(0));
+ IROp cmpNE =3D guest_word_type=3D=3DIty_I32 ? Iop_CmpNE32 : Iop_Cm=
pNE64;
+
+ /* fetch old setting */
+ addStmtToIRBB( irbb,=20
+ IRStmt_Tmp( noredir_tmp,=20
+ IRExpr_Get( offB_NOREDIR, guest_word_type)));
+ /* zero it */
+ addStmtToIRBB( irbb,
+ IRStmt_Put( offB_NOREDIR, zero ));
+ /* exit if it wasn't zero */
+ addStmtToIRBB( irbb,
+ IRStmt_Exit( IRExpr_Binop( cmpNE, IRExpr_Tmp(noredir_tmp), zero=
),
+ Ijk_NoRedir,
+ guest_IP_bbstart_noredir_IRConst ));
+ }
+
/* If asked to make a self-checking translation, leave a 5 spaces
in which to put the check statements. We'll fill them in later
when we know the length and adler32 of the area to check. */
@@ -298,7 +345,6 @@
if (do_self_check) {
=20
UInt len2check, adler32;
- IRConst* guest_IP_bbstart_IRConst;
IRTemp tistart_tmp, tilen_tmp;
=20
vassert(vge->n_used =3D=3D 1);
@@ -308,11 +354,6 @@
=20
adler32 =3D genericg_compute_adler32( (HWord)guest_code, len2check =
);
=20
- guest_IP_bbstart_IRConst
- =3D guest_word_type=3D=3DIty_I32=20
- ? IRConst_U32(toUInt(guest_IP_bbstart))
- : IRConst_U64(guest_IP_bbstart);
-
/* Set TISTART and TILEN. These will describe to the despatcher
the area of guest code to invalidate should we exit with a
self-check failure. */
Modified: branches/FNWRAP/priv/guest-generic/bb_to_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
--- branches/FNWRAP/priv/guest-generic/bb_to_IR.h 2005-12-02 13:30:11 UTC=
(rev 1480)
+++ branches/FNWRAP/priv/guest-generic/bb_to_IR.h 2005-12-02 13:53:39 UTC=
(rev 1481)
@@ -154,13 +154,16 @@
/*IN*/ DisOneInstrFn dis_instr_fn,
/*IN*/ UChar* guest_code,
/*IN*/ Addr64 guest_IP_bbstart,
+ /*IN*/ Addr64 guest_IP_bbstart_noredir,
/*IN*/ Bool (*chase_into_ok)(Addr64),
/*IN*/ Bool host_bigendian,
/*IN*/ VexArchInfo* archinfo_guest,
/*IN*/ IRType guest_word_type,
/*IN*/ Bool do_self_check,
+ /*IN*/ Bool do_noredir_check,
/*IN*/ Int offB_TISTART,
- /*IN*/ Int offB_TILEN );
+ /*IN*/ Int offB_TILEN,
+ /*IN*/ Int offB_NOREDIR );
=20
=20
#endif /* ndef GENERIC_BB_TO_IR_H */
Modified: branches/FNWRAP/priv/guest-x86/ghelpers.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
--- branches/FNWRAP/priv/guest-x86/ghelpers.c 2005-12-02 13:30:11 UTC (re=
v 1480)
+++ branches/FNWRAP/priv/guest-x86/ghelpers.c 2005-12-02 13:53:39 UTC (re=
v 1481)
@@ -2225,6 +2225,8 @@
/* SSE2 has a 'clflush' cache-line-invalidator which uses these. */
vex_state->guest_TISTART =3D 0;
vex_state->guest_TILEN =3D 0;
+
+ vex_state->guest_NOREDIR =3D 0;
}
=20
=20
Modified: branches/FNWRAP/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
--- branches/FNWRAP/priv/host-x86/hdefs.c 2005-12-02 13:30:11 UTC (rev 14=
80)
+++ branches/FNWRAP/priv/host-x86/hdefs.c 2005-12-02 13:53:39 UTC (rev 14=
81)
@@ -2165,6 +2165,9 @@
case Ijk_TInval:
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_TINVAL); break;
+ case Ijk_NoRedir:
+ *p++ =3D 0xBD;
+ p =3D emit32(p, VEX_TRC_JMP_NOREDIR); break;
case Ijk_Sys_sysenter:
*p++ =3D 0xBD;
p =3D emit32(p, VEX_TRC_JMP_SYS_SYSENTER); break;
Modified: branches/FNWRAP/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
--- branches/FNWRAP/priv/ir/irdefs.c 2005-12-02 13:30:11 UTC (rev 1480)
+++ branches/FNWRAP/priv/ir/irdefs.c 2005-12-02 13:53:39 UTC (rev 1481)
@@ -679,6 +679,7 @@
case Ijk_NoDecode: vex_printf("NoDecode"); break;
case Ijk_MapFail: vex_printf("MapFail"); break;
case Ijk_TInval: vex_printf("Invalidate"); break;
+ case Ijk_NoRedir: vex_printf("NoRedir"); 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;
Modified: branches/FNWRAP/priv/main/vex_main.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
--- branches/FNWRAP/priv/main/vex_main.c 2005-12-02 13:30:11 UTC (rev 148=
0)
+++ branches/FNWRAP/priv/main/vex_main.c 2005-12-02 13:53:39 UTC (rev 148=
1)
@@ -207,7 +207,9 @@
/* IN: optionally, an access check function for guest code. */
Bool (*byte_accessible) ( Addr64 ),
/* IN: debug: trace vex activity at various points */
- Int traceflags
+ Int traceflags,
+ /* IN: should this translation do a check of guest_NOREDIR ? */
+ Bool do_noredir_check
)
{
/* This the bundle of functions we need to do the back-end stuff
@@ -235,7 +237,7 @@
HInstrArray* vcode;
HInstrArray* rcode;
Int i, j, k, out_used, guest_sizeB;
- Int offB_TISTART, offB_TILEN;
+ Int offB_TISTART, offB_TILEN, offB_NOREDIR;
UChar insn_bytes[32];
IRType guest_word_type;
IRType host_word_type;
@@ -259,6 +261,7 @@
host_word_type =3D Ity_INVALID;
offB_TISTART =3D 0;
offB_TILEN =3D 0;
+ offB_NOREDIR =3D 0;
=20
vex_traceflags =3D traceflags;
=20
@@ -342,12 +345,14 @@
guest_layout =3D &x86guest_layout;
offB_TISTART =3D offsetof(VexGuestX86State,guest_TISTART);
offB_TILEN =3D offsetof(VexGuestX86State,guest_TILEN);
+ offB_NOREDIR =3D offsetof(VexGuestX86State,guest_NOREDIR);
vassert(archinfo_guest->subarch =3D=3D VexSubArchX86_sse0
|| archinfo_guest->subarch =3D=3D VexSubArchX86_sse1
|| archinfo_guest->subarch =3D=3D VexSubArchX86_sse2);
vassert(0 =3D=3D sizeof(VexGuestX86State) % 8);
vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART ) =3D=3D =
4);
- vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) =3D=3D 4)=
;
+ vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) =3D=3D =
4);
+ vassert(sizeof( ((VexGuestX86State*)0)->guest_NOREDIR ) =3D=3D =
4);
break;
=20
case VexArchAMD64:
@@ -359,10 +364,12 @@
guest_layout =3D &amd64guest_layout;
offB_TISTART =3D offsetof(VexGuestAMD64State,guest_TISTART)=
;
offB_TILEN =3D offsetof(VexGuestAMD64State,guest_TILEN);
+ offB_NOREDIR =3D offsetof(VexGuestAMD64State,guest_NOREDIR)=
;
vassert(archinfo_guest->subarch =3D=3D VexSubArch_NONE);
vassert(0 =3D=3D sizeof(VexGuestAMD64State) % 8);
vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) =3D=3D=
8);
- vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) =3D=3D =
8);
+ vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) =3D=3D=
8);
+ vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NOREDIR ) =3D=3D=
8);
break;
=20
case VexArchARM:
@@ -374,6 +381,7 @@
guest_layout =3D &armGuest_layout;
offB_TISTART =3D 0; /* hack ... arm has bitrot */
offB_TILEN =3D 0; /* hack ... arm has bitrot */
+ offB_NOREDIR =3D 0; /* hack ... arm has bitrot */
vassert(archinfo_guest->subarch =3D=3D VexSubArchARM_v4);
break;
=20
@@ -386,12 +394,14 @@
guest_layout =3D &ppc32Guest_layout;
offB_TISTART =3D offsetof(VexGuestPPC32State,guest_TISTART)=
;
offB_TILEN =3D offsetof(VexGuestPPC32State,guest_TILEN);
+ offB_NOREDIR =3D offsetof(VexGuestPPC32State,guest_NOREDIR)=
;
vassert(archinfo_guest->subarch =3D=3D VexSubArchPPC32_I
|| archinfo_guest->subarch =3D=3D VexSubArchPPC32_FI
|| archinfo_guest->subarch =3D=3D VexSubArchPPC32_VFI);
vassert(0 =3D=3D sizeof(VexGuestPPC32State) % 8);
vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) =3D=3D=
4);
- vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) =3D=3D =
4);
+ vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) =3D=3D=
4);
+ vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NOREDIR ) =3D=3D=
4);
break;
=20
default:
@@ -417,13 +427,16 @@
disInstrFn,
guest_bytes,=20
guest_bytes_addr,
+ guest_bytes_addr_noredir,
chase_into_ok,
host_is_bigendian,
archinfo_guest,
guest_word_type,
do_self_check,
+ do_noredir_check,
offB_TISTART,
- offB_TILEN );
+ offB_TILEN,
+ offB_NOREDIR );
=20
vexAllocSanityCheck();
=20
Modified: branches/FNWRAP/pub/libvex.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
--- branches/FNWRAP/pub/libvex.h 2005-12-02 13:30:11 UTC (rev 1480)
+++ branches/FNWRAP/pub/libvex.h 2005-12-02 13:53:39 UTC (rev 1481)
@@ -337,7 +337,9 @@
/* IN: optionally, an access check function for guest code. */
Bool (*byte_accessible) ( Addr64 ),
/* IN: debug: trace vex activity at various points */
- Int traceflags
+ Int traceflags,
+ /* IN: should this translation do a check of guest_NOREDIR ? */
+ Bool do_noredir_check
);
=20
/* A subtlety re interaction between self-checking translations and
@@ -399,6 +401,12 @@
guest code, translations of which are to be invalidated, back to
the despatcher. Both pseudo-regs must have size equal to the guest
word size.
+
+ The architecture must contain a third pseudo-register,
+ guest_NOREDIR, which is guest-word-sized. This is tested and
+ zeroed at the start of translations of redirected blocks (under
+ LibVEX's client's control), and the block immediately exited if it
+ is set.
*/
#endif /* ndef __LIBVEX_H */
=20
Modified: branches/FNWRAP/pub/libvex_guest_amd64.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
--- branches/FNWRAP/pub/libvex_guest_amd64.h 2005-12-02 13:30:11 UTC (rev=
1480)
+++ branches/FNWRAP/pub/libvex_guest_amd64.h 2005-12-02 13:53:39 UTC (rev=
1481)
@@ -145,6 +145,11 @@
ULong guest_TISTART;
ULong guest_TILEN;
=20
+ /* Affects behaviour on entry to redirected translations: if
+ nonzero, will cause an immediate exit and attempt to execute
+ the non-redirected version instead. Is almost always zero. */
+ ULong guest_NOREDIR;
+
/* Padding to make it have an 8-aligned size */
/* UInt padding; */
}
Modified: branches/FNWRAP/pub/libvex_guest_ppc32.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
--- branches/FNWRAP/pub/libvex_guest_ppc32.h 2005-12-02 13:30:11 UTC (rev=
1480)
+++ branches/FNWRAP/pub/libvex_guest_ppc32.h 2005-12-02 13:53:39 UTC (rev=
1481)
@@ -199,14 +199,19 @@
/* Emulation warnings */
/* 940 */ UInt guest_EMWARN;
=20
- /* For icbi: record start and length of area to invalidate */
- /* 944 */ UInt guest_TISTART;
- /* 948 */ UInt guest_TILEN;
-
/* For lwarx/stwcx.: 0 =3D=3D no reservation exists, non-0 =3D=3D =
a
reservation exists. */
- /* 952 */ UInt guest_RESVN;
+ /* 944 */ UInt guest_RESVN;
=20
+ /* For icbi: record start and length of area to invalidate */
+ /* 948 */ UInt guest_TISTART;
+ /* 952 */ UInt guest_TILEN;
+
+ /* Affects behaviour on entry to redirected translations: if
+ nonzero, will cause an immediate exit and attempt to execute
+ the non-redirected version instead. Is almost always zero. */
+ /* 956 */ UInt guest_NOREDIR;
+
/* Padding to make it have an 8-aligned size */
UInt padding;
}
Modified: branches/FNWRAP/pub/libvex_guest_x86.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
--- branches/FNWRAP/pub/libvex_guest_x86.h 2005-12-02 13:30:11 UTC (rev 1=
480)
+++ branches/FNWRAP/pub/libvex_guest_x86.h 2005-12-02 13:53:39 UTC (rev 1=
481)
@@ -218,8 +218,13 @@
UInt guest_TISTART;
UInt guest_TILEN;
=20
+ /* Affects behaviour on entry to redirected translations: if
+ nonzero, will cause an immediate exit and attempt to execute
+ the non-redirected version instead. Is almost always zero. */
+ UInt guest_NOREDIR;
+
/* Padding to make it have an 8-aligned size */
- /* UInt padding; */
+ UInt padding;
}
VexGuestX86State;
=20
Modified: branches/FNWRAP/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
--- branches/FNWRAP/pub/libvex_ir.h 2005-12-02 13:30:11 UTC (rev 1480)
+++ branches/FNWRAP/pub/libvex_ir.h 2005-12-02 13:53:39 UTC (rev 1481)
@@ -853,6 +853,7 @@
Ijk_NoDecode, /* next instruction cannot be decoded */
Ijk_MapFail, /* Vex-provided address translation failed */
Ijk_TInval, /* Invalidate translations before continuing. =
*/
+ Ijk_NoRedir, /* Jump to un-redirected guest addr */
/* Unfortunately, various guest-dependent syscall kinds. They
all mean: do a syscall before continuing. */
Ijk_Sys_syscall, /* amd64 'syscall', ppc32 'sc' */
Modified: branches/FNWRAP/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
--- branches/FNWRAP/pub/libvex_trc_values.h 2005-12-02 13:30:11 UTC (rev =
1480)
+++ branches/FNWRAP/pub/libvex_trc_values.h 2005-12-02 13:53:39 UTC (rev =
1481)
@@ -58,6 +58,7 @@
=20
#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_EMWARN 63 /* deliver emulation warning before
continuing */
#define VEX_TRC_JMP_CLIENTREQ 65 /* do a client req before continuing =
*/
Modified: branches/FNWRAP/test_main.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
--- branches/FNWRAP/test_main.c 2005-12-02 13:30:11 UTC (rev 1480)
+++ branches/FNWRAP/test_main.c 2005-12-02 13:53:39 UTC (rev 1481)
@@ -169,7 +169,8 @@
#endif
False, /* do_self_check ? */
NULL, /* access checker */
- TEST_FLAGS=20
+ TEST_FLAGS,
+ False /* do_noredir_check */
);
=20
if (tres !=3D VexTransOK)
|