diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-08-07 10:53:22 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-08-07 10:53:22 +0100 |
commit | b1b6362f10c95343eec1be30c346593df89adf9f (patch) | |
tree | 90ad6ad8d9c8aec00c61fdbe84bc2690a6e91126 | |
parent | 26fd181703c557965d06739e1a0292cea7088ea9 (diff) | |
download | xen-b1b6362f10c95343eec1be30c346593df89adf9f.tar.gz xen-b1b6362f10c95343eec1be30c346593df89adf9f.tar.bz2 xen-b1b6362f10c95343eec1be30c346593df89adf9f.zip |
x86_emulate: Fixes for 'mov rm16,sreg'
1. Memory reads should be 16 bits only
2. Attempt to load %cs should result in #UD
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r-- | xen/arch/x86/x86_emulate/x86_emulate.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 8fa5fd400b..dc6e624995 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -113,7 +113,7 @@ static uint8_t opcode_table[256] = { ByteOp|DstMem|SrcReg|ModRM|Mov, DstMem|SrcReg|ModRM|Mov, ByteOp|DstReg|SrcMem|ModRM|Mov, DstReg|SrcMem|ModRM|Mov, DstMem|SrcReg|ModRM|Mov, DstReg|SrcNone|ModRM, - DstReg|SrcMem|ModRM|Mov, DstMem|SrcNone|ModRM|Mov, + DstReg|SrcMem16|ModRM|Mov, DstMem|SrcNone|ModRM|Mov, /* 0x90 - 0x97 */ ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, @@ -2042,6 +2042,7 @@ x86_emulate( case 0x8e: /* mov r/m,Sreg */ { enum x86_segment seg = decode_segment(modrm_reg); generate_exception_if(seg == decode_segment_failed, EXC_UD, -1); + generate_exception_if(seg == x86_seg_cs, EXC_UD, -1); if ( (rc = load_seg(seg, (uint16_t)src.val, ctxt, ops)) != 0 ) goto done; if ( seg == x86_seg_ss ) |