]> xenbits.xensource.com Git - people/pauldu/linux.git/commitdiff
KVM: arm64: Provide __flush_dcache_area at EL2
authorQuentin Perret <qperret@google.com>
Fri, 19 Mar 2021 10:01:22 +0000 (10:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 19 Mar 2021 12:01:20 +0000 (12:01 +0000)
We will need to do cache maintenance at EL2 soon, so compile a copy of
__flush_dcache_area at EL2, and provide a copy of arm64_ftr_reg_ctrel0
as it is needed by the read_ctr macro.

Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210319100146.1149909-15-qperret@google.com
arch/arm64/include/asm/kvm_cpufeature.h
arch/arm64/kvm/hyp/nvhe/Makefile
arch/arm64/kvm/hyp/nvhe/cache.S [new file with mode: 0644]
arch/arm64/kvm/hyp/nvhe/hyp-smp.c
arch/arm64/kvm/sys_regs.c

index 3d245f96a9fee3325ff8c1b37f5930f97b2bd554..c2e7735f502b74c3b6afa6862dd1738a079d4511 100644 (file)
@@ -19,4 +19,6 @@
 #define DEFINE_KVM_HYP_CPU_FTR_REG(name) BUILD_BUG()
 #endif
 
+DECLARE_KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_ctrel0);
+
 #endif
index 6894a917f2904fac415dbb59e102979379ae7a09..42dde4bb80b1c8584e10323f3170b5905b6e7e57 100644 (file)
@@ -13,7 +13,8 @@ lib-objs := clear_page.o copy_page.o memcpy.o memset.o
 lib-objs := $(addprefix ../../../lib/, $(lib-objs))
 
 obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
-        hyp-main.o hyp-smp.o psci-relay.o early_alloc.o stub.o page_alloc.o
+        hyp-main.o hyp-smp.o psci-relay.o early_alloc.o stub.o page_alloc.o \
+        cache.o
 obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
         ../fpsimd.o ../hyp-entry.o ../exception.o
 obj-y += $(lib-objs)
diff --git a/arch/arm64/kvm/hyp/nvhe/cache.S b/arch/arm64/kvm/hyp/nvhe/cache.S
new file mode 100644 (file)
index 0000000..36cef69
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Code copied from arch/arm64/mm/cache.S.
+ */
+
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+#include <asm/alternative.h>
+
+SYM_FUNC_START_PI(__flush_dcache_area)
+       dcache_by_line_op civac, sy, x0, x1, x2, x3
+       ret
+SYM_FUNC_END_PI(__flush_dcache_area)
index 879559057dee0036c6e8b17599639eb11e374ec2..71f00aca90e7a3255b175dd0bca37a61943bba22 100644 (file)
@@ -5,9 +5,15 @@
  */
 
 #include <asm/kvm_asm.h>
+#include <asm/kvm_cpufeature.h>
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 
+/*
+ * Copies of the host's CPU features registers holding sanitized values.
+ */
+DEFINE_KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_ctrel0);
+
 /*
  * nVHE copy of data structures tracking available CPU cores.
  * Only entries for CPUs that were online at KVM init are populated.
index 6c5d133689aed471a49a389334d099e978789f35..3ec34c25e8778b510d3145dc69a62d3a8a404ef0 100644 (file)
@@ -2783,6 +2783,7 @@ struct __ftr_reg_copy_entry {
        u32                     sys_id;
        struct arm64_ftr_reg    *dst;
 } hyp_ftr_regs[] __initdata = {
+       CPU_FTR_REG_HYP_COPY(SYS_CTR_EL0, arm64_ftr_reg_ctrel0),
 };
 
 void __init setup_kvm_el2_caps(void)