Unverified Commit ba7871ba authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!7454 add new kvm_type for Confidential VMs

Merge Pull Request from: @ci-robot 
 
PR sync from: Ju Fu <fuju1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/KNX6WFAX7WHFENPYFKOVZLFWWGDGPA2W/ 
add new kvm_type for Confidential VMs:
  1. kvm: add new kvm_type for cvm
  2. kvm: add macro CONFIG_CVM_HOST to defconfig


-- 
2.25.1.windows.1
 
https://gitee.com/openeuler/kernel/issues/I9PT2S 
 
Link:https://gitee.com/openeuler/kernel/pulls/7454

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Reviewed-by: default avatarKevin Zhu <zhukeqian1@huawei.com>
Signed-off-by: default avatarKevin Zhu <zhukeqian1@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 0ed14bf5 d474a4fb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -756,6 +756,7 @@ CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
CONFIG_KVM_HISI_VIRT=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_CVM_HOST=y
# CONFIG_NVHE_EL2_DEBUG is not set
CONFIG_KVM_ARM_MULTI_LPI_TRANSLATE_CACHE=y
CONFIG_ARCH_VCPU_STAT=y
+12 −0
Original line number Diff line number Diff line
@@ -27,6 +27,9 @@
#include <asm/fpsimd.h>
#include <asm/kvm.h>
#include <asm/kvm_asm.h>
#ifdef CONFIG_CVM_HOST
#include <asm/kvm_tmm.h>
#endif

#define __KVM_HAVE_ARCH_INTC_INITIALIZED

@@ -288,6 +291,11 @@ struct kvm_arch {
	cpumask_var_t sched_cpus;	/* Union of all vcpu's cpus_ptr */
	u64 tlbi_dvmbm;
#endif

#ifdef CONFIG_CVM_HOST
	struct cvm cvm;
	bool is_cvm;
#endif
};

struct kvm_vcpu_fault_info {
@@ -613,6 +621,10 @@ struct kvm_vcpu_arch {
	cpumask_var_t sched_cpus;
	cpumask_var_t pre_sched_cpus;
#endif

#ifdef CONFIG_CVM_HOST
	struct cvm_tec tec;
#endif
};

/*
+93 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2024, The Linux Foundation. All rights reserved.
 */
#ifndef __ASM_KVM_TMM_H
#define __ASM_KVM_TMM_H

#include <uapi/linux/kvm.h>

enum cvm_state {
	CVM_STATE_NONE,
	CVM_STATE_NEW,
	CVM_STATE_ACTIVE,
	CVM_STATE_DYING
};

/*
 * Many of these fields are smaller than u64 but all fields have u64
 * alignment, so use u64 to ensure correct alignment.
 */
struct tmi_cvm_params {
	u64	flags;
	u64	s2sz;
	u64	sve_vl;
	u64	num_bps;
	u64	num_wps;
	u64	pmu_num_cnts;
	u64	measurement_algo;
	u64	vmid;
	u64	ns_vtcr;
	u64	vttbr_el2;
	u64	ttt_base;
	s64	ttt_level_start;
	u64	ttt_num_start;
	u8	rpv[64]; /* Bits 512 */
};

struct cvm {
	enum cvm_state state;
	u32 cvm_vmid;
	u64 rd;
	u64 loader_start;
	u64 initrd_start;
	u64 initrd_size;
	u64 ram_size;
	struct kvm_numa_info numa_info;
	struct tmi_cvm_params *params;
	bool is_cvm;
};

/*
 * struct cvm_tec - Additional per VCPU data for a CVM
 */
struct cvm_tec {
	u64 tec;
	bool tec_created;
	void *tec_run;
};

int kvm_init_tmm(void);
int kvm_cvm_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap);
int kvm_init_cvm_vm(struct kvm *kvm);
void kvm_destroy_cvm(struct kvm *kvm);
int kvm_create_tec(struct kvm_vcpu *vcpu);
void kvm_destroy_tec(struct kvm_vcpu *vcpu);
int kvm_tec_enter(struct kvm_vcpu *vcpu);
int handle_cvm_exit(struct kvm_vcpu *vcpu, int rec_run_status);
int kvm_arm_create_cvm(struct kvm *kvm);
void kvm_free_rd(struct kvm *kvm);
int cvm_create_rd(struct kvm *kvm);
int cvm_psci_complete(struct kvm_vcpu *calling, struct kvm_vcpu *target);
int kvm_arch_tec_init(struct kvm_vcpu *vcpu);

void kvm_cvm_unmap_destroy_range(struct kvm *kvm);

#define CVM_TTT_BLOCK_LEVEL 2
#define CVM_TTT_MAX_LEVEL   3

#define CVM_PAGE_SHIFT		12
#define CVM_PAGE_SIZE		BIT(CVM_PAGE_SHIFT)
#define CVM_TTT_LEVEL_SHIFT(l)	\
	((CVM_PAGE_SHIFT - 3) * (4 - (l)) + 3)
#define CVM_L2_BLOCK_SIZE	BIT(CVM_TTT_LEVEL_SHIFT(2))

static inline unsigned long cvm_ttt_level_mapsize(int level)
{
	if (WARN_ON(level > CVM_TTT_BLOCK_LEVEL))
		return CVM_PAGE_SIZE;

	return (1UL << CVM_TTT_LEVEL_SHIFT(level));
}

#endif
+8 −0
Original line number Diff line number Diff line
@@ -49,6 +49,14 @@ menuconfig KVM

	  If unsure, say N.

config CVM_HOST
	bool "Enable cvm host feature"
	depends on KVM
	help
	  Support CVM based on S-EL2

	  If unsure, say N.

config NVHE_EL2_DEBUG
	bool "Debug mode for non-VHE EL2 object"
	depends on KVM
+17 −0
Original line number Diff line number Diff line
@@ -1477,6 +1477,23 @@ struct kvm_master_dev_info {
	struct kvm_msi msi[];
};

#define MAX_NUMA_NODE 8
#define MAX_CPU_BIT_MAP 4
#define MAX_NUMA_BIT_MAP 2

struct kvm_numa_node {
	__u64 numa_id;
	__u64 ipa_start;
	__u64 ipa_size;
	__u64 host_numa_nodes[MAX_NUMA_BIT_MAP];
	__u64 cpu_id[MAX_CPU_BIT_MAP];
};

struct kvm_numa_info {
	__u64 numa_cnt;
	struct kvm_numa_node numa_nodes[MAX_NUMA_NODE];
};

/*
 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
 * a vcpu fd.