150efe82cSAndrey Smetanin /* 250efe82cSAndrey Smetanin * QEMU KVM Hyper-V support 350efe82cSAndrey Smetanin * 450efe82cSAndrey Smetanin * Copyright (C) 2015 Andrey Smetanin <asmetanin@virtuozzo.com> 550efe82cSAndrey Smetanin * 650efe82cSAndrey Smetanin * Authors: 750efe82cSAndrey Smetanin * Andrey Smetanin <asmetanin@virtuozzo.com> 850efe82cSAndrey Smetanin * 950efe82cSAndrey Smetanin * This work is licensed under the terms of the GNU GPL, version 2 or later. 1050efe82cSAndrey Smetanin * See the COPYING file in the top-level directory. 1150efe82cSAndrey Smetanin * 1250efe82cSAndrey Smetanin */ 1350efe82cSAndrey Smetanin 14b6a0aa05SPeter Maydell #include "qemu/osdep.h" 1550efe82cSAndrey Smetanin #include "hyperv.h" 16701189e3SRoman Kagan #include "hw/hyperv/hyperv.h" 175e953812SRoman Kagan #include "hyperv-proto.h" 1850efe82cSAndrey Smetanin 1950efe82cSAndrey Smetanin int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) 2050efe82cSAndrey Smetanin { 2150efe82cSAndrey Smetanin CPUX86State *env = &cpu->env; 2250efe82cSAndrey Smetanin 2350efe82cSAndrey Smetanin switch (exit->type) { 2450efe82cSAndrey Smetanin case KVM_EXIT_HYPERV_SYNIC: 2550efe82cSAndrey Smetanin if (!cpu->hyperv_synic) { 2650efe82cSAndrey Smetanin return -1; 2750efe82cSAndrey Smetanin } 2850efe82cSAndrey Smetanin 2950efe82cSAndrey Smetanin /* 3050efe82cSAndrey Smetanin * For now just track changes in SynIC control and msg/evt pages msr's. 3150efe82cSAndrey Smetanin * When SynIC messaging/events processing will be added in future 3250efe82cSAndrey Smetanin * here we will do messages queues flushing and pages remapping. 3350efe82cSAndrey Smetanin */ 3450efe82cSAndrey Smetanin switch (exit->u.synic.msr) { 3550efe82cSAndrey Smetanin case HV_X64_MSR_SCONTROL: 3650efe82cSAndrey Smetanin env->msr_hv_synic_control = exit->u.synic.control; 3750efe82cSAndrey Smetanin break; 3850efe82cSAndrey Smetanin case HV_X64_MSR_SIMP: 3950efe82cSAndrey Smetanin env->msr_hv_synic_msg_page = exit->u.synic.msg_page; 4050efe82cSAndrey Smetanin break; 4150efe82cSAndrey Smetanin case HV_X64_MSR_SIEFP: 4250efe82cSAndrey Smetanin env->msr_hv_synic_evt_page = exit->u.synic.evt_page; 4350efe82cSAndrey Smetanin break; 4450efe82cSAndrey Smetanin default: 4550efe82cSAndrey Smetanin return -1; 4650efe82cSAndrey Smetanin } 4750efe82cSAndrey Smetanin return 0; 481b0d9b05SAndrey Smetanin case KVM_EXIT_HYPERV_HCALL: { 491b0d9b05SAndrey Smetanin uint16_t code; 501b0d9b05SAndrey Smetanin 511b0d9b05SAndrey Smetanin code = exit->u.hcall.input & 0xffff; 521b0d9b05SAndrey Smetanin switch (code) { 535e953812SRoman Kagan case HV_POST_MESSAGE: 545e953812SRoman Kagan case HV_SIGNAL_EVENT: 551b0d9b05SAndrey Smetanin default: 561b0d9b05SAndrey Smetanin exit->u.hcall.result = HV_STATUS_INVALID_HYPERCALL_CODE; 571b0d9b05SAndrey Smetanin return 0; 581b0d9b05SAndrey Smetanin } 591b0d9b05SAndrey Smetanin } 6050efe82cSAndrey Smetanin default: 6150efe82cSAndrey Smetanin return -1; 6250efe82cSAndrey Smetanin } 6350efe82cSAndrey Smetanin } 64