# HG changeset patch # User Tim Deegan # Date 1274798185 -3600 # Node ID fef1e7dc74e64cf25d817991dc2594579abf5bd0 # Parent 10ad9b50b4ca85d4ff19d87ffb6e66b0472c4926 VMX virtual-apic: Update the p2m mapping alongside the control bit. Otherwise a VM migrated from a system which supports the feature to one which doesn't ends up with a data page where its vlapic should be. Signed-off-by: Tim Deegan diff -r 10ad9b50b4ca -r fef1e7dc74e6 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Tue May 25 11:28:58 2010 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Tue May 25 15:36:25 2010 +0100 @@ -1904,8 +1904,6 @@ if ( apic_va == NULL ) return -ENOMEM; share_xen_page_with_guest(virt_to_page(apic_va), d, XENSHARE_writable); - set_mmio_p2m_entry( - d, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE), _mfn(virt_to_mfn(apic_va))); d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va); return 0; @@ -1945,10 +1943,18 @@ vmx_vmcs_enter(v); ctl = __vmread(SECONDARY_VM_EXEC_CONTROL); - ctl &= ~SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES; if ( !vlapic_hw_disabled(vlapic) && (vlapic_base_address(vlapic) == APIC_DEFAULT_PHYS_BASE) ) + { ctl |= SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES; + set_mmio_p2m_entry(v->domain, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE), + _mfn(v->domain->arch.hvm_domain.vmx.apic_access_mfn)); + } + else + { + ctl &= ~SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES; + clear_mmio_p2m_entry(v->domain, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE)); + } __vmwrite(SECONDARY_VM_EXEC_CONTROL, ctl); vmx_vmcs_exit(v); }