@@ -5,7 +5,6 @@
* KVM Address Space Isolation
*/
-#include <linux/kvm_host.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/printk.h>
@@ -133,6 +132,12 @@ void kvm_isolation_uninit(void)
pr_info("KVM: x86: End of isolated address space\n");
}
+void kvm_may_access_sensitive_data(struct kvm_vcpu *vcpu)
+{
+ vcpu->arch.l1tf_flush_l1d = true;
+ kvm_isolation_exit();
+}
+
void kvm_isolation_enter(void)
{
if (address_space_isolation) {
@@ -2,9 +2,12 @@
#ifndef ARCH_X86_KVM_ISOLATION_H
#define ARCH_X86_KVM_ISOLATION_H
+#include <linux/kvm_host.h>
+
extern int kvm_isolation_init(void);
extern void kvm_isolation_uninit(void);
extern void kvm_isolation_enter(void);
extern void kvm_isolation_exit(void);
+extern void kvm_may_access_sensitive_data(struct kvm_vcpu *vcpu);
#endif
@@ -23,6 +23,7 @@
#include "x86.h"
#include "kvm_cache_regs.h"
#include "cpuid.h"
+#include "isolation.h"
#include <linux/kvm_host.h>
#include <linux/types.h>
@@ -4059,7 +4060,7 @@ int kvm_handle_page_fault(struct kvm_vcpu *vcpu, u64 error_code,
{
int r = 1;
- vcpu->arch.l1tf_flush_l1d = true;
+ kvm_may_access_sensitive_data(vcpu);
switch (vcpu->arch.apf.host_apf_reason) {
default:
trace_kvm_page_fault(fault_address, error_code);
@@ -3307,6 +3307,8 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
* guest. do_debug expects dr6 to be cleared after it runs, do the same.
*/
set_debugreg(0, 6);
+
+ kvm_may_access_sensitive_data(vcpu);
}
static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu,
@@ -5220,7 +5222,7 @@ int kvm_write_guest_virt_system(struct kvm_vcpu *vcpu, gva_t addr, void *val,
unsigned int bytes, struct x86_exception *exception)
{
/* kvm_write_guest_virt_system can pull in tons of pages. */
- vcpu->arch.l1tf_flush_l1d = true;
+ kvm_may_access_sensitive_data(vcpu);
return kvm_write_guest_virt_helper(addr, val, bytes, vcpu,
PFERR_WRITE_MASK, exception);
@@ -7948,12 +7950,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
vcpu->arch.last_guest_tsc = kvm_read_l1_tsc(vcpu, rdtsc());
- /*
- * TODO: Move this to where we architectually need to access
- * host (or other VM) sensitive data
- */
- kvm_isolation_exit();
-
vcpu->mode = OUTSIDE_GUEST_MODE;
smp_wmb();
@@ -8086,6 +8082,8 @@ static int vcpu_run(struct kvm_vcpu *vcpu)
srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
+ kvm_may_access_sensitive_data(vcpu);
+
return r;
}