[RFC KVM 06/27] KVM: x86: Exit KVM isolation on IRQ entry

From: Alexandre Chartre
Date: Mon May 13 2019 - 10:42:17 EST


From: Liran Alon <liran.alon@xxxxxxxxxx>

Next commits will change most of KVM #VMExit handlers to run
in KVM isolated address space. Any interrupt handler raised
during execution in KVM address space needs to switch back
to host address space.

This patch makes sure that IRQ handlers will run in full
host address space instead of KVM isolated address space.

Signed-off-by: Liran Alon <liran.alon@xxxxxxxxxx>
Signed-off-by: Alexandre Chartre <alexandre.chartre@xxxxxxxxxx>
---
arch/x86/include/asm/apic.h | 4 ++--
arch/x86/include/asm/hardirq.h | 10 ++++++++++
arch/x86/kernel/smp.c | 2 +-
arch/x86/platform/uv/tlb_uv.c | 2 +-
4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 130e81e..606da8f 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -515,7 +515,7 @@ static inline unsigned int read_apic_id(void)
static inline void entering_irq(void)
{
irq_enter();
- kvm_set_cpu_l1tf_flush_l1d();
+ kvm_cpu_may_access_sensitive_data();
}

static inline void entering_ack_irq(void)
@@ -528,7 +528,7 @@ static inline void ipi_entering_ack_irq(void)
{
irq_enter();
ack_APIC_irq();
- kvm_set_cpu_l1tf_flush_l1d();
+ kvm_cpu_may_access_sensitive_data();
}

static inline void exiting_irq(void)
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h
index d9069bb..e082ecb 100644
--- a/arch/x86/include/asm/hardirq.h
+++ b/arch/x86/include/asm/hardirq.h
@@ -80,4 +80,14 @@ static inline bool kvm_get_cpu_l1tf_flush_l1d(void)
static inline void kvm_set_cpu_l1tf_flush_l1d(void) { }
#endif /* IS_ENABLED(CONFIG_KVM_INTEL) */

+#ifdef CONFIG_HAVE_KVM
+extern void (*kvm_isolation_exit_handler)(void);
+
+static inline void kvm_cpu_may_access_sensitive_data(void)
+{
+ kvm_set_cpu_l1tf_flush_l1d();
+ kvm_isolation_exit_handler();
+}
+#endif
+
#endif /* _ASM_X86_HARDIRQ_H */
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 04adc8d..b99fda0 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -261,7 +261,7 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
{
ack_APIC_irq();
inc_irq_stat(irq_resched_count);
- kvm_set_cpu_l1tf_flush_l1d();
+ kvm_cpu_may_access_sensitive_data();

if (trace_resched_ipi_enabled()) {
/*
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
index 1297e18..83a17ca 100644
--- a/arch/x86/platform/uv/tlb_uv.c
+++ b/arch/x86/platform/uv/tlb_uv.c
@@ -1285,7 +1285,7 @@ void uv_bau_message_interrupt(struct pt_regs *regs)
struct msg_desc msgdesc;

ack_APIC_irq();
- kvm_set_cpu_l1tf_flush_l1d();
+ kvm_cpu_may_access_sensitive_data();
time_start = get_cycles();

bcp = &per_cpu(bau_control, smp_processor_id());
--
1.7.1