Skip to contentSkip to conversation

KVM: arm64: Keep hyp and host headers separate where possible

PATCH Applied Will Deacon 3 participants 8 messages Dec 2, 2021 – Dec 6, 2021

Subsystems (2)
lore
Share & tools
lore

Will Deacon

author maintainer
#0 lore raw

cover KVM: arm64: Keep hyp and host headers separate where possible

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 <[email protected]>
Cc James Morse <[email protected]>
Cc Quentin Perret <[email protected]>
Cc Suzuki K Poulose <[email protected]>
Cc Fuad Tabba <[email protected]>
Cc Marc Zyngier <[email protected]>

--->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%)
Signature · 6 lines
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
author maintainer
#1 lore raw

PATCH 1/3 arm64: Add missing include of asm/cpufeature.h to asm/mmu.h

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.

---
 arch/arm64/include/asm/mmu.h | 1 +
 1 file changed, 1 insertion(+)
arch/arm64/include/asm/mmu.h +1 -0
index e9c30859f80c..48f8466a4be9 100644
@@ -15,6 +15,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/refcount.h>
+#include <asm/cpufeature.h>
 
 typedef struct {
 	atomic64_t	id;
Signature · 6 lines
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Tested-by Reviewed-by on v1 1/3
#2 lore raw

Re: [PATCH 1/3] arm64: Add missing include of asm/cpufeature.h to asm/mmu.h

Hi Will,

Quoted 4 lines · Will Deacon

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.

Cheers,
/fuad

Quoted 18 lines
---
 arch/arm64/include/asm/mmu.h | 1 +
 1 file changed, 1 insertion(+)
arch/arm64/include/asm/mmu.h +1 -1
index e9c30859f80c..48f8466a4be9 100644
@@ -15,6 +15,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/refcount.h>
+#include <asm/cpufeature.h>
 
 typedef struct {
        atomic64_t      id;
--
Quoted 2 lines

2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

author maintainer
#3 lore raw

PATCH 2/3 KVM: arm64: Generate hyp_constants.h for the host

In reply to Will Deacon

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.

---
 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
arch/arm64/kvm/.gitignore new file +2 -0
new file mode 100644
index 000000000000..6182aefb8302
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+hyp_constants.h
arch/arm64/kvm/Makefile +16 -0
index 989bb5dad2c8..0b561752f8d8 100644
@@ -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
arch/arm64/kvm/hyp/hyp-constants.c new file +10 -0
new file mode 100644
index 000000000000..b3742a6691e8
@@ -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;
+}
Signature · 6 lines
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Tested-by Reviewed-by on v1 2/3
#4 lore raw

Re: [PATCH 2/3] KVM: arm64: Generate hyp_constants.h for the host

Hi Will,

Quoted 4 lines · Will Deacon

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! :)

Cheers,
/fuad

Quoted 58 lines
---
 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
arch/arm64/kvm/.gitignore new file +2 -0
new file mode 100644
index 000000000000..6182aefb8302
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+hyp_constants.h
arch/arm64/kvm/Makefile +16 -0
index 989bb5dad2c8..0b561752f8d8 100644
@@ -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
arch/arm64/kvm/hyp/hyp-constants.c new file +10 -1
new file mode 100644
index 000000000000..b3742a6691e8
@@ -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;
+}
--
Quoted 2 lines

2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

author maintainer
#5 lore raw

PATCH 3/3 KVM: arm64: Move host EL1 code out of hyp/ directory

In reply to Will Deacon

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.

---
 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%)
arch/arm64/include/asm/kvm_pkvm.h new file +71 -0
new file mode 100644
index 000000000000..9f4ad2a8df59
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 - Google LLC
+ * Author: Quentin Perret <[email protected]>
+ */
+#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__ */
arch/arm64/kvm/Makefile +1 -1
index 0b561752f8d8..8ca8cf6f5619 100644
@@ -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 \
arch/arm64/kvm/hyp/Makefile +1 -1
index b726332eec49..687598e41b21 100644
@@ -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
arch/arm64/kvm/hyp/include/nvhe/mm.h +0 -57

67 lines not on this page · raw message

arch/arm64/kvm/hyp/nvhe/mem_protect.c +1 -0
index c1a90dd022b8..92262e89672d 100644
@@ -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>
arch/arm64/kvm/hyp/nvhe/mm.c +1 -0
index 2fabeceb889a..9e0ff5a700dd 100644
@@ -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>
arch/arm64/kvm/hyp/nvhe/setup.c +1 -0
index 578f71798c2e..51e68a040d8a 100644
@@ -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>
arch/arm64/kvm/pkvm.c renamed from arch/arm64/kvm/hyp/reserved_mem.c +4 -4
similarity index 94%
rename from arch/arm64/kvm/hyp/reserved_mem.c
rename to arch/arm64/kvm/pkvm.c
index 578670e3f608..ebecb7c045f4 100644
@@ -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;
Signature · 6 lines
2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Tested-by Reviewed-by on v1 3/3
#6 lore raw

Re: [PATCH 3/3] KVM: arm64: Move host EL1 code out of hyp/ directory

Hi Will,

Quoted 5 lines · Will Deacon

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.

Cheers,
/fuad

Quoted 254 lines
---
 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%)
arch/arm64/include/asm/kvm_pkvm.h new file +71 -0
new file mode 100644
index 000000000000..9f4ad2a8df59
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 - Google LLC
+ * Author: Quentin Perret <[email protected]>
+ */
+#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__ */
arch/arm64/kvm/Makefile +1 -1
index 0b561752f8d8..8ca8cf6f5619 100644
@@ -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 \
arch/arm64/kvm/hyp/Makefile +1 -1
index b726332eec49..687598e41b21 100644
@@ -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
arch/arm64/kvm/hyp/include/nvhe/mm.h +0 -57
index c9a8f535212e..ef6a58a04235 100644
@@ -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 */
arch/arm64/kvm/hyp/nvhe/mem_protect.c +1 -0
index c1a90dd022b8..92262e89672d 100644
@@ -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>
arch/arm64/kvm/hyp/nvhe/mm.c +1 -0
index 2fabeceb889a..9e0ff5a700dd 100644
@@ -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>
arch/arm64/kvm/hyp/nvhe/setup.c +1 -0
index 578f71798c2e..51e68a040d8a 100644
@@ -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>
arch/arm64/kvm/pkvm.c renamed from arch/arm64/kvm/hyp/reserved_mem.c +4 -5
similarity index 94%
rename from arch/arm64/kvm/hyp/reserved_mem.c
rename to arch/arm64/kvm/pkvm.c
index 578670e3f608..ebecb7c045f4 100644
@@ -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;
--
Quoted 2 lines

2.34.0.rc2.393.gf8c9666880-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

maintainer Applied
#7 lore raw
In reply to Will Deacon
Quoted 4 lines · Will Deacon

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.

Quoted 8 lines

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.
Signature · 7 lines
Without deviation from the norm, progress is not possible.


_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm