target/i386/mshv: Write MSRs to the hypervisor

Push current model-specific register (MSR) values to MSHV's vCPUs as
part of setting state to the hypervisor.

Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com>
Link: https://lore.kernel.org/r/20250916164847.77883-22-magnuskulke@linux.microsoft.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Magnus Kulke 2025-09-16 18:48:41 +02:00 committed by Paolo Bonzini
parent 9bc6a1d296
commit 64118f452c

View file

@ -998,6 +998,65 @@ static int put_regs(const CPUState *cpu)
return 0;
}
struct MsrPair {
uint32_t index;
uint64_t value;
};
static int put_msrs(const CPUState *cpu)
{
int ret = 0;
X86CPU *x86cpu = X86_CPU(cpu);
CPUX86State *env = &x86cpu->env;
MshvMsrEntries *msrs = g_malloc0(sizeof(MshvMsrEntries));
struct MsrPair pairs[] = {
{ MSR_IA32_SYSENTER_CS, env->sysenter_cs },
{ MSR_IA32_SYSENTER_ESP, env->sysenter_esp },
{ MSR_IA32_SYSENTER_EIP, env->sysenter_eip },
{ MSR_EFER, env->efer },
{ MSR_PAT, env->pat },
{ MSR_STAR, env->star },
{ MSR_CSTAR, env->cstar },
{ MSR_LSTAR, env->lstar },
{ MSR_KERNELGSBASE, env->kernelgsbase },
{ MSR_FMASK, env->fmask },
{ MSR_MTRRdefType, env->mtrr_deftype },
{ MSR_VM_HSAVE_PA, env->vm_hsave },
{ MSR_SMI_COUNT, env->msr_smi_count },
{ MSR_IA32_PKRS, env->pkrs },
{ MSR_IA32_BNDCFGS, env->msr_bndcfgs },
{ MSR_IA32_XSS, env->xss },
{ MSR_IA32_UMWAIT_CONTROL, env->umwait },
{ MSR_IA32_TSX_CTRL, env->tsx_ctrl },
{ MSR_AMD64_TSC_RATIO, env->amd_tsc_scale_msr },
{ MSR_TSC_AUX, env->tsc_aux },
{ MSR_TSC_ADJUST, env->tsc_adjust },
{ MSR_IA32_SMBASE, env->smbase },
{ MSR_IA32_SPEC_CTRL, env->spec_ctrl },
{ MSR_VIRT_SSBD, env->virt_ssbd },
};
if (ARRAY_SIZE(pairs) > MSHV_MSR_ENTRIES_COUNT) {
error_report("MSR entries exceed maximum size");
g_free(msrs);
return -1;
}
for (size_t i = 0; i < ARRAY_SIZE(pairs); i++) {
MshvMsrEntry *entry = &msrs->entries[i];
entry->index = pairs[i].index;
entry->reserved = 0;
entry->data = pairs[i].value;
msrs->nmsrs++;
}
ret = mshv_configure_msr(cpu, &msrs->entries[0], msrs->nmsrs);
g_free(msrs);
return ret;
}
int mshv_arch_put_registers(const CPUState *cpu)
{
int ret;
@ -1008,8 +1067,13 @@ int mshv_arch_put_registers(const CPUState *cpu)
return -1;
}
error_report("unimplemented");
abort();
ret = put_msrs(cpu);
if (ret < 0) {
error_report("Failed to put msrs");
return -1;
}
return 0;
}
void mshv_arch_amend_proc_features(