KVM: x86 emulator: Leave segment limit and attributs alone in real mode
authorAvi Kivity <avi@redhat.com>
Tue, 21 Aug 2012 14:07:04 +0000 (17:07 +0300)
committerMarcelo Tosatti <mtosatti@redhat.com>
Mon, 27 Aug 2012 23:02:20 +0000 (20:02 -0300)
When loading a segment in real mode, only the base and selector must
be modified.  The limit needs to be left alone, otherwise big real mode
users will hit a #GP due to limit checking (currently this is suppressed
because we don't check limits in real mode).

Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/emulate.c

index 5e27ba5..f8b27cd 100644 (file)
@@ -1388,19 +1388,15 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
        bool null_selector = !(selector & ~0x3); /* 0000-0003 are null */
        ulong desc_addr;
        int ret;
+       u16 dummy;
 
        memset(&seg_desc, 0, sizeof seg_desc);
 
        if ((seg <= VCPU_SREG_GS && ctxt->mode == X86EMUL_MODE_VM86)
            || ctxt->mode == X86EMUL_MODE_REAL) {
                /* set real mode segment descriptor */
+               ctxt->ops->get_segment(ctxt, &dummy, &seg_desc, NULL, seg);
                set_desc_base(&seg_desc, selector << 4);
-               set_desc_limit(&seg_desc, 0xffff);
-               seg_desc.type = 3;
-               seg_desc.p = 1;
-               seg_desc.s = 1;
-               if (ctxt->mode == X86EMUL_MODE_VM86)
-                       seg_desc.dpl = 3;
                goto load;
        }