25098-x86-emul-lock-UD.patch 25101-x86-hpet-disable.patch ioemu-9877-MSI-X-device-cleanup.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=181
74 lines
2.6 KiB
Diff
74 lines
2.6 KiB
Diff
# HG changeset patch
|
|
# User Andrew Cooper <andrew.cooper3@citrix.com>
|
|
# Date 1332535516 0
|
|
# Node ID 2e45b26bc412099a2b8f009bcf111e4b6c23847b
|
|
# Parent 2ca43b65718fbe2d3f9ea36132e139ef774d9a11
|
|
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>
|
|
|
|
# HG changeset patch
|
|
# User Keir Fraser <keir@xen.org>
|
|
# Date 1332535908 0
|
|
# Node ID 4bd752a4cdf323c41c50f8cd6286f566d67adeae
|
|
# Parent 2e45b26bc412099a2b8f009bcf111e4b6c23847b
|
|
x86_emulate: Do not push an error code onto a #UD exception stack
|
|
|
|
Signed-off-by: Keir Fraser <keir@xen.org>
|
|
|
|
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
|
|
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
|
|
@@ -1353,7 +1353,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 )
|
|
@@ -1572,12 +1572,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 )
|
|
{
|
|
@@ -1633,7 +1633,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;
|
|
@@ -3645,14 +3645,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;
|