[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |