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 <mohamed@unpredictable.fr>
---
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: {
--
2.50.1 (Apple Git-155)