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 <magnuskulke@linux.microsoft.com>
---
accel/mshv/mshv-all.c | 7 +++++++
include/hw/hyperv/hvgdk_mini.h | 3 +++
include/system/mshv_int.h | 1 +
target/i386/mshv/mshv-cpu.c | 15 +++++++++++++++
4 files changed, 26 insertions(+)
diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
index 365288b901..22e838ede6 100644
--- a/accel/mshv/mshv-all.c
+++ b/accel/mshv/mshv-all.c
@@ -137,6 +137,13 @@ static int mshv_load_setup(QEMUFile *f, void *opaque, Error **errp)
static int mshv_load_cleanup(void *opaque)
{
MshvState *s = 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;
+ }
resume_vm(s->vm);
diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h
index a47bc6212e..00daac0431 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,
diff --git a/include/system/mshv_int.h b/include/system/mshv_int.h
index 7d685fc647..7052f20a00 100644
--- a/include/system/mshv_int.h
+++ b/include/system/mshv_int.h
@@ -84,6 +84,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 ec1caf4e7a..0b08f478ce 100644
--- a/target/i386/mshv/mshv-cpu.c
+++ b/target/i386/mshv/mshv-cpu.c
@@ -1141,6 +1141,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