[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] x86_emulate fix



The x86_emulate code uses the _PRE_EFLAGS macro to setup eflags
immediately before executing (an emulated version of) the instruction.
But _PRE_EFLAGS ends in a "andl" instruction, which clobbers the real
eflags we've just carefully set up.  This fix simply leaves the new
eflags value on the stack until the final "popf" into eflags.

Signed-off-by: David Lively <dlively@xxxxxxxxxxxxxxx>

diff -r 85791ff698bd xen/arch/x86/x86_emulate.c
--- a/xen/arch/x86/x86_emulate.c        Fri Oct 19 11:31:38 2007 -0400
+++ b/xen/arch/x86/x86_emulate.c        Fri Oct 19 11:31:38 2007 -0400
@@ -300,7 +300,7 @@ struct operand {
 
 /* Before executing instruction: restore necessary bits in EFLAGS. */
 #define _PRE_EFLAGS(_sav, _msk, _tmp)           \
-/* EFLAGS = (_sav & _msk) | (EFLAGS & ~_msk); */\
+/* push (_sav & _msk) | (EFLAGS & ~_msk); */\
 "push %"_sav"; "                                \
 "movl %"_msk",%"_LO32 _tmp"; "                  \
 "andl %"_LO32 _tmp",("_STK"); "                 \
@@ -309,11 +309,12 @@ struct operand {
 "andl %"_LO32 _tmp",("_STK"); "                 \
 "pop  %"_tmp"; "                                \
 "orl  %"_LO32 _tmp",("_STK"); "                 \
-"popf; "                                        \
 /* _sav &= ~msk; */                             \
 "movl %"_msk",%"_LO32 _tmp"; "                  \
 "notl %"_LO32 _tmp"; "                          \
-"andl %"_LO32 _tmp",%"_sav"; "
+"andl %"_LO32 _tmp",%"_sav"; "                 \
+/* pop EFLAGS */                               \
+"popf; "
 
 /* After executing instruction: write-back necessary bits in EFLAGS. */
 #define _POST_EFLAGS(_sav, _msk, _tmp)          \
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.