@@ -125,3 +125,17 @@ int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route)
{
return event_notifier_set(&sint_route->sint_set_notifier);
}
+
+int kvm_hv_handle_hypercall(X86CPU *cpu, struct kvm_run *run)
+{
+ uint16_t code;
+
+ code = run->hv_hcall.input & 0xffff;
+ switch (code) {
+ case HV_X64_HCALL_POST_MESSAGE:
+ case HV_X64_HCALL_SIGNAL_EVENT:
+ default:
+ run->hv_hcall.result = HV_STATUS_INVALID_HYPERCALL_CODE;
+ return 0;
+ }
+}
@@ -39,4 +39,6 @@ void kvm_hv_sint_route_destroy(HvSintRoute *sint_route);
int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route);
+int kvm_hv_handle_hypercall(X86CPU *cpu, struct kvm_run *run);
+
#endif
@@ -3026,6 +3026,9 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
ioapic_eoi_broadcast(run->eoi.vector);
ret = 0;
break;
+ case KVM_EXIT_HYPERV_HCALL:
+ ret = kvm_hv_handle_hypercall(cpu, run);
+ break;
default:
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
ret = -1;