KVM: x86: Loading segments on 64-bit mode may be wrong
The current emulator implementation ignores the high 32 bits of the base in long-mode. During segment load from the LDT, the base of the LDT is calculated incorrectly and may cause the wrong segment to be loaded. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e37a75a13c
commit
2eedcac8a9
|
@ -1358,17 +1358,19 @@ static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt,
|
|||
u16 selector, struct desc_ptr *dt)
|
||||
{
|
||||
const struct x86_emulate_ops *ops = ctxt->ops;
|
||||
u32 base3 = 0;
|
||||
|
||||
if (selector & 1 << 2) {
|
||||
struct desc_struct desc;
|
||||
u16 sel;
|
||||
|
||||
memset (dt, 0, sizeof *dt);
|
||||
if (!ops->get_segment(ctxt, &sel, &desc, NULL, VCPU_SREG_LDTR))
|
||||
if (!ops->get_segment(ctxt, &sel, &desc, &base3,
|
||||
VCPU_SREG_LDTR))
|
||||
return;
|
||||
|
||||
dt->size = desc_limit_scaled(&desc); /* what if limit > 65535? */
|
||||
dt->address = get_desc_base(&desc);
|
||||
dt->address = get_desc_base(&desc) | ((u64)base3 << 32);
|
||||
} else
|
||||
ops->get_gdt(ctxt, dt);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue