From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?J=FCrgen_Gro=DF?= Subject: Re: [PATCH] tools/tests: Add EIP check to test_x86_emulator.c Date: Thu, 07 Aug 2014 10:23:08 +0200 Message-ID: <53E3376C.9050902@suse.com> References: <1407399362-4106-1-git-send-email-rcojocaru@bitdefender.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1407399362-4106-1-git-send-email-rcojocaru@bitdefender.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Razvan Cojocaru , xen-devel@lists.xen.org Cc: andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, ian.campbell@citrix.com, JBeulich@suse.com, stefano.stabellini@eu.citrix.com List-Id: xen-devel@lists.xenproject.org On 08/07/2014 10:16 AM, Razvan Cojocaru wrote: > The test now also checks that EIP was modified after emulating > instructions after (and including) the "movq %mm3,(%ecx)..." > code block. > > Signed-off-by: Razvan Cojocaru > --- > tools/tests/x86_emulator/test_x86_emulator.c | 30 +++++++++++++++++--------- > 1 file changed, 20 insertions(+), 10 deletions(-) > > diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c > index 0a00d5a..dd4e986 100644 > --- a/tools/tests/x86_emulator/test_x86_emulator.c > +++ b/tools/tests/x86_emulator/test_x86_emulator.c > @@ -615,7 +615,8 @@ int main(int argc, char **argv) > regs.eip = (unsigned long)&instr[0]; > regs.ecx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) ) > + if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) || > + (regs.eip == (unsigned long)&instr[0]) ) Is really any modification okay? I think the test should check for the correct EIP, not just for one of 2^64 - 1 incorrect values. > goto fail; > printf("okay\n"); > } > @@ -637,7 +638,8 @@ int main(int argc, char **argv) > regs.ecx = 0; > regs.edx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( rc != X86EMUL_OKAY ) > + if ( rc != X86EMUL_OKAY || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > asm ( "pcmpeqb %%mm3, %%mm3\n\t" > "pcmpeqb %%mm5, %%mm3\n\t" > @@ -665,7 +667,8 @@ int main(int argc, char **argv) > regs.eip = (unsigned long)&instr[0]; > regs.ecx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) ) > + if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > printf("okay\n"); > } > @@ -687,7 +690,8 @@ int main(int argc, char **argv) > regs.ecx = 0; > regs.edx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( rc != X86EMUL_OKAY ) > + if ( rc != X86EMUL_OKAY || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > asm ( "pcmpeqb %%xmm2, %%xmm2\n\t" > "pcmpeqb %%xmm4, %%xmm2\n\t" > @@ -716,7 +720,8 @@ int main(int argc, char **argv) > regs.eip = (unsigned long)&instr[0]; > regs.ecx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 16, 64) ) > + if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 16, 64) || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > printf("okay\n"); > } > @@ -744,7 +749,8 @@ int main(int argc, char **argv) > regs.ecx = 0; > regs.edx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( rc != X86EMUL_OKAY ) > + if ( rc != X86EMUL_OKAY || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > #if 0 /* Don't use AVX2 instructions for now */ > asm ( "vpcmpeqb %%ymm2, %%ymm2, %%ymm2\n\t" > @@ -784,7 +790,8 @@ int main(int argc, char **argv) > regs.ecx = (unsigned long)(res + 2); > regs.edx = 0; > rc = x86_emulate(&ctxt, &emulops); > - if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) ) > + if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > printf("okay\n"); > } > @@ -809,7 +816,8 @@ int main(int argc, char **argv) > regs.ecx = 0; > regs.edx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( rc != X86EMUL_OKAY ) > + if ( rc != X86EMUL_OKAY || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > asm ( "cmpeqps %1, %%xmm7\n\t" > "movmskps %%xmm7, %0" : "=r" (rc) : "m" (res[8]) ); > @@ -837,7 +845,8 @@ int main(int argc, char **argv) > regs.ecx = (unsigned long)(res + 2); > regs.edx = 0; > rc = x86_emulate(&ctxt, &emulops); > - if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) ) > + if ( (rc != X86EMUL_OKAY) || memcmp(res, res + 8, 32) || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > printf("okay\n"); > } > @@ -862,7 +871,8 @@ int main(int argc, char **argv) > regs.ecx = 0; > regs.edx = (unsigned long)res; > rc = x86_emulate(&ctxt, &emulops); > - if ( rc != X86EMUL_OKAY ) > + if ( rc != X86EMUL_OKAY || > + (regs.eip == (unsigned long)&instr[0]) ) > goto fail; > asm ( "vcmpeqps %1, %%ymm7, %%ymm0\n\t" > "vmovmskps %%ymm0, %0" : "=r" (rc) : "m" (res[8]) ); >