diff options
author | Nadav Amit <namit@cs.technion.ac.il> | 2014-06-02 11:34:04 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-06-18 11:46:16 -0400 |
commit | e37a75a13cdae5deaa2ea2cbf8d55b5dd08638b6 (patch) | |
tree | 3bce8d9a049ccfb2b5b5f5d714b293e5aa66587c | |
parent | 7fe864dc942c041cc4f56e287c4025d54a8e6c1e (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.c | 8 |
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 | } |
1542 | load: | 1548 | load: |
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; |
1545 | exception: | 1551 | exception: |
1546 | emulate_exception(ctxt, err_vec, err_code, true); | 1552 | emulate_exception(ctxt, err_vec, err_code, true); |