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