KVM: VMX: update live TR selector if it changes in real mode
authorGleb Natapov <[email protected]>
Mon, 21 Feb 2011 10:07:58 +0000 (12:07 +0200)
committerMarcelo Tosatti <[email protected]>
Thu, 17 Mar 2011 16:08:31 +0000 (13:08 -0300)
When rmode.vm86 is active TR descriptor is updated with vm86 task values,
but selector is left intact. vmx_set_segment() makes sure that if TR
register is written into while vm86 is active the new values are saved
for use after vm86 is deactivated, but since selector is not updated on
vm86 activation/deactivation new value is lost. Fix this by writing new
selector into vmcs immediately.

Signed-off-by: Gleb Natapov <[email protected]>
Signed-off-by: Avi Kivity <[email protected]>
arch/x86/kvm/vmx.c

index a61ed93a1f258af10ffe33fedf014ff0cd2e3d19..dafb67eddd604adab7bbc2973ff69ec212ad3333 100644 (file)
@@ -2138,6 +2138,7 @@ static void vmx_set_segment(struct kvm_vcpu *vcpu,
        u32 ar;
 
        if (vmx->rmode.vm86_active && seg == VCPU_SREG_TR) {
+               vmcs_write16(sf->selector, var->selector);
                vmx->rmode.tr.selector = var->selector;
                vmx->rmode.tr.base = var->base;
                vmx->rmode.tr.limit = var->limit;