From 7e44b76644273065003abd7d87547c38a5dd64e3 Mon Sep 17 00:00:00 2001 From: Mohamed Mediouni Date: Tue, 24 Feb 2026 00:39:42 +0100 Subject: [PATCH] hvf: i386: save/restore CR0/2/3 For symmetry, save/restore the same set of registers even when not needed. CR2 save/restore needed as page faults injected to the guest imply modifying CR2. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-21-mohamed@unpredictable.fr Signed-off-by: Paolo Bonzini --- target/i386/hvf/hvf.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index fb039ff7bd..a70f8461b0 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -477,7 +477,19 @@ static void hvf_load_crs(CPUState *cs) env->cr[0] = rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); env->cr[3] = rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); + env->cr[2] = rreg(cpu->accel->fd, HV_X86_CR2); } + +static void hvf_save_crs(CPUState *cs) +{ + X86CPU *x86_cpu = X86_CPU(cpu); + CPUX86State *env = &x86_cpu->env; + + wvmcs(cpu->accel->fd, VMCS_GUEST_CR0, env->cr[0]); + wvmcs(cpu->accel->fd, VMCS_GUEST_CR3, env->cr[3]); + wreg(cs->accel->fd, HV_X86_CR2, env->cr[2]); +} + void hvf_load_regs(CPUState *cs) { X86CPU *cpu = X86_CPU(cs); @@ -794,6 +806,7 @@ static int hvf_handle_vmexit(CPUState *cpu) decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); break; } break; @@ -837,6 +850,7 @@ static int hvf_handle_vmexit(CPUState *cpu) assert(ins_len == decode.len); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); break; } @@ -942,6 +956,7 @@ static int hvf_handle_vmexit(CPUState *cpu) decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); break; } case EXIT_REASON_TPR: {