void *data;             /* Storing pointer to struct amd_ir_data */
 };
 
+static void avic_activate_vmcb(struct vcpu_svm *svm)
+{
+       struct vmcb *vmcb = svm->vmcb01.ptr;
+
+       vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
+       vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
+
+       vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
+       if (apic_x2apic_mode(svm->vcpu.arch.apic)) {
+               vmcb->control.int_ctl |= X2APIC_MODE_MASK;
+               vmcb->control.avic_physical_id |= X2AVIC_MAX_PHYSICAL_ID;
+               /* Disabling MSR intercept for x2APIC registers */
+               svm_set_x2apic_msr_interception(svm, false);
+       } else {
+               vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID;
+               /* Enabling MSR intercept for x2APIC registers */
+               svm_set_x2apic_msr_interception(svm, true);
+       }
+}
+
+static void avic_deactivate_vmcb(struct vcpu_svm *svm)
+{
+       struct vmcb *vmcb = svm->vmcb01.ptr;
+
+       vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
+       vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
+
+       /* Enabling MSR intercept for x2APIC registers */
+       svm_set_x2apic_msr_interception(svm, true);
+}
 
 /* Note:
  * This function is called from IOMMU driver to notify
        vmcb->control.avic_backing_page = bpa & AVIC_HPA_MASK;
        vmcb->control.avic_logical_id = lpa & AVIC_HPA_MASK;
        vmcb->control.avic_physical_id = ppa & AVIC_HPA_MASK;
-       vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID;
        vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE & VMCB_AVIC_APIC_BAR_MASK;
 
        if (kvm_apicv_activated(svm->vcpu.kvm))
-               vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
+               avic_activate_vmcb(svm);
        else
-               vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK;
+               avic_deactivate_vmcb(svm);
 }
 
 static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu,
                 * accordingly before re-activating.
                 */
                avic_apicv_post_state_restore(vcpu);
-               vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
+               avic_activate_vmcb(svm);
        } else {
-               vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK;
+               avic_deactivate_vmcb(svm);
        }
        vmcb_mark_dirty(vmcb, VMCB_AVIC);
 
 
        }
 }
 
+void svm_set_x2apic_msr_interception(struct vcpu_svm *svm, bool intercept)
+{
+       int i;
+
+       if (avic_mode != AVIC_MODE_X2 ||
+           !apic_x2apic_mode(svm->vcpu.arch.apic))
+               return;
+
+       for (i = 0; i < MAX_DIRECT_ACCESS_MSRS; i++) {
+               int index = direct_access_msrs[i].index;
+
+               if ((index < APIC_BASE_MSR) ||
+                   (index > APIC_BASE_MSR + 0xff))
+                       continue;
+               set_msr_interception(&svm->vcpu, svm->msrpm, index,
+                                    !intercept, !intercept);
+       }
+}
 
 void svm_vcpu_free_msrpm(u32 *msrpm)
 {