aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNadav Amit <namit@cs.technion.ac.il>2014-06-02 11:34:04 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2014-06-18 11:46:16 -0400
commite37a75a13cdae5deaa2ea2cbf8d55b5dd08638b6 (patch)
tree3bce8d9a049ccfb2b5b5f5d714b293e5aa66587c
parent7fe864dc942c041cc4f56e287c4025d54a8e6c1e (diff)
KVM: x86: Emulator ignores LDTR/TR extended base on LLDT/LTR
The current implementation ignores the LDTR/TR base high 32-bits on long-mode. As a result the loaded segment descriptor may be incorrect. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/emulate.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8ec4a3ebf403..136088fb038b 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1422,6 +1422,7 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
1422 ulong desc_addr; 1422 ulong desc_addr;
1423 int ret; 1423 int ret;
1424 u16 dummy; 1424 u16 dummy;
1425 u32 base3 = 0;
1425 1426
1426 memset(&seg_desc, 0, sizeof seg_desc); 1427 memset(&seg_desc, 0, sizeof seg_desc);
1427 1428
@@ -1538,9 +1539,14 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
1538 ret = write_segment_descriptor(ctxt, selector, &seg_desc); 1539 ret = write_segment_descriptor(ctxt, selector, &seg_desc);
1539 if (ret != X86EMUL_CONTINUE) 1540 if (ret != X86EMUL_CONTINUE)
1540 return ret; 1541 return ret;
1542 } else if (ctxt->mode == X86EMUL_MODE_PROT64) {
1543 ret = ctxt->ops->read_std(ctxt, desc_addr+8, &base3,
1544 sizeof(base3), &ctxt->exception);
1545 if (ret != X86EMUL_CONTINUE)
1546 return ret;
1541 } 1547 }
1542load: 1548load:
1543 ctxt->ops->set_segment(ctxt, selector, &seg_desc, 0, seg); 1549 ctxt->ops->set_segment(ctxt, selector, &seg_desc, base3, seg);
1544 return X86EMUL_CONTINUE; 1550 return X86EMUL_CONTINUE;
1545exception: 1551exception:
1546 emulate_exception(ctxt, err_vec, err_code, true); 1552 emulate_exception(ctxt, err_vec, err_code, true);