@samitouri / QOSamiQemu / commits / 80c7f8e9cd

target/i386/mshv: use the register page to set registers

Update mshv_store_regs to use the register page when it is mmapped and valid to set registers. Otherwise use the ioctls to set the registers. Signed-off-by: Doru Blânzeanu <dblanzeanu@linux.microsoft.com> Reviewed-By: Magnus Kulke <magnuskulke@linux.microsoft.com> Reviewed-by: Mohamed Mediouni <mohamed@unpredictable.fr> Link: https://lore.kernel.org/r/20260428135053.251200-7-dblanzeanu@linux.microsoft.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Doru Blânzeanu committed Apr 28, 2026 at 16:50 UTC 80c7f8e9cd17b1dfa2eb913293aa91c78884ede8
1 file changed +40 -4
target/i386/mshv/mshv-cpu.c
+40 -4
@@ -457,14 +457,50 @@ static int set_standard_regs(const CPUState *cpu)
457 return 0;
458 }
459
460 +static void mshv_set_standard_regs_vp_page(CPUState *cpu)
461 +{
462 + X86CPU *x86cpu = X86_CPU(cpu);
463 + CPUX86State *env = &x86cpu->env;
464 +
465 + env->regs_page->rax = env->regs[R_EAX];
466 + env->regs_page->rbx = env->regs[R_EBX];
467 + env->regs_page->rcx = env->regs[R_ECX];
468 + env->regs_page->rdx = env->regs[R_EDX];
469 + env->regs_page->rsi = env->regs[R_ESI];
470 + env->regs_page->rdi = env->regs[R_EDI];
471 + env->regs_page->rsp = env->regs[R_ESP];
472 + env->regs_page->rbp = env->regs[R_EBP];
473 + env->regs_page->r8 = env->regs[R_R8];
474 + env->regs_page->r9 = env->regs[R_R9];
475 + env->regs_page->r10 = env->regs[R_R10];
476 + env->regs_page->r11 = env->regs[R_R11];
477 + env->regs_page->r12 = env->regs[R_R12];
478 + env->regs_page->r13 = env->regs[R_R13];
479 + env->regs_page->r14 = env->regs[R_R14];
480 + env->regs_page->r15 = env->regs[R_R15];
481 + env->regs_page->rip = env->eip;
482 + lflags_to_rflags(env);
483 + env->regs_page->rflags = env->eflags;
484 +
485 + env->regs_page->dirty |= (1u << HV_X64_REGISTER_CLASS_GENERAL)
486 + | (1u << HV_X64_REGISTER_CLASS_IP)
487 + | (1u << HV_X64_REGISTER_CLASS_FLAGS);
488 +}
489 +
490 static int store_regs(CPUState *cpu)
491 {
492 + X86CPU *x86cpu = X86_CPU(cpu);
493 + CPUX86State *env = &x86cpu->env;
494 int ret;
495
464 - ret = set_standard_regs(cpu);
465 - if (ret < 0) {
466 - error_report("Failed to store standard registers");
467 - return -1;
496 + /* Use register vp page to optimize registers access */
497 + if (env->regs_page && env->regs_page->isvalid != 0) {
498 + mshv_set_standard_regs_vp_page(cpu);
499 + } else {
500 + ret = set_standard_regs(cpu);
501 + if (ret < 0) {
502 + return ret;
503 + }
504 }
505
506 ret = set_special_regs(cpu);