36 lines
1.3 KiB
Diff
36 lines
1.3 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# Date 1202407244 0
|
|
# Node ID 445edf4089a3ccaca977665423e903b5300832cb
|
|
# Parent e6cf98edf0c573d86c59863c6b861f9a4d6350c3
|
|
x86_emulate: Fix MUL emulation.
|
|
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
|
|
|
|
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
|
|
===================================================================
|
|
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
|
|
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
|
|
@@ -1547,11 +1547,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;
|
|
@@ -1559,6 +1562,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;
|