[RFC PATCH part-3 14/22] pkvm: x86: Add global pkvm_hyp pointer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The unique global data structure pkvm_hyp is used to describe pKVM
hypervisor, includes the whole info about its host vm & pcpu settings.
It's useful for pKVM runtime to fetch required information, add a
global pointer pkvm_hyp for pKVM, set it in pkvm_init when pKVM got
successfully initialized.

Signed-off-by: Jason Chen CJ <jason.cj.chen@xxxxxxxxx>
---
 arch/x86/kvm/vmx/pkvm/hyp/Makefile   |  2 +-
 arch/x86/kvm/vmx/pkvm/hyp/pkvm.c     |  8 ++++++++
 arch/x86/kvm/vmx/pkvm/hyp/pkvm_hyp.h | 10 ++++++++++
 arch/x86/kvm/vmx/pkvm/include/pkvm.h |  1 +
 arch/x86/kvm/vmx/pkvm/pkvm_host.c    |  9 ++++++++-
 5 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/vmx/pkvm/hyp/Makefile b/arch/x86/kvm/vmx/pkvm/hyp/Makefile
index cc869624b201..bea43d22a2a3 100644
--- a/arch/x86/kvm/vmx/pkvm/hyp/Makefile
+++ b/arch/x86/kvm/vmx/pkvm/hyp/Makefile
@@ -12,7 +12,7 @@ ccflags-y += -D__PKVM_HYP__
 lib-dir		:= lib
 virt-dir	:= ../../../../../../$(KVM_PKVM)
 
-pkvm-hyp-y	:= vmx_asm.o vmexit.o memory.o early_alloc.o pgtable.o mmu.o
+pkvm-hyp-y	:= vmx_asm.o vmexit.o memory.o early_alloc.o pgtable.o mmu.o pkvm.o
 
 pkvm-hyp-y	+= $(lib-dir)/memset_64.o
 pkvm-hyp-$(CONFIG_RETPOLINE)	+= $(lib-dir)/retpoline.o
diff --git a/arch/x86/kvm/vmx/pkvm/hyp/pkvm.c b/arch/x86/kvm/vmx/pkvm/hyp/pkvm.c
new file mode 100644
index 000000000000..a5f776195af6
--- /dev/null
+++ b/arch/x86/kvm/vmx/pkvm/hyp/pkvm.c
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 Intel Corporation
+ */
+
+#include <pkvm.h>
+
+struct pkvm_hyp *pkvm_hyp;
diff --git a/arch/x86/kvm/vmx/pkvm/hyp/pkvm_hyp.h b/arch/x86/kvm/vmx/pkvm/hyp/pkvm_hyp.h
new file mode 100644
index 000000000000..e84296a714a2
--- /dev/null
+++ b/arch/x86/kvm/vmx/pkvm/hyp/pkvm_hyp.h
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 Intel Corporation
+ */
+#ifndef __PKVM_HYP_H
+#define __PKVM_HYP_H
+
+extern struct pkvm_hyp *pkvm_hyp;
+
+#endif
diff --git a/arch/x86/kvm/vmx/pkvm/include/pkvm.h b/arch/x86/kvm/vmx/pkvm/include/pkvm.h
index 648b00326e23..18ec51965936 100644
--- a/arch/x86/kvm/vmx/pkvm/include/pkvm.h
+++ b/arch/x86/kvm/vmx/pkvm/include/pkvm.h
@@ -63,6 +63,7 @@ extern char __pkvm_text_start[], __pkvm_text_end[];
 
 extern unsigned long pkvm_sym(__page_base_offset);
 extern unsigned long pkvm_sym(__symbol_base_offset);
+extern struct pkvm_hyp *pkvm_sym(pkvm_hyp);
 
 PKVM_DECLARE(void, __pkvm_vmx_vmexit(void));
 PKVM_DECLARE(int, pkvm_main(struct kvm_vcpu *vcpu));
diff --git a/arch/x86/kvm/vmx/pkvm/pkvm_host.c b/arch/x86/kvm/vmx/pkvm/pkvm_host.c
index 06f90b41a2de..36ed9df1c7ab 100644
--- a/arch/x86/kvm/vmx/pkvm/pkvm_host.c
+++ b/arch/x86/kvm/vmx/pkvm/pkvm_host.c
@@ -708,6 +708,11 @@ __init int pkvm_init(void)
 {
 	int ret = 0, cpu;
 
+	if (pkvm_sym(pkvm_hyp)) {
+		pr_err("pkvm hypervisor is running!");
+		return -EBUSY;
+	}
+
 	if (!hyp_mem_base) {
 		pr_err("pkvm required memory not get reserved!");
 		ret = -ENOMEM;
@@ -717,7 +722,8 @@ __init int pkvm_init(void)
 			pkvm_data_struct_pages(PKVM_PAGES, PKVM_PERCPU_PAGES,
 				num_possible_cpus()) << PAGE_SHIFT);
 
-	pkvm = pkvm_sym(pkvm_early_alloc_contig)(PKVM_PAGES);
+	/* pkvm hypervisor keeps same VA mapping as deprivileged host */
+	pkvm = pkvm_sym(pkvm_hyp) = pkvm_sym(pkvm_early_alloc_contig)(PKVM_PAGES);
 	if (!pkvm) {
 		ret = -ENOMEM;
 		goto out;
@@ -749,5 +755,6 @@ __init int pkvm_init(void)
 	return 0;
 
 out:
+	pkvm_sym(pkvm_hyp) = NULL;
 	return ret;
 }
-- 
2.25.1




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux