All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible
@ 2021-12-02 17:10 ` Will Deacon
  0 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm; +Cc: Will Deacon, Marc Zyngier, linux-arm-kernel

Hi folks,

This series tidies up the header file usage for the nvhe hyp object so
that header files under arch/arm64/kvm/hyp/include are not included by
host code running at EL1.

For definitions that are shared between the host and hypervisor, these
are either moved to headers under arch/arm64/include/asm/ or are
generated by kbuild along similar lines to asm-offsets.h. For now, this
allows us to tidy up some of the pKVM reserved memory handling, but in
future this will also allow the pKVM EL2 data structures to avoid
polluting the host namespace.

Cheers,

Will

Cc: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Quentin Perret <qperret@google.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: Marc Zyngier <maz@kernel.org>

--->8

Will Deacon (3):
  arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
  KVM: arm64: Generate hyp_constants.h for the host
  KVM: arm64: Move host EL1 code out of hyp/ directory

 arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
 arch/arm64/include/asm/mmu.h                  |  1 +
 arch/arm64/kvm/.gitignore                     |  2 +
 arch/arm64/kvm/Makefile                       | 18 ++++-
 arch/arm64/kvm/hyp/Makefile                   |  2 +-
 arch/arm64/kvm/hyp/hyp-constants.c            | 10 +++
 arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
 arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
 arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
 arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
 arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
 11 files changed, 109 insertions(+), 63 deletions(-)
 create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
 create mode 100644 arch/arm64/kvm/.gitignore
 create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c
 rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)

-- 
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible
@ 2021-12-02 17:10 ` Will Deacon
  0 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm
  Cc: linux-arm-kernel, Will Deacon, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Fuad Tabba, Marc Zyngier

Hi folks,

This series tidies up the header file usage for the nvhe hyp object so
that header files under arch/arm64/kvm/hyp/include are not included by
host code running at EL1.

For definitions that are shared between the host and hypervisor, these
are either moved to headers under arch/arm64/include/asm/ or are
generated by kbuild along similar lines to asm-offsets.h. For now, this
allows us to tidy up some of the pKVM reserved memory handling, but in
future this will also allow the pKVM EL2 data structures to avoid
polluting the host namespace.

Cheers,

Will

Cc: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Quentin Perret <qperret@google.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: Marc Zyngier <maz@kernel.org>

--->8

Will Deacon (3):
  arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
  KVM: arm64: Generate hyp_constants.h for the host
  KVM: arm64: Move host EL1 code out of hyp/ directory

 arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
 arch/arm64/include/asm/mmu.h                  |  1 +
 arch/arm64/kvm/.gitignore                     |  2 +
 arch/arm64/kvm/Makefile                       | 18 ++++-
 arch/arm64/kvm/hyp/Makefile                   |  2 +-
 arch/arm64/kvm/hyp/hyp-constants.c            | 10 +++
 arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
 arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
 arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
 arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
 arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
 11 files changed, 109 insertions(+), 63 deletions(-)
 create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
 create mode 100644 arch/arm64/kvm/.gitignore
 create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c
 rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)

-- 
2.34.0.rc2.393.gf8c9666880-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
  2021-12-02 17:10 ` Will Deacon
@ 2021-12-02 17:10   ` Will Deacon
  -1 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm; +Cc: Will Deacon, Marc Zyngier, linux-arm-kernel

asm/mmu.h refers to cpus_have_const_cap() in the definition of
arm64_kernel_unmapped_at_el0() so include asm/cpufeature.h directly
rather than force all users of the header to do it themselves.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/include/asm/mmu.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
index e9c30859f80c..48f8466a4be9 100644
--- a/arch/arm64/include/asm/mmu.h
+++ b/arch/arm64/include/asm/mmu.h
@@ -15,6 +15,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/refcount.h>
+#include <asm/cpufeature.h>
 
 typedef struct {
 	atomic64_t	id;
-- 
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
@ 2021-12-02 17:10   ` Will Deacon
  0 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm
  Cc: linux-arm-kernel, Will Deacon, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Fuad Tabba, Marc Zyngier

asm/mmu.h refers to cpus_have_const_cap() in the definition of
arm64_kernel_unmapped_at_el0() so include asm/cpufeature.h directly
rather than force all users of the header to do it themselves.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/include/asm/mmu.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
index e9c30859f80c..48f8466a4be9 100644
--- a/arch/arm64/include/asm/mmu.h
+++ b/arch/arm64/include/asm/mmu.h
@@ -15,6 +15,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/refcount.h>
+#include <asm/cpufeature.h>
 
 typedef struct {
 	atomic64_t	id;
-- 
2.34.0.rc2.393.gf8c9666880-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host
  2021-12-02 17:10 ` Will Deacon
@ 2021-12-02 17:10   ` Will Deacon
  -1 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm; +Cc: Will Deacon, Marc Zyngier, linux-arm-kernel

In order to avoid exposing hypervisor (EL2) data structures directly to
the host, generate hyp_constants.h to provide constants such as structure
sizes to the host without dragging in the definitions themselves.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/kvm/.gitignore          |  2 ++
 arch/arm64/kvm/Makefile            | 16 ++++++++++++++++
 arch/arm64/kvm/hyp/hyp-constants.c | 10 ++++++++++
 3 files changed, 28 insertions(+)
 create mode 100644 arch/arm64/kvm/.gitignore
 create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c

diff --git a/arch/arm64/kvm/.gitignore b/arch/arm64/kvm/.gitignore
new file mode 100644
index 000000000000..6182aefb8302
--- /dev/null
+++ b/arch/arm64/kvm/.gitignore
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+hyp_constants.h
diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
index 989bb5dad2c8..0b561752f8d8 100644
--- a/arch/arm64/kvm/Makefile
+++ b/arch/arm64/kvm/Makefile
@@ -25,3 +25,19 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
 	 vgic/vgic-its.o vgic/vgic-debug.o
 
 kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o
+
+always-y := hyp_constants.h hyp-constants.s
+
+define rule_gen_hyp_constants
+	$(call filechk,offsets,__HYP_CONSTANTS_H__)
+endef
+
+CFLAGS_hyp-constants.o = -I $(srctree)/$(src)/hyp/include
+$(obj)/hyp-constants.s: $(src)/hyp/hyp-constants.c FORCE
+	$(call if_changed_dep,cc_s_c)
+
+$(obj)/hyp_constants.h: $(obj)/hyp-constants.s FORCE
+	$(call if_changed_rule,gen_hyp_constants)
+
+obj-kvm := $(addprefix $(obj)/, $(kvm-y))
+$(obj-kvm): $(obj)/hyp_constants.h
diff --git a/arch/arm64/kvm/hyp/hyp-constants.c b/arch/arm64/kvm/hyp/hyp-constants.c
new file mode 100644
index 000000000000..b3742a6691e8
--- /dev/null
+++ b/arch/arm64/kvm/hyp/hyp-constants.c
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/kbuild.h>
+#include <nvhe/memory.h>
+
+int main(void)
+{
+	DEFINE(STRUCT_HYP_PAGE_SIZE,	sizeof(struct hyp_page));
+	return 0;
+}
-- 
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host
@ 2021-12-02 17:10   ` Will Deacon
  0 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm
  Cc: linux-arm-kernel, Will Deacon, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Fuad Tabba, Marc Zyngier

In order to avoid exposing hypervisor (EL2) data structures directly to
the host, generate hyp_constants.h to provide constants such as structure
sizes to the host without dragging in the definitions themselves.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/kvm/.gitignore          |  2 ++
 arch/arm64/kvm/Makefile            | 16 ++++++++++++++++
 arch/arm64/kvm/hyp/hyp-constants.c | 10 ++++++++++
 3 files changed, 28 insertions(+)
 create mode 100644 arch/arm64/kvm/.gitignore
 create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c

diff --git a/arch/arm64/kvm/.gitignore b/arch/arm64/kvm/.gitignore
new file mode 100644
index 000000000000..6182aefb8302
--- /dev/null
+++ b/arch/arm64/kvm/.gitignore
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+hyp_constants.h
diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
index 989bb5dad2c8..0b561752f8d8 100644
--- a/arch/arm64/kvm/Makefile
+++ b/arch/arm64/kvm/Makefile
@@ -25,3 +25,19 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
 	 vgic/vgic-its.o vgic/vgic-debug.o
 
 kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o
+
+always-y := hyp_constants.h hyp-constants.s
+
+define rule_gen_hyp_constants
+	$(call filechk,offsets,__HYP_CONSTANTS_H__)
+endef
+
+CFLAGS_hyp-constants.o = -I $(srctree)/$(src)/hyp/include
+$(obj)/hyp-constants.s: $(src)/hyp/hyp-constants.c FORCE
+	$(call if_changed_dep,cc_s_c)
+
+$(obj)/hyp_constants.h: $(obj)/hyp-constants.s FORCE
+	$(call if_changed_rule,gen_hyp_constants)
+
+obj-kvm := $(addprefix $(obj)/, $(kvm-y))
+$(obj-kvm): $(obj)/hyp_constants.h
diff --git a/arch/arm64/kvm/hyp/hyp-constants.c b/arch/arm64/kvm/hyp/hyp-constants.c
new file mode 100644
index 000000000000..b3742a6691e8
--- /dev/null
+++ b/arch/arm64/kvm/hyp/hyp-constants.c
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/kbuild.h>
+#include <nvhe/memory.h>
+
+int main(void)
+{
+	DEFINE(STRUCT_HYP_PAGE_SIZE,	sizeof(struct hyp_page));
+	return 0;
+}
-- 
2.34.0.rc2.393.gf8c9666880-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
  2021-12-02 17:10 ` Will Deacon
@ 2021-12-02 17:10   ` Will Deacon
  -1 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm; +Cc: Will Deacon, Marc Zyngier, linux-arm-kernel

kvm/hyp/reserved_mem.c contains host code executing at EL1 and is not
linked into the hypervisor object. Move the file into kvm/pkvm.c and
rework the headers so that the definitions shared between the host and
the hypervisor live in asm/kvm_pkvm.h.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
 arch/arm64/kvm/Makefile                       |  2 +-
 arch/arm64/kvm/hyp/Makefile                   |  2 +-
 arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
 arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
 arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
 arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
 arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
 8 files changed, 80 insertions(+), 63 deletions(-)
 create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
 rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)

diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
new file mode 100644
index 000000000000..9f4ad2a8df59
--- /dev/null
+++ b/arch/arm64/include/asm/kvm_pkvm.h
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 - Google LLC
+ * Author: Quentin Perret <qperret@google.com>
+ */
+#ifndef __ARM64_KVM_PKVM_H__
+#define __ARM64_KVM_PKVM_H__
+
+#include <linux/memblock.h>
+#include <asm/kvm_pgtable.h>
+
+#define HYP_MEMBLOCK_REGIONS 128
+
+extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
+extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
+
+static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
+{
+	unsigned long total = 0, i;
+
+	/* Provision the worst case scenario */
+	for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
+		nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
+		total += nr_pages;
+	}
+
+	return total;
+}
+
+static inline unsigned long __hyp_pgtable_total_pages(void)
+{
+	unsigned long res = 0, i;
+
+	/* Cover all of memory with page-granularity */
+	for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
+		struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
+		res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
+	}
+
+	return res;
+}
+
+static inline unsigned long hyp_s1_pgtable_pages(void)
+{
+	unsigned long res;
+
+	res = __hyp_pgtable_total_pages();
+
+	/* Allow 1 GiB for private mappings */
+	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
+
+	return res;
+}
+
+static inline unsigned long host_s2_pgtable_pages(void)
+{
+	unsigned long res;
+
+	/*
+	 * Include an extra 16 pages to safely upper-bound the worst case of
+	 * concatenated pgds.
+	 */
+	res = __hyp_pgtable_total_pages() + 16;
+
+	/* Allow 1 GiB for MMIO mappings */
+	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
+
+	return res;
+}
+
+#endif	/* __ARM64_KVM_PKVM_H__ */
diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
index 0b561752f8d8..8ca8cf6f5619 100644
--- a/arch/arm64/kvm/Makefile
+++ b/arch/arm64/kvm/Makefile
@@ -15,7 +15,7 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
 	 arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
 	 inject_fault.o va_layout.o handle_exit.o \
 	 guest.o debug.o reset.o sys_regs.o \
-	 vgic-sys-reg-v3.o fpsimd.o pmu.o \
+	 vgic-sys-reg-v3.o fpsimd.o pmu.o pkvm.o \
 	 arch_timer.o trng.o\
 	 vgic/vgic.o vgic/vgic-init.o \
 	 vgic/vgic-irqfd.o vgic/vgic-v2.o \
diff --git a/arch/arm64/kvm/hyp/Makefile b/arch/arm64/kvm/hyp/Makefile
index b726332eec49..687598e41b21 100644
--- a/arch/arm64/kvm/hyp/Makefile
+++ b/arch/arm64/kvm/hyp/Makefile
@@ -10,4 +10,4 @@ subdir-ccflags-y := -I$(incdir)				\
 		    -DDISABLE_BRANCH_PROFILING		\
 		    $(DISABLE_STACKLEAK_PLUGIN)
 
-obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o reserved_mem.o
+obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o
diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h
index c9a8f535212e..ef6a58a04235 100644
--- a/arch/arm64/kvm/hyp/include/nvhe/mm.h
+++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h
@@ -10,9 +10,6 @@
 #include <nvhe/memory.h>
 #include <nvhe/spinlock.h>
 
-#define HYP_MEMBLOCK_REGIONS 128
-extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
-extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
 extern struct kvm_pgtable pkvm_pgtable;
 extern hyp_spinlock_t pkvm_pgd_lock;
 extern struct hyp_pool hpool;
@@ -39,58 +36,4 @@ static inline void hyp_vmemmap_range(phys_addr_t phys, unsigned long size,
 	*end = ALIGN(*end, PAGE_SIZE);
 }
 
-static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
-{
-	unsigned long total = 0, i;
-
-	/* Provision the worst case scenario */
-	for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
-		nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
-		total += nr_pages;
-	}
-
-	return total;
-}
-
-static inline unsigned long __hyp_pgtable_total_pages(void)
-{
-	unsigned long res = 0, i;
-
-	/* Cover all of memory with page-granularity */
-	for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
-		struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
-		res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
-	}
-
-	return res;
-}
-
-static inline unsigned long hyp_s1_pgtable_pages(void)
-{
-	unsigned long res;
-
-	res = __hyp_pgtable_total_pages();
-
-	/* Allow 1 GiB for private mappings */
-	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
-
-	return res;
-}
-
-static inline unsigned long host_s2_pgtable_pages(void)
-{
-	unsigned long res;
-
-	/*
-	 * Include an extra 16 pages to safely upper-bound the worst case of
-	 * concatenated pgds.
-	 */
-	res = __hyp_pgtable_total_pages() + 16;
-
-	/* Allow 1 GiB for MMIO mappings */
-	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
-
-	return res;
-}
-
 #endif /* __KVM_HYP_MM_H */
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index c1a90dd022b8..92262e89672d 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -9,6 +9,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 #include <asm/stage2_pgtable.h>
 
 #include <hyp/fault.h>
diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c
index 2fabeceb889a..9e0ff5a700dd 100644
--- a/arch/arm64/kvm/hyp/nvhe/mm.c
+++ b/arch/arm64/kvm/hyp/nvhe/mm.c
@@ -8,6 +8,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 #include <asm/spectre.h>
 
 #include <nvhe/early_alloc.h>
diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
index 578f71798c2e..51e68a040d8a 100644
--- a/arch/arm64/kvm/hyp/nvhe/setup.c
+++ b/arch/arm64/kvm/hyp/nvhe/setup.c
@@ -8,6 +8,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 
 #include <nvhe/early_alloc.h>
 #include <nvhe/fixed_config.h>
diff --git a/arch/arm64/kvm/hyp/reserved_mem.c b/arch/arm64/kvm/pkvm.c
similarity index 94%
rename from arch/arm64/kvm/hyp/reserved_mem.c
rename to arch/arm64/kvm/pkvm.c
index 578670e3f608..ebecb7c045f4 100644
--- a/arch/arm64/kvm/hyp/reserved_mem.c
+++ b/arch/arm64/kvm/pkvm.c
@@ -8,10 +8,9 @@
 #include <linux/memblock.h>
 #include <linux/sort.h>
 
-#include <asm/kvm_host.h>
+#include <asm/kvm_pkvm.h>
 
-#include <nvhe/memory.h>
-#include <nvhe/mm.h>
+#include "hyp_constants.h"
 
 static struct memblock_region *hyp_memory = kvm_nvhe_sym(hyp_memory);
 static unsigned int *hyp_memblock_nr_ptr = &kvm_nvhe_sym(hyp_memblock_nr);
@@ -82,7 +81,8 @@ void __init kvm_hyp_reserve(void)
 	do {
 		prev = nr_pages;
 		nr_pages = hyp_mem_pages + prev;
-		nr_pages = DIV_ROUND_UP(nr_pages * sizeof(struct hyp_page), PAGE_SIZE);
+		nr_pages = DIV_ROUND_UP(nr_pages * STRUCT_HYP_PAGE_SIZE,
+					PAGE_SIZE);
 		nr_pages += __hyp_pgtable_max_pages(nr_pages);
 	} while (nr_pages != prev);
 	hyp_mem_pages += nr_pages;
-- 
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
@ 2021-12-02 17:10   ` Will Deacon
  0 siblings, 0 replies; 16+ messages in thread
From: Will Deacon @ 2021-12-02 17:10 UTC (permalink / raw)
  To: kvmarm
  Cc: linux-arm-kernel, Will Deacon, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Fuad Tabba, Marc Zyngier

kvm/hyp/reserved_mem.c contains host code executing at EL1 and is not
linked into the hypervisor object. Move the file into kvm/pkvm.c and
rework the headers so that the definitions shared between the host and
the hypervisor live in asm/kvm_pkvm.h.

Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
 arch/arm64/kvm/Makefile                       |  2 +-
 arch/arm64/kvm/hyp/Makefile                   |  2 +-
 arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
 arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
 arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
 arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
 arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
 8 files changed, 80 insertions(+), 63 deletions(-)
 create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
 rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)

diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
new file mode 100644
index 000000000000..9f4ad2a8df59
--- /dev/null
+++ b/arch/arm64/include/asm/kvm_pkvm.h
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 - Google LLC
+ * Author: Quentin Perret <qperret@google.com>
+ */
+#ifndef __ARM64_KVM_PKVM_H__
+#define __ARM64_KVM_PKVM_H__
+
+#include <linux/memblock.h>
+#include <asm/kvm_pgtable.h>
+
+#define HYP_MEMBLOCK_REGIONS 128
+
+extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
+extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
+
+static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
+{
+	unsigned long total = 0, i;
+
+	/* Provision the worst case scenario */
+	for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
+		nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
+		total += nr_pages;
+	}
+
+	return total;
+}
+
+static inline unsigned long __hyp_pgtable_total_pages(void)
+{
+	unsigned long res = 0, i;
+
+	/* Cover all of memory with page-granularity */
+	for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
+		struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
+		res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
+	}
+
+	return res;
+}
+
+static inline unsigned long hyp_s1_pgtable_pages(void)
+{
+	unsigned long res;
+
+	res = __hyp_pgtable_total_pages();
+
+	/* Allow 1 GiB for private mappings */
+	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
+
+	return res;
+}
+
+static inline unsigned long host_s2_pgtable_pages(void)
+{
+	unsigned long res;
+
+	/*
+	 * Include an extra 16 pages to safely upper-bound the worst case of
+	 * concatenated pgds.
+	 */
+	res = __hyp_pgtable_total_pages() + 16;
+
+	/* Allow 1 GiB for MMIO mappings */
+	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
+
+	return res;
+}
+
+#endif	/* __ARM64_KVM_PKVM_H__ */
diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
index 0b561752f8d8..8ca8cf6f5619 100644
--- a/arch/arm64/kvm/Makefile
+++ b/arch/arm64/kvm/Makefile
@@ -15,7 +15,7 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
 	 arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
 	 inject_fault.o va_layout.o handle_exit.o \
 	 guest.o debug.o reset.o sys_regs.o \
-	 vgic-sys-reg-v3.o fpsimd.o pmu.o \
+	 vgic-sys-reg-v3.o fpsimd.o pmu.o pkvm.o \
 	 arch_timer.o trng.o\
 	 vgic/vgic.o vgic/vgic-init.o \
 	 vgic/vgic-irqfd.o vgic/vgic-v2.o \
diff --git a/arch/arm64/kvm/hyp/Makefile b/arch/arm64/kvm/hyp/Makefile
index b726332eec49..687598e41b21 100644
--- a/arch/arm64/kvm/hyp/Makefile
+++ b/arch/arm64/kvm/hyp/Makefile
@@ -10,4 +10,4 @@ subdir-ccflags-y := -I$(incdir)				\
 		    -DDISABLE_BRANCH_PROFILING		\
 		    $(DISABLE_STACKLEAK_PLUGIN)
 
-obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o reserved_mem.o
+obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o
diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h
index c9a8f535212e..ef6a58a04235 100644
--- a/arch/arm64/kvm/hyp/include/nvhe/mm.h
+++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h
@@ -10,9 +10,6 @@
 #include <nvhe/memory.h>
 #include <nvhe/spinlock.h>
 
-#define HYP_MEMBLOCK_REGIONS 128
-extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
-extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
 extern struct kvm_pgtable pkvm_pgtable;
 extern hyp_spinlock_t pkvm_pgd_lock;
 extern struct hyp_pool hpool;
@@ -39,58 +36,4 @@ static inline void hyp_vmemmap_range(phys_addr_t phys, unsigned long size,
 	*end = ALIGN(*end, PAGE_SIZE);
 }
 
-static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
-{
-	unsigned long total = 0, i;
-
-	/* Provision the worst case scenario */
-	for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
-		nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
-		total += nr_pages;
-	}
-
-	return total;
-}
-
-static inline unsigned long __hyp_pgtable_total_pages(void)
-{
-	unsigned long res = 0, i;
-
-	/* Cover all of memory with page-granularity */
-	for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
-		struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
-		res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
-	}
-
-	return res;
-}
-
-static inline unsigned long hyp_s1_pgtable_pages(void)
-{
-	unsigned long res;
-
-	res = __hyp_pgtable_total_pages();
-
-	/* Allow 1 GiB for private mappings */
-	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
-
-	return res;
-}
-
-static inline unsigned long host_s2_pgtable_pages(void)
-{
-	unsigned long res;
-
-	/*
-	 * Include an extra 16 pages to safely upper-bound the worst case of
-	 * concatenated pgds.
-	 */
-	res = __hyp_pgtable_total_pages() + 16;
-
-	/* Allow 1 GiB for MMIO mappings */
-	res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
-
-	return res;
-}
-
 #endif /* __KVM_HYP_MM_H */
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index c1a90dd022b8..92262e89672d 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -9,6 +9,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 #include <asm/stage2_pgtable.h>
 
 #include <hyp/fault.h>
diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c
index 2fabeceb889a..9e0ff5a700dd 100644
--- a/arch/arm64/kvm/hyp/nvhe/mm.c
+++ b/arch/arm64/kvm/hyp/nvhe/mm.c
@@ -8,6 +8,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 #include <asm/spectre.h>
 
 #include <nvhe/early_alloc.h>
diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
index 578f71798c2e..51e68a040d8a 100644
--- a/arch/arm64/kvm/hyp/nvhe/setup.c
+++ b/arch/arm64/kvm/hyp/nvhe/setup.c
@@ -8,6 +8,7 @@
 #include <asm/kvm_hyp.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_pgtable.h>
+#include <asm/kvm_pkvm.h>
 
 #include <nvhe/early_alloc.h>
 #include <nvhe/fixed_config.h>
diff --git a/arch/arm64/kvm/hyp/reserved_mem.c b/arch/arm64/kvm/pkvm.c
similarity index 94%
rename from arch/arm64/kvm/hyp/reserved_mem.c
rename to arch/arm64/kvm/pkvm.c
index 578670e3f608..ebecb7c045f4 100644
--- a/arch/arm64/kvm/hyp/reserved_mem.c
+++ b/arch/arm64/kvm/pkvm.c
@@ -8,10 +8,9 @@
 #include <linux/memblock.h>
 #include <linux/sort.h>
 
-#include <asm/kvm_host.h>
+#include <asm/kvm_pkvm.h>
 
-#include <nvhe/memory.h>
-#include <nvhe/mm.h>
+#include "hyp_constants.h"
 
 static struct memblock_region *hyp_memory = kvm_nvhe_sym(hyp_memory);
 static unsigned int *hyp_memblock_nr_ptr = &kvm_nvhe_sym(hyp_memblock_nr);
@@ -82,7 +81,8 @@ void __init kvm_hyp_reserve(void)
 	do {
 		prev = nr_pages;
 		nr_pages = hyp_mem_pages + prev;
-		nr_pages = DIV_ROUND_UP(nr_pages * sizeof(struct hyp_page), PAGE_SIZE);
+		nr_pages = DIV_ROUND_UP(nr_pages * STRUCT_HYP_PAGE_SIZE,
+					PAGE_SIZE);
 		nr_pages += __hyp_pgtable_max_pages(nr_pages);
 	} while (nr_pages != prev);
 	hyp_mem_pages += nr_pages;
-- 
2.34.0.rc2.393.gf8c9666880-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
  2021-12-02 17:10   ` Will Deacon
@ 2021-12-03  8:24     ` Fuad Tabba
  -1 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:24 UTC (permalink / raw)
  To: Will Deacon; +Cc: Marc Zyngier, kvmarm, linux-arm-kernel

Hi Will,

On Thu, Dec 2, 2021 at 5:10 PM Will Deacon <will@kernel.org> wrote:
>
> asm/mmu.h refers to cpus_have_const_cap() in the definition of
> arm64_kernel_unmapped_at_el0() so include asm/cpufeature.h directly
> rather than force all users of the header to do it themselves.

Simplifies the code and makes it cleaner.

I tested this code (the complete patch series) as well and it ran fine.

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad


> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/include/asm/mmu.h | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
> index e9c30859f80c..48f8466a4be9 100644
> --- a/arch/arm64/include/asm/mmu.h
> +++ b/arch/arm64/include/asm/mmu.h
> @@ -15,6 +15,7 @@
>  #ifndef __ASSEMBLY__
>
>  #include <linux/refcount.h>
> +#include <asm/cpufeature.h>
>
>  typedef struct {
>         atomic64_t      id;
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
@ 2021-12-03  8:24     ` Fuad Tabba
  0 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:24 UTC (permalink / raw)
  To: Will Deacon
  Cc: kvmarm, linux-arm-kernel, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Marc Zyngier

Hi Will,

On Thu, Dec 2, 2021 at 5:10 PM Will Deacon <will@kernel.org> wrote:
>
> asm/mmu.h refers to cpus_have_const_cap() in the definition of
> arm64_kernel_unmapped_at_el0() so include asm/cpufeature.h directly
> rather than force all users of the header to do it themselves.

Simplifies the code and makes it cleaner.

I tested this code (the complete patch series) as well and it ran fine.

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad


> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/include/asm/mmu.h | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
> index e9c30859f80c..48f8466a4be9 100644
> --- a/arch/arm64/include/asm/mmu.h
> +++ b/arch/arm64/include/asm/mmu.h
> @@ -15,6 +15,7 @@
>  #ifndef __ASSEMBLY__
>
>  #include <linux/refcount.h>
> +#include <asm/cpufeature.h>
>
>  typedef struct {
>         atomic64_t      id;
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host
  2021-12-02 17:10   ` Will Deacon
@ 2021-12-03  8:28     ` Fuad Tabba
  -1 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:28 UTC (permalink / raw)
  To: Will Deacon; +Cc: Marc Zyngier, kvmarm, linux-arm-kernel

Hi Will,

On Thu, Dec 2, 2021 at 5:11 PM Will Deacon <will@kernel.org> wrote:
>
> In order to avoid exposing hypervisor (EL2) data structures directly to
> the host, generate hyp_constants.h to provide constants such as structure
> sizes to the host without dragging in the definitions themselves.

That's some fine kbuild wizardry right there! :)

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad

> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/kvm/.gitignore          |  2 ++
>  arch/arm64/kvm/Makefile            | 16 ++++++++++++++++
>  arch/arm64/kvm/hyp/hyp-constants.c | 10 ++++++++++
>  3 files changed, 28 insertions(+)
>  create mode 100644 arch/arm64/kvm/.gitignore
>  create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c
>
> diff --git a/arch/arm64/kvm/.gitignore b/arch/arm64/kvm/.gitignore
> new file mode 100644
> index 000000000000..6182aefb8302
> --- /dev/null
> +++ b/arch/arm64/kvm/.gitignore
> @@ -0,0 +1,2 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +hyp_constants.h
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index 989bb5dad2c8..0b561752f8d8 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -25,3 +25,19 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
>          vgic/vgic-its.o vgic/vgic-debug.o
>
>  kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o
> +
> +always-y := hyp_constants.h hyp-constants.s
> +
> +define rule_gen_hyp_constants
> +       $(call filechk,offsets,__HYP_CONSTANTS_H__)
> +endef
> +
> +CFLAGS_hyp-constants.o = -I $(srctree)/$(src)/hyp/include
> +$(obj)/hyp-constants.s: $(src)/hyp/hyp-constants.c FORCE
> +       $(call if_changed_dep,cc_s_c)
> +
> +$(obj)/hyp_constants.h: $(obj)/hyp-constants.s FORCE
> +       $(call if_changed_rule,gen_hyp_constants)
> +
> +obj-kvm := $(addprefix $(obj)/, $(kvm-y))
> +$(obj-kvm): $(obj)/hyp_constants.h
> diff --git a/arch/arm64/kvm/hyp/hyp-constants.c b/arch/arm64/kvm/hyp/hyp-constants.c
> new file mode 100644
> index 000000000000..b3742a6691e8
> --- /dev/null
> +++ b/arch/arm64/kvm/hyp/hyp-constants.c
> @@ -0,0 +1,10 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#include <linux/kbuild.h>
> +#include <nvhe/memory.h>
> +
> +int main(void)
> +{
> +       DEFINE(STRUCT_HYP_PAGE_SIZE,    sizeof(struct hyp_page));
> +       return 0;
> +}
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host
@ 2021-12-03  8:28     ` Fuad Tabba
  0 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:28 UTC (permalink / raw)
  To: Will Deacon
  Cc: kvmarm, linux-arm-kernel, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Marc Zyngier

Hi Will,

On Thu, Dec 2, 2021 at 5:11 PM Will Deacon <will@kernel.org> wrote:
>
> In order to avoid exposing hypervisor (EL2) data structures directly to
> the host, generate hyp_constants.h to provide constants such as structure
> sizes to the host without dragging in the definitions themselves.

That's some fine kbuild wizardry right there! :)

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad

> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/kvm/.gitignore          |  2 ++
>  arch/arm64/kvm/Makefile            | 16 ++++++++++++++++
>  arch/arm64/kvm/hyp/hyp-constants.c | 10 ++++++++++
>  3 files changed, 28 insertions(+)
>  create mode 100644 arch/arm64/kvm/.gitignore
>  create mode 100644 arch/arm64/kvm/hyp/hyp-constants.c
>
> diff --git a/arch/arm64/kvm/.gitignore b/arch/arm64/kvm/.gitignore
> new file mode 100644
> index 000000000000..6182aefb8302
> --- /dev/null
> +++ b/arch/arm64/kvm/.gitignore
> @@ -0,0 +1,2 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +hyp_constants.h
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index 989bb5dad2c8..0b561752f8d8 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -25,3 +25,19 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
>          vgic/vgic-its.o vgic/vgic-debug.o
>
>  kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o
> +
> +always-y := hyp_constants.h hyp-constants.s
> +
> +define rule_gen_hyp_constants
> +       $(call filechk,offsets,__HYP_CONSTANTS_H__)
> +endef
> +
> +CFLAGS_hyp-constants.o = -I $(srctree)/$(src)/hyp/include
> +$(obj)/hyp-constants.s: $(src)/hyp/hyp-constants.c FORCE
> +       $(call if_changed_dep,cc_s_c)
> +
> +$(obj)/hyp_constants.h: $(obj)/hyp-constants.s FORCE
> +       $(call if_changed_rule,gen_hyp_constants)
> +
> +obj-kvm := $(addprefix $(obj)/, $(kvm-y))
> +$(obj-kvm): $(obj)/hyp_constants.h
> diff --git a/arch/arm64/kvm/hyp/hyp-constants.c b/arch/arm64/kvm/hyp/hyp-constants.c
> new file mode 100644
> index 000000000000..b3742a6691e8
> --- /dev/null
> +++ b/arch/arm64/kvm/hyp/hyp-constants.c
> @@ -0,0 +1,10 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#include <linux/kbuild.h>
> +#include <nvhe/memory.h>
> +
> +int main(void)
> +{
> +       DEFINE(STRUCT_HYP_PAGE_SIZE,    sizeof(struct hyp_page));
> +       return 0;
> +}
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
  2021-12-02 17:10   ` Will Deacon
@ 2021-12-03  8:32     ` Fuad Tabba
  -1 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:32 UTC (permalink / raw)
  To: Will Deacon; +Cc: Marc Zyngier, kvmarm, linux-arm-kernel

Hi Will,

On Thu, Dec 2, 2021 at 5:11 PM Will Deacon <will@kernel.org> wrote:
>
> kvm/hyp/reserved_mem.c contains host code executing at EL1 and is not
> linked into the hypervisor object. Move the file into kvm/pkvm.c and
> rework the headers so that the definitions shared between the host and
> the hypervisor live in asm/kvm_pkvm.h.

It's good to have only hyp code in hyp.

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad

> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
>  arch/arm64/kvm/Makefile                       |  2 +-
>  arch/arm64/kvm/hyp/Makefile                   |  2 +-
>  arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
>  arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
>  arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
>  arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
>  arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
>  8 files changed, 80 insertions(+), 63 deletions(-)
>  create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
>  rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)
>
> diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
> new file mode 100644
> index 000000000000..9f4ad2a8df59
> --- /dev/null
> +++ b/arch/arm64/include/asm/kvm_pkvm.h
> @@ -0,0 +1,71 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2020 - Google LLC
> + * Author: Quentin Perret <qperret@google.com>
> + */
> +#ifndef __ARM64_KVM_PKVM_H__
> +#define __ARM64_KVM_PKVM_H__
> +
> +#include <linux/memblock.h>
> +#include <asm/kvm_pgtable.h>
> +
> +#define HYP_MEMBLOCK_REGIONS 128
> +
> +extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
> +extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
> +
> +static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
> +{
> +       unsigned long total = 0, i;
> +
> +       /* Provision the worst case scenario */
> +       for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
> +               nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
> +               total += nr_pages;
> +       }
> +
> +       return total;
> +}
> +
> +static inline unsigned long __hyp_pgtable_total_pages(void)
> +{
> +       unsigned long res = 0, i;
> +
> +       /* Cover all of memory with page-granularity */
> +       for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
> +               struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
> +               res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
> +       }
> +
> +       return res;
> +}
> +
> +static inline unsigned long hyp_s1_pgtable_pages(void)
> +{
> +       unsigned long res;
> +
> +       res = __hyp_pgtable_total_pages();
> +
> +       /* Allow 1 GiB for private mappings */
> +       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> +
> +       return res;
> +}
> +
> +static inline unsigned long host_s2_pgtable_pages(void)
> +{
> +       unsigned long res;
> +
> +       /*
> +        * Include an extra 16 pages to safely upper-bound the worst case of
> +        * concatenated pgds.
> +        */
> +       res = __hyp_pgtable_total_pages() + 16;
> +
> +       /* Allow 1 GiB for MMIO mappings */
> +       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> +
> +       return res;
> +}
> +
> +#endif /* __ARM64_KVM_PKVM_H__ */
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index 0b561752f8d8..8ca8cf6f5619 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -15,7 +15,7 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
>          arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
>          inject_fault.o va_layout.o handle_exit.o \
>          guest.o debug.o reset.o sys_regs.o \
> -        vgic-sys-reg-v3.o fpsimd.o pmu.o \
> +        vgic-sys-reg-v3.o fpsimd.o pmu.o pkvm.o \
>          arch_timer.o trng.o\
>          vgic/vgic.o vgic/vgic-init.o \
>          vgic/vgic-irqfd.o vgic/vgic-v2.o \
> diff --git a/arch/arm64/kvm/hyp/Makefile b/arch/arm64/kvm/hyp/Makefile
> index b726332eec49..687598e41b21 100644
> --- a/arch/arm64/kvm/hyp/Makefile
> +++ b/arch/arm64/kvm/hyp/Makefile
> @@ -10,4 +10,4 @@ subdir-ccflags-y := -I$(incdir)                               \
>                     -DDISABLE_BRANCH_PROFILING          \
>                     $(DISABLE_STACKLEAK_PLUGIN)
>
> -obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o reserved_mem.o
> +obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o
> diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h
> index c9a8f535212e..ef6a58a04235 100644
> --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h
> +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h
> @@ -10,9 +10,6 @@
>  #include <nvhe/memory.h>
>  #include <nvhe/spinlock.h>
>
> -#define HYP_MEMBLOCK_REGIONS 128
> -extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
> -extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
>  extern struct kvm_pgtable pkvm_pgtable;
>  extern hyp_spinlock_t pkvm_pgd_lock;
>  extern struct hyp_pool hpool;
> @@ -39,58 +36,4 @@ static inline void hyp_vmemmap_range(phys_addr_t phys, unsigned long size,
>         *end = ALIGN(*end, PAGE_SIZE);
>  }
>
> -static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
> -{
> -       unsigned long total = 0, i;
> -
> -       /* Provision the worst case scenario */
> -       for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
> -               nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
> -               total += nr_pages;
> -       }
> -
> -       return total;
> -}
> -
> -static inline unsigned long __hyp_pgtable_total_pages(void)
> -{
> -       unsigned long res = 0, i;
> -
> -       /* Cover all of memory with page-granularity */
> -       for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
> -               struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
> -               res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
> -       }
> -
> -       return res;
> -}
> -
> -static inline unsigned long hyp_s1_pgtable_pages(void)
> -{
> -       unsigned long res;
> -
> -       res = __hyp_pgtable_total_pages();
> -
> -       /* Allow 1 GiB for private mappings */
> -       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> -
> -       return res;
> -}
> -
> -static inline unsigned long host_s2_pgtable_pages(void)
> -{
> -       unsigned long res;
> -
> -       /*
> -        * Include an extra 16 pages to safely upper-bound the worst case of
> -        * concatenated pgds.
> -        */
> -       res = __hyp_pgtable_total_pages() + 16;
> -
> -       /* Allow 1 GiB for MMIO mappings */
> -       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> -
> -       return res;
> -}
> -
>  #endif /* __KVM_HYP_MM_H */
> diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> index c1a90dd022b8..92262e89672d 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> @@ -9,6 +9,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>  #include <asm/stage2_pgtable.h>
>
>  #include <hyp/fault.h>
> diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c
> index 2fabeceb889a..9e0ff5a700dd 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mm.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mm.c
> @@ -8,6 +8,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>  #include <asm/spectre.h>
>
>  #include <nvhe/early_alloc.h>
> diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
> index 578f71798c2e..51e68a040d8a 100644
> --- a/arch/arm64/kvm/hyp/nvhe/setup.c
> +++ b/arch/arm64/kvm/hyp/nvhe/setup.c
> @@ -8,6 +8,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>
>  #include <nvhe/early_alloc.h>
>  #include <nvhe/fixed_config.h>
> diff --git a/arch/arm64/kvm/hyp/reserved_mem.c b/arch/arm64/kvm/pkvm.c
> similarity index 94%
> rename from arch/arm64/kvm/hyp/reserved_mem.c
> rename to arch/arm64/kvm/pkvm.c
> index 578670e3f608..ebecb7c045f4 100644
> --- a/arch/arm64/kvm/hyp/reserved_mem.c
> +++ b/arch/arm64/kvm/pkvm.c
> @@ -8,10 +8,9 @@
>  #include <linux/memblock.h>
>  #include <linux/sort.h>
>
> -#include <asm/kvm_host.h>
> +#include <asm/kvm_pkvm.h>
>
> -#include <nvhe/memory.h>
> -#include <nvhe/mm.h>
> +#include "hyp_constants.h"
>
>  static struct memblock_region *hyp_memory = kvm_nvhe_sym(hyp_memory);
>  static unsigned int *hyp_memblock_nr_ptr = &kvm_nvhe_sym(hyp_memblock_nr);
> @@ -82,7 +81,8 @@ void __init kvm_hyp_reserve(void)
>         do {
>                 prev = nr_pages;
>                 nr_pages = hyp_mem_pages + prev;
> -               nr_pages = DIV_ROUND_UP(nr_pages * sizeof(struct hyp_page), PAGE_SIZE);
> +               nr_pages = DIV_ROUND_UP(nr_pages * STRUCT_HYP_PAGE_SIZE,
> +                                       PAGE_SIZE);
>                 nr_pages += __hyp_pgtable_max_pages(nr_pages);
>         } while (nr_pages != prev);
>         hyp_mem_pages += nr_pages;
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
@ 2021-12-03  8:32     ` Fuad Tabba
  0 siblings, 0 replies; 16+ messages in thread
From: Fuad Tabba @ 2021-12-03  8:32 UTC (permalink / raw)
  To: Will Deacon
  Cc: kvmarm, linux-arm-kernel, Alexandru Elisei, James Morse,
	Quentin Perret, Suzuki K Poulose, Marc Zyngier

Hi Will,

On Thu, Dec 2, 2021 at 5:11 PM Will Deacon <will@kernel.org> wrote:
>
> kvm/hyp/reserved_mem.c contains host code executing at EL1 and is not
> linked into the hypervisor object. Move the file into kvm/pkvm.c and
> rework the headers so that the definitions shared between the host and
> the hypervisor live in asm/kvm_pkvm.h.

It's good to have only hyp code in hyp.

Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>

Cheers,
/fuad

> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/include/asm/kvm_pkvm.h             | 71 +++++++++++++++++++
>  arch/arm64/kvm/Makefile                       |  2 +-
>  arch/arm64/kvm/hyp/Makefile                   |  2 +-
>  arch/arm64/kvm/hyp/include/nvhe/mm.h          | 57 ---------------
>  arch/arm64/kvm/hyp/nvhe/mem_protect.c         |  1 +
>  arch/arm64/kvm/hyp/nvhe/mm.c                  |  1 +
>  arch/arm64/kvm/hyp/nvhe/setup.c               |  1 +
>  arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} |  8 +--
>  8 files changed, 80 insertions(+), 63 deletions(-)
>  create mode 100644 arch/arm64/include/asm/kvm_pkvm.h
>  rename arch/arm64/kvm/{hyp/reserved_mem.c => pkvm.c} (94%)
>
> diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
> new file mode 100644
> index 000000000000..9f4ad2a8df59
> --- /dev/null
> +++ b/arch/arm64/include/asm/kvm_pkvm.h
> @@ -0,0 +1,71 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2020 - Google LLC
> + * Author: Quentin Perret <qperret@google.com>
> + */
> +#ifndef __ARM64_KVM_PKVM_H__
> +#define __ARM64_KVM_PKVM_H__
> +
> +#include <linux/memblock.h>
> +#include <asm/kvm_pgtable.h>
> +
> +#define HYP_MEMBLOCK_REGIONS 128
> +
> +extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
> +extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
> +
> +static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
> +{
> +       unsigned long total = 0, i;
> +
> +       /* Provision the worst case scenario */
> +       for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
> +               nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
> +               total += nr_pages;
> +       }
> +
> +       return total;
> +}
> +
> +static inline unsigned long __hyp_pgtable_total_pages(void)
> +{
> +       unsigned long res = 0, i;
> +
> +       /* Cover all of memory with page-granularity */
> +       for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
> +               struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
> +               res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
> +       }
> +
> +       return res;
> +}
> +
> +static inline unsigned long hyp_s1_pgtable_pages(void)
> +{
> +       unsigned long res;
> +
> +       res = __hyp_pgtable_total_pages();
> +
> +       /* Allow 1 GiB for private mappings */
> +       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> +
> +       return res;
> +}
> +
> +static inline unsigned long host_s2_pgtable_pages(void)
> +{
> +       unsigned long res;
> +
> +       /*
> +        * Include an extra 16 pages to safely upper-bound the worst case of
> +        * concatenated pgds.
> +        */
> +       res = __hyp_pgtable_total_pages() + 16;
> +
> +       /* Allow 1 GiB for MMIO mappings */
> +       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> +
> +       return res;
> +}
> +
> +#endif /* __ARM64_KVM_PKVM_H__ */
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index 0b561752f8d8..8ca8cf6f5619 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -15,7 +15,7 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
>          arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
>          inject_fault.o va_layout.o handle_exit.o \
>          guest.o debug.o reset.o sys_regs.o \
> -        vgic-sys-reg-v3.o fpsimd.o pmu.o \
> +        vgic-sys-reg-v3.o fpsimd.o pmu.o pkvm.o \
>          arch_timer.o trng.o\
>          vgic/vgic.o vgic/vgic-init.o \
>          vgic/vgic-irqfd.o vgic/vgic-v2.o \
> diff --git a/arch/arm64/kvm/hyp/Makefile b/arch/arm64/kvm/hyp/Makefile
> index b726332eec49..687598e41b21 100644
> --- a/arch/arm64/kvm/hyp/Makefile
> +++ b/arch/arm64/kvm/hyp/Makefile
> @@ -10,4 +10,4 @@ subdir-ccflags-y := -I$(incdir)                               \
>                     -DDISABLE_BRANCH_PROFILING          \
>                     $(DISABLE_STACKLEAK_PLUGIN)
>
> -obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o reserved_mem.o
> +obj-$(CONFIG_KVM) += vhe/ nvhe/ pgtable.o
> diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h
> index c9a8f535212e..ef6a58a04235 100644
> --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h
> +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h
> @@ -10,9 +10,6 @@
>  #include <nvhe/memory.h>
>  #include <nvhe/spinlock.h>
>
> -#define HYP_MEMBLOCK_REGIONS 128
> -extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
> -extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
>  extern struct kvm_pgtable pkvm_pgtable;
>  extern hyp_spinlock_t pkvm_pgd_lock;
>  extern struct hyp_pool hpool;
> @@ -39,58 +36,4 @@ static inline void hyp_vmemmap_range(phys_addr_t phys, unsigned long size,
>         *end = ALIGN(*end, PAGE_SIZE);
>  }
>
> -static inline unsigned long __hyp_pgtable_max_pages(unsigned long nr_pages)
> -{
> -       unsigned long total = 0, i;
> -
> -       /* Provision the worst case scenario */
> -       for (i = 0; i < KVM_PGTABLE_MAX_LEVELS; i++) {
> -               nr_pages = DIV_ROUND_UP(nr_pages, PTRS_PER_PTE);
> -               total += nr_pages;
> -       }
> -
> -       return total;
> -}
> -
> -static inline unsigned long __hyp_pgtable_total_pages(void)
> -{
> -       unsigned long res = 0, i;
> -
> -       /* Cover all of memory with page-granularity */
> -       for (i = 0; i < kvm_nvhe_sym(hyp_memblock_nr); i++) {
> -               struct memblock_region *reg = &kvm_nvhe_sym(hyp_memory)[i];
> -               res += __hyp_pgtable_max_pages(reg->size >> PAGE_SHIFT);
> -       }
> -
> -       return res;
> -}
> -
> -static inline unsigned long hyp_s1_pgtable_pages(void)
> -{
> -       unsigned long res;
> -
> -       res = __hyp_pgtable_total_pages();
> -
> -       /* Allow 1 GiB for private mappings */
> -       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> -
> -       return res;
> -}
> -
> -static inline unsigned long host_s2_pgtable_pages(void)
> -{
> -       unsigned long res;
> -
> -       /*
> -        * Include an extra 16 pages to safely upper-bound the worst case of
> -        * concatenated pgds.
> -        */
> -       res = __hyp_pgtable_total_pages() + 16;
> -
> -       /* Allow 1 GiB for MMIO mappings */
> -       res += __hyp_pgtable_max_pages(SZ_1G >> PAGE_SHIFT);
> -
> -       return res;
> -}
> -
>  #endif /* __KVM_HYP_MM_H */
> diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> index c1a90dd022b8..92262e89672d 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> @@ -9,6 +9,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>  #include <asm/stage2_pgtable.h>
>
>  #include <hyp/fault.h>
> diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c
> index 2fabeceb889a..9e0ff5a700dd 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mm.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mm.c
> @@ -8,6 +8,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>  #include <asm/spectre.h>
>
>  #include <nvhe/early_alloc.h>
> diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
> index 578f71798c2e..51e68a040d8a 100644
> --- a/arch/arm64/kvm/hyp/nvhe/setup.c
> +++ b/arch/arm64/kvm/hyp/nvhe/setup.c
> @@ -8,6 +8,7 @@
>  #include <asm/kvm_hyp.h>
>  #include <asm/kvm_mmu.h>
>  #include <asm/kvm_pgtable.h>
> +#include <asm/kvm_pkvm.h>
>
>  #include <nvhe/early_alloc.h>
>  #include <nvhe/fixed_config.h>
> diff --git a/arch/arm64/kvm/hyp/reserved_mem.c b/arch/arm64/kvm/pkvm.c
> similarity index 94%
> rename from arch/arm64/kvm/hyp/reserved_mem.c
> rename to arch/arm64/kvm/pkvm.c
> index 578670e3f608..ebecb7c045f4 100644
> --- a/arch/arm64/kvm/hyp/reserved_mem.c
> +++ b/arch/arm64/kvm/pkvm.c
> @@ -8,10 +8,9 @@
>  #include <linux/memblock.h>
>  #include <linux/sort.h>
>
> -#include <asm/kvm_host.h>
> +#include <asm/kvm_pkvm.h>
>
> -#include <nvhe/memory.h>
> -#include <nvhe/mm.h>
> +#include "hyp_constants.h"
>
>  static struct memblock_region *hyp_memory = kvm_nvhe_sym(hyp_memory);
>  static unsigned int *hyp_memblock_nr_ptr = &kvm_nvhe_sym(hyp_memblock_nr);
> @@ -82,7 +81,8 @@ void __init kvm_hyp_reserve(void)
>         do {
>                 prev = nr_pages;
>                 nr_pages = hyp_mem_pages + prev;
> -               nr_pages = DIV_ROUND_UP(nr_pages * sizeof(struct hyp_page), PAGE_SIZE);
> +               nr_pages = DIV_ROUND_UP(nr_pages * STRUCT_HYP_PAGE_SIZE,
> +                                       PAGE_SIZE);
>                 nr_pages += __hyp_pgtable_max_pages(nr_pages);
>         } while (nr_pages != prev);
>         hyp_mem_pages += nr_pages;
> --
> 2.34.0.rc2.393.gf8c9666880-goog
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible
  2021-12-02 17:10 ` Will Deacon
@ 2021-12-06  8:41   ` Marc Zyngier
  -1 siblings, 0 replies; 16+ messages in thread
From: Marc Zyngier @ 2021-12-06  8:41 UTC (permalink / raw)
  To: Will Deacon, kvmarm; +Cc: linux-arm-kernel

On Thu, 2 Dec 2021 17:10:45 +0000, Will Deacon wrote:
> This series tidies up the header file usage for the nvhe hyp object so
> that header files under arch/arm64/kvm/hyp/include are not included by
> host code running at EL1.
> 
> For definitions that are shared between the host and hypervisor, these
> are either moved to headers under arch/arm64/include/asm/ or are
> generated by kbuild along similar lines to asm-offsets.h. For now, this
> allows us to tidy up some of the pKVM reserved memory handling, but in
> future this will also allow the pKVM EL2 data structures to avoid
> polluting the host namespace.
> 
> [...]

Applied to next, thanks!

[1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
      commit: 7e04f05984dd03edad7daaa4fa97958b7133c62a
[2/3] KVM: arm64: Generate hyp_constants.h for the host
      commit: ed4ed15d571065eb66ea718d7f6050553586417d
[3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
      commit: 9429f4b0412d05243237c7695c59d0a7b1174492

Cheers,

	M.
-- 
Without deviation from the norm, progress is not possible.


_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible
@ 2021-12-06  8:41   ` Marc Zyngier
  0 siblings, 0 replies; 16+ messages in thread
From: Marc Zyngier @ 2021-12-06  8:41 UTC (permalink / raw)
  To: Will Deacon, kvmarm; +Cc: linux-arm-kernel

On Thu, 2 Dec 2021 17:10:45 +0000, Will Deacon wrote:
> This series tidies up the header file usage for the nvhe hyp object so
> that header files under arch/arm64/kvm/hyp/include are not included by
> host code running at EL1.
> 
> For definitions that are shared between the host and hypervisor, these
> are either moved to headers under arch/arm64/include/asm/ or are
> generated by kbuild along similar lines to asm-offsets.h. For now, this
> allows us to tidy up some of the pKVM reserved memory handling, but in
> future this will also allow the pKVM EL2 data structures to avoid
> polluting the host namespace.
> 
> [...]

Applied to next, thanks!

[1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h
      commit: 7e04f05984dd03edad7daaa4fa97958b7133c62a
[2/3] KVM: arm64: Generate hyp_constants.h for the host
      commit: ed4ed15d571065eb66ea718d7f6050553586417d
[3/3] KVM: arm64: Move host EL1 code out of hyp/ directory
      commit: 9429f4b0412d05243237c7695c59d0a7b1174492

Cheers,

	M.
-- 
Without deviation from the norm, progress is not possible.



_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2021-12-06  8:43 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-02 17:10 [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible Will Deacon
2021-12-02 17:10 ` Will Deacon
2021-12-02 17:10 ` [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h Will Deacon
2021-12-02 17:10   ` Will Deacon
2021-12-03  8:24   ` Fuad Tabba
2021-12-03  8:24     ` Fuad Tabba
2021-12-02 17:10 ` [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host Will Deacon
2021-12-02 17:10   ` Will Deacon
2021-12-03  8:28   ` Fuad Tabba
2021-12-03  8:28     ` Fuad Tabba
2021-12-02 17:10 ` [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory Will Deacon
2021-12-02 17:10   ` Will Deacon
2021-12-03  8:32   ` Fuad Tabba
2021-12-03  8:32     ` Fuad Tabba
2021-12-06  8:41 ` [PATCH 0/3] KVM: arm64: Keep hyp and host headers separate where possible Marc Zyngier
2021-12-06  8:41   ` Marc Zyngier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.