aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/x86_emulate.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-02-07 18:00:44 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-02-07 18:00:44 +0000
commit785137cb6b2ebfa54bfb6af5d985ac10fa8a4560 (patch)
tree35f060daebb98e1ab886044a2d73b17cab87c046 /xen/arch/x86/x86_emulate.c
parent46bb4b6f02515c2ded81040c2eeb53d80047749e (diff)
downloadxen-785137cb6b2ebfa54bfb6af5d985ac10fa8a4560.tar.gz
xen-785137cb6b2ebfa54bfb6af5d985ac10fa8a4560.tar.bz2
xen-785137cb6b2ebfa54bfb6af5d985ac10fa8a4560.zip
x86_emulate: Fix MUL emulation.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/x86_emulate.c')
-rw-r--r--xen/arch/x86/x86_emulate.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/xen/arch/x86/x86_emulate.c b/xen/arch/x86/x86_emulate.c
index ee0118a7b3..c111f1ca36 100644
--- a/xen/arch/x86/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate.c
@@ -1710,11 +1710,14 @@ x86_emulate(
switch ( src.bytes )
{
case 1:
+ dst.val = (uint8_t)dst.val;
dst.val *= src.val;
if ( (uint8_t)dst.val != (uint16_t)dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;
+ dst.bytes = 2;
break;
case 2:
+ dst.val = (uint16_t)dst.val;
dst.val *= src.val;
if ( (uint16_t)dst.val != (uint32_t)dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;
@@ -1722,6 +1725,7 @@ x86_emulate(
break;
#ifdef __x86_64__
case 4:
+ dst.val = (uint32_t)dst.val;
dst.val *= src.val;
if ( (uint32_t)dst.val != dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;