|
@@ -1488,13 +1488,6 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
|
|
|
loadsegment(ds, vmx->host_state.ds_sel);
|
|
|
loadsegment(es, vmx->host_state.es_sel);
|
|
|
}
|
|
|
-#else
|
|
|
- /*
|
|
|
- * The sysexit path does not restore ds/es, so we must set them to
|
|
|
- * a reasonable value ourselves.
|
|
|
- */
|
|
|
- loadsegment(ds, __USER_DS);
|
|
|
- loadsegment(es, __USER_DS);
|
|
|
#endif
|
|
|
reload_tss();
|
|
|
#ifdef CONFIG_X86_64
|
|
@@ -6370,6 +6363,19 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
|
|
#endif
|
|
|
);
|
|
|
|
|
|
+#ifndef CONFIG_X86_64
|
|
|
+ /*
|
|
|
+ * The sysexit path does not restore ds/es, so we must set them to
|
|
|
+ * a reasonable value ourselves.
|
|
|
+ *
|
|
|
+ * We can't defer this to vmx_load_host_state() since that function
|
|
|
+ * may be executed in interrupt context, which saves and restore segments
|
|
|
+ * around it, nullifying its effect.
|
|
|
+ */
|
|
|
+ loadsegment(ds, __USER_DS);
|
|
|
+ loadsegment(es, __USER_DS);
|
|
|
+#endif
|
|
|
+
|
|
|
vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)
|
|
|
| (1 << VCPU_EXREG_RFLAGS)
|
|
|
| (1 << VCPU_EXREG_CPL)
|