|
@@ -221,7 +221,8 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic,
|
|
|
synic->version = data;
|
|
|
break;
|
|
|
case HV_X64_MSR_SIEFP:
|
|
|
- if (data & HV_SYNIC_SIEFP_ENABLE)
|
|
|
+ if ((data & HV_SYNIC_SIEFP_ENABLE) && !host &&
|
|
|
+ !synic->dont_zero_synic_pages)
|
|
|
if (kvm_clear_guest(vcpu->kvm,
|
|
|
data & PAGE_MASK, PAGE_SIZE)) {
|
|
|
ret = 1;
|
|
@@ -232,7 +233,8 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic,
|
|
|
synic_exit(synic, msr);
|
|
|
break;
|
|
|
case HV_X64_MSR_SIMP:
|
|
|
- if (data & HV_SYNIC_SIMP_ENABLE)
|
|
|
+ if ((data & HV_SYNIC_SIMP_ENABLE) && !host &&
|
|
|
+ !synic->dont_zero_synic_pages)
|
|
|
if (kvm_clear_guest(vcpu->kvm,
|
|
|
data & PAGE_MASK, PAGE_SIZE)) {
|
|
|
ret = 1;
|
|
@@ -687,14 +689,17 @@ void kvm_hv_vcpu_init(struct kvm_vcpu *vcpu)
|
|
|
stimer_init(&hv_vcpu->stimer[i], i);
|
|
|
}
|
|
|
|
|
|
-int kvm_hv_activate_synic(struct kvm_vcpu *vcpu)
|
|
|
+int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages)
|
|
|
{
|
|
|
+ struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu);
|
|
|
+
|
|
|
/*
|
|
|
* Hyper-V SynIC auto EOI SINT's are
|
|
|
* not compatible with APICV, so deactivate APICV
|
|
|
*/
|
|
|
kvm_vcpu_deactivate_apicv(vcpu);
|
|
|
- vcpu_to_synic(vcpu)->active = true;
|
|
|
+ synic->active = true;
|
|
|
+ synic->dont_zero_synic_pages = dont_zero_synic_pages;
|
|
|
return 0;
|
|
|
}
|
|
|
|