@@ -3423,6 +3423,14 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED)
return -EINVAL;
+ if (events->exception.injected) {
+ bool has_error_code = is_protmode(vcpu) &&
+ x86_exception_has_error_code(events->exception.nr);
+
+ if (!!events->exception.has_error_code != has_error_code)
+ return -EINVAL;
+ }
+
process_nmi(vcpu);
vcpu->arch.exception.injected = false;
vcpu->arch.exception.pending = events->exception.injected;
@@ -8170,6 +8178,14 @@ static int kvm_valid_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
return -EINVAL;
}
+ if (vcpu->arch.exception.injected || vcpu->arch.exception.pending) {
+ bool has_error_code = (sregs->cr0 & X86_CR0_PE) &&
+ x86_exception_has_error_code(vcpu->arch.exception.nr);
+
+ if (vcpu->arch.exception.has_error_code != has_error_code)
+ return -EINVAL;
+ }
+
return 0;
}