On Tue, May 20, 2025 at 01:30:11PM +0200, Magnus Kulke wrote: > Write CPU register state to MSHV vCPUs. Various mapping functions to > prepare the payload for the HV call have been implemented. > > Signed-off-by: Magnus Kulke <magnusku...@linux.microsoft.com> > --- [...] > +static int set_special_regs(const CPUState *cpu) > +{ > + X86CPU *x86cpu = X86_CPU(cpu); > + CPUX86State *env = &x86cpu->env; > + int cpu_fd = mshv_vcpufd(cpu); > + struct hv_register_assoc *assocs; > + size_t n_regs = sizeof(SPECIAL_REGISTER_NAMES) / > sizeof(hv_register_name); > + int ret; > + > + assocs = g_new0(struct hv_register_assoc, n_regs); > + > + /* set names */ > + for (size_t i = 0; i < n_regs; i++) { > + assocs[i].name = SPECIAL_REGISTER_NAMES[i]; > + } > + populate_hv_segment_reg(&env->segs[R_CS], &assocs[0].value.segment); > + populate_hv_segment_reg(&env->segs[R_DS], &assocs[1].value.segment); > + populate_hv_segment_reg(&env->segs[R_ES], &assocs[2].value.segment); > + populate_hv_segment_reg(&env->segs[R_FS], &assocs[3].value.segment); > + populate_hv_segment_reg(&env->segs[R_GS], &assocs[4].value.segment); > + populate_hv_segment_reg(&env->segs[R_SS], &assocs[5].value.segment); > + populate_hv_segment_reg(&env->tr, &assocs[6].value.segment); > + populate_hv_segment_reg(&env->ldt, &assocs[7].value.segment); > + > + populate_hv_table_reg(&env->gdt, &assocs[8].value.table); > + populate_hv_table_reg(&env->idt, &assocs[9].value.table); > + > + assocs[10].value.reg64 = env->cr[0]; > + assocs[11].value.reg64 = env->cr[2]; > + assocs[12].value.reg64 = env->cr[3]; > + assocs[13].value.reg64 = env->cr[4]; > + assocs[14].value.reg64 = cpu_get_apic_tpr(x86cpu->apic_state); > + assocs[15].value.reg64 = env->efer; > + assocs[16].value.reg64 = cpu_get_apic_base(x86cpu->apic_state); > + > + /* > + * TODO: support asserting an interrupt using interrup_bitmap > + * it should be possible if we use the vm_fd > + */ > +
Why is there a need to assert an interrupt here? > + ret = mshv_set_generic_regs(cpu_fd, assocs, n_regs); > + g_free(assocs); > + if (ret < 0) { > + error_report("failed to set special registers"); > + return -1; > + } > + > + return 0; > +} > + > +static int set_fpu_regs(int cpu_fd, const struct MshvFPU *regs) Please change regs to fpu. Thanks, Wei. > +{ > + struct hv_register_assoc *assocs; > + union hv_register_value *value; > + size_t n_regs = sizeof(FPU_REGISTER_NAMES) / sizeof(enum > hv_register_name); > + size_t fp_i; > + union hv_x64_fp_control_status_register *ctrl_status; > + union hv_x64_xmm_control_status_register *xmm_ctrl_status; > + int ret; > +