Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
xen.950
5547421d-x86_emulate-fix-EFLAGS-setting-of-CMPX...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5547421d-x86_emulate-fix-EFLAGS-setting-of-CMPXCHG-emulation.patch of Package xen.950
# Commit 2232628ecbab42e7700287204daad71a3ce2208c # Date 2015-05-04 11:55:41 +0200 # Author Eugene Korenevsky <ekorenevsky@gmail.com> # Committer Jan Beulich <jbeulich@suse.com> x86_emulate: fix EFLAGS setting of CMPXCHG emulation CMPXCHG sets CF, PF, AF, SF, and OF flags according to the results of the comparison the rAX with the operand of the instruction. rAX must be the first argument of the comparison (a minuend), the operand must be the second one (a subtrahend). Due to improper order of comparison arguments, CF, PF, AF, SF and OF flags were set incorrectly in the case of inequality. Need to swap them. Signed-off-by: Eugene Korenevsky <ekorenevsky@gmail.com> # Commit 20fd4b70a7647656812b8f276510e09b252db9f7 # Date 2015-05-04 12:03:19 +0200 # Author Eugene Korenevsky <ekorenevsky@gmail.com> # Committer Jan Beulich <jbeulich@suse.com> test_x86_emulate: extend EFLAGS check of CMPXCHG test CMPXCHG: in the case of inequality of the rAX and the operand, need to check CF, PF, AF, SF and OF flags as well. This adjustment covers the fix of incorrect comparison during CMPXCHG emulation. Signed-off-by: Eugene Korenevsky <ekorenevsky@gmail.com> --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -286,7 +286,7 @@ int main(int argc, char **argv) rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || (*res != 0x923456AA) || - ((regs.eflags&0x240) != 0x200) || + ((regs.eflags&0xad5) != 0xa91) || (regs.eax != 0xAABBCCAA) || (regs.ecx != 0xFF) || (regs.eip != (unsigned long)&instr[4]) ) --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -4228,7 +4228,8 @@ x86_emulate( /* Save real source value, then compare EAX against destination. */ src.orig_val = src.val; src.val = _regs.eax; - emulate_2op_SrcV("cmp", src, dst, _regs.eflags); + /* cmp: %%eax - dst ==> dst and src swapped for macro invocation */ + emulate_2op_SrcV("cmp", dst, src, _regs.eflags); if ( _regs.eflags & EFLG_ZF ) { /* Success: write back to memory. */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor