Write partition-wide synthetic MSRs. This ensures the hypercall page and SynIC facilities are set up before vCPUs attempt to use it.
Signed-off-by: Magnus Kulke <[email protected]> --- accel/mshv/mshv-all.c | 15 +++++++++++++++ include/hw/hyperv/hvgdk_mini.h | 3 +++ include/system/mshv_int.h | 1 + target/i386/mshv/mshv-cpu.c | 15 +++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c index 1516475f34..1ca1d4b54f 100644 --- a/accel/mshv/mshv-all.c +++ b/accel/mshv/mshv-all.c @@ -60,6 +60,20 @@ static int init_mshv(int *mshv_fd) return 0; } +static int mshv_load_cleanup(void *opaque) +{ + int ret; + + ret = mshv_arch_set_partition_msrs(first_cpu); + if (ret < 0) { + error_report("Failed to set partition MSRs: %s", strerror(-ret)); + return -1; + } + + return 0; +} + + static int get_host_partition_property(int mshv_fd, uint32_t property_code, uint64_t *value) { @@ -496,6 +510,7 @@ static int mshv_init_vcpu(CPUState *cpu) } static SaveVMHandlers savevm_mshv = { + .load_cleanup = mshv_load_cleanup, }; static int mshv_init(AccelState *as, MachineState *ms) diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h index 0602a7c6cc..a5527d49cf 100644 --- a/include/hw/hyperv/hvgdk_mini.h +++ b/include/hw/hyperv/hvgdk_mini.h @@ -23,6 +23,9 @@ #define HV_X64_MSR_APIC_FREQUENCY 0x40000023 typedef enum hv_register_name { + /* VP Management Registers */ + HV_REGISTER_INTERNAL_ACTIVITY_STATE = 0x00000004, + /* Pending Interruption Register */ HV_REGISTER_PENDING_INTERRUPTION = 0x00010002, HV_REGISTER_INTERRUPT_STATE = 0x00010003, diff --git a/include/system/mshv_int.h b/include/system/mshv_int.h index 063852115e..cbfcb8611b 100644 --- a/include/system/mshv_int.h +++ b/include/system/mshv_int.h @@ -98,6 +98,7 @@ int mshv_get_generic_regs(CPUState *cpu, hv_register_assoc *assocs, size_t n_regs); int mshv_arch_store_vcpu_state(const CPUState *cpu); int mshv_arch_load_vcpu_state(CPUState *cpu); +int mshv_arch_set_partition_msrs(const CPUState *cpu); void mshv_arch_init_vcpu(CPUState *cpu); void mshv_arch_destroy_vcpu(CPUState *cpu); void mshv_arch_amend_proc_features( diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c index ce6cfccc0a..1485f6a1ef 100644 --- a/target/i386/mshv/mshv-cpu.c +++ b/target/i386/mshv/mshv-cpu.c @@ -1505,6 +1505,21 @@ int mshv_arch_store_vcpu_state(const CPUState *cpu) return 0; } +int mshv_arch_set_partition_msrs(const CPUState *cpu) +{ + CPUX86State *env = &X86_CPU(cpu)->env; + struct hv_register_assoc assocs[] = { + { .name = HV_REGISTER_GUEST_OS_ID, + .value.reg64 = env->msr_hv_guest_os_id }, + { .name = HV_REGISTER_REFERENCE_TSC, + .value.reg64 = env->msr_hv_tsc }, + { .name = HV_X64_REGISTER_HYPERCALL, + .value.reg64 = env->msr_hv_hypercall }, + }; + + return mshv_set_generic_regs(cpu, assocs, ARRAY_SIZE(assocs)); +} + void mshv_arch_amend_proc_features( union hv_partition_synthetic_processor_features *features) { -- 2.34.1
