From: Tom Hughes Date: Sun, 9 Feb 2014 11:40:20 +0000 (+0000) Subject: Add support for syscall on x86 X-Git-Tag: svn/VALGRIND_3_10_1^2~156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4c29add9dade5fce495c0dcb8f217559e3f747c1;p=thirdparty%2Fvalgrind.git Add support for syscall on x86 Patch from Ivo Raisr via BZ#330939 also fixes BZ#308729 git-svn-id: svn://svn.valgrind.org/vex/trunk@2814 --- diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c index 6af1f3e4a7..e24105b1f7 100644 --- a/VEX/priv/guest_x86_toIR.c +++ b/VEX/priv/guest_x86_toIR.c @@ -15222,6 +15222,14 @@ DisResult disInstr_X86_WRK ( break; } + case 0x05: /* AMD's syscall */ + stmt( IRStmt_Put( OFFB_IP_AT_SYSCALL, + mkU32(guest_EIP_curr_instr) ) ); + jmp_lit(&dres, Ijk_Sys_syscall, ((Addr32)guest_EIP_bbstart)+delta); + vassert(dres.whatNext == Dis_StopHere); + DIP("syscall\n"); + break; + /* =-=-=-=-=-=-=-=-=- unimp2 =-=-=-=-=-=-=-=-=-=-= */ default: diff --git a/VEX/priv/host_x86_isel.c b/VEX/priv/host_x86_isel.c index a3a45fa24f..090e9aafdd 100644 --- a/VEX/priv/host_x86_isel.c +++ b/VEX/priv/host_x86_isel.c @@ -4280,6 +4280,7 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) case Ijk_Sys_int128: case Ijk_Sys_int129: case Ijk_Sys_int130: + case Ijk_Sys_syscall: case Ijk_Sys_sysenter: case Ijk_TInval: case Ijk_Yield: @@ -4378,6 +4379,7 @@ static void iselNext ( ISelEnv* env, case Ijk_Sys_int128: case Ijk_Sys_int129: case Ijk_Sys_int130: + case Ijk_Sys_syscall: case Ijk_Sys_sysenter: case Ijk_TInval: case Ijk_Yield: diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index 38a3b18e57..609ff8fc75 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -2111,7 +2111,7 @@ typedef Ijk_SigFPE_IntOvf, /* current instruction synths SIGFPE - IntOvf */ /* Unfortunately, various guest-dependent syscall kinds. They all mean: do a syscall before continuing. */ - Ijk_Sys_syscall, /* amd64 'syscall', ppc 'sc', arm 'svc #0' */ + Ijk_Sys_syscall, /* amd64/x86 'syscall', ppc 'sc', arm 'svc #0' */ Ijk_Sys_int32, /* amd64/x86 'int $0x20' */ Ijk_Sys_int128, /* amd64/x86 'int $0x80' */ Ijk_Sys_int129, /* amd64/x86 'int $0x81' */