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:
parent
9bc6a1d296
commit
64118f452c
1 changed files with 66 additions and 2 deletions
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue