aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2012-04-17 08:35:59 +0100
committerAndrew Cooper <andrew.cooper3@citrix.com>2012-04-17 08:35:59 +0100
commit101427d0c0f782c29f192a3bf1ce270cb07d662c (patch)
tree21a606e5d6baed513155fa0a2e8a70a870cd0a36
parente533312eed28c230ab2908c6dc370e59f0588992 (diff)
downloadxen-101427d0c0f782c29f192a3bf1ce270cb07d662c.tar.gz
xen-101427d0c0f782c29f192a3bf1ce270cb07d662c.tar.bz2
xen-101427d0c0f782c29f192a3bf1ce270cb07d662c.zip
x86_emulate: Do not push an error code onto a #UD exception stack
Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25099:4bd752a4cdf3 xen-unstable date: Fri Mar 23 20:51:48 2012 +0000 x86_emulate: raise #UD rather than #GP on invalid use of LOCK prefix From: Andrew Cooper <andrew.cooper3@citrix.com> Signed-off-by: Keir Fraser <keir@xen.org> Committed-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25098:2e45b26bc412 xen-unstable date: Fri Mar 23 20:45:16 2012 +0000
-rw-r--r--xen/arch/x86/x86_emulate/x86_emulate.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c
index c070656a30..f4686c467e 100644
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -1309,7 +1309,7 @@ x86_emulate(
}
/* Lock prefix is allowed only on RMW instructions. */
- generate_exception_if((d & Mov) && lock_prefix, EXC_GP, 0);
+ generate_exception_if((d & Mov) && lock_prefix, EXC_UD, -1);
/* ModRM and SIB bytes. */
if ( d & ModRM )
@@ -1528,12 +1528,12 @@ x86_emulate(
lock_prefix &&
((b < 0x20) || (b > 0x23)) && /* MOV CRn/DRn */
(b != 0xc7), /* CMPXCHG{8,16}B */
- EXC_GP, 0);
+ EXC_UD, -1);
dst.type = OP_NONE;
break;
case DstReg:
- generate_exception_if(lock_prefix, EXC_GP, 0);
+ generate_exception_if(lock_prefix, EXC_UD, -1);
dst.type = OP_REG;
if ( d & ByteOp )
{
@@ -1589,7 +1589,7 @@ x86_emulate(
dst = ea;
if ( dst.type == OP_REG )
{
- generate_exception_if(lock_prefix, EXC_GP, 0);
+ generate_exception_if(lock_prefix, EXC_UD, -1);
switch ( dst.bytes )
{
case 1: dst.val = *(uint8_t *)dst.reg; break;
@@ -3598,14 +3598,14 @@ x86_emulate(
struct segment_register cs = { 0 }, ss = { 0 };
int rc;
- generate_exception_if(in_realmode(ctxt, ops), EXC_UD, 0);
- generate_exception_if(!in_protmode(ctxt, ops), EXC_UD, 0);
+ generate_exception_if(in_realmode(ctxt, ops), EXC_UD, -1);
+ generate_exception_if(!in_protmode(ctxt, ops), EXC_UD, -1);
/* Inject #UD if syscall/sysret are disabled. */
fail_if(ops->read_msr == NULL);
if ( (rc = ops->read_msr(MSR_EFER, &msr_content, ctxt)) != 0 )
goto done;
- generate_exception_if((msr_content & EFER_SCE) == 0, EXC_UD, 0);
+ generate_exception_if((msr_content & EFER_SCE) == 0, EXC_UD, -1);
if ( (rc = ops->read_msr(MSR_STAR, &msr_content, ctxt)) != 0 )
goto done;