KVM: VMX: use fix_rmode_seg() to fix all code/data segments
authorGleb Natapov <gleb@redhat.com>
Wed, 12 Dec 2012 17:10:52 +0000 (19:10 +0200)
committerGleb Natapov <gleb@redhat.com>
Sun, 23 Dec 2012 12:01:18 +0000 (14:01 +0200)
The code for SS and CS does the same thing fix_rmode_seg() is doing.
Use it instead of hand crafted code.

Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
arch/x86/kvm/vmx.c

index 792d9cc..9e784c2 100644 (file)
@@ -3315,30 +3315,8 @@ static void vmx_set_segment(struct kvm_vcpu *vcpu,
         * unrestricted guest like Westmere to older host that don't have
         * unrestricted guest like Nehelem.
         */
-       if (vmx->rmode.vm86_active) {
-               switch (seg) {
-               case VCPU_SREG_CS:
-                       vmcs_write32(GUEST_CS_AR_BYTES, 0xf3);
-                       vmcs_write32(GUEST_CS_LIMIT, 0xffff);
-                       if (vmcs_readl(GUEST_CS_BASE) == 0xffff0000)
-                               vmcs_writel(GUEST_CS_BASE, 0xf0000);
-                       vmcs_write16(GUEST_CS_SELECTOR,
-                                    vmcs_readl(GUEST_CS_BASE) >> 4);
-                       break;
-               case VCPU_SREG_ES:
-               case VCPU_SREG_DS:
-               case VCPU_SREG_GS:
-               case VCPU_SREG_FS:
-                       fix_rmode_seg(seg, &vmx->rmode.segs[seg]);
-                       break;
-               case VCPU_SREG_SS:
-                       vmcs_write16(GUEST_SS_SELECTOR,
-                                    vmcs_readl(GUEST_SS_BASE) >> 4);
-                       vmcs_write32(GUEST_SS_LIMIT, 0xffff);
-                       vmcs_write32(GUEST_SS_AR_BYTES, 0xf3);
-                       break;
-               }
-       }
+       if (vmx->rmode.vm86_active && var->s)
+               fix_rmode_seg(seg, &vmx->rmode.segs[seg]);
 }
 
 static void vmx_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l)