Commit a787bb8a authored by Ju Fu's avatar Ju Fu
Browse files

cvm: clean code for cvm init

virtcca inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9TM0T



--------------------------------

clean code for cvm init

Signed-off-by: default avatarJu Fu <fuju1@huawei.com>
parent 3b9084bc
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -53,9 +53,6 @@ enum kvm_pgtable_prot {
	KVM_PGTABLE_PROT_PBHA3			= BIT(62),
};

#define TMI_NO_MEASURE_CONTENT	U(0)
#define TMI_MEASURE_CONTENT	U(1)

#define PAGE_HYP		(KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_W)
#define PAGE_HYP_EXEC		(KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_X)
#define PAGE_HYP_RO		(KVM_PGTABLE_PROT_R)
+5 −0
Original line number Diff line number Diff line
@@ -211,6 +211,9 @@ struct tmi_tec_run {

#define U(_x) (_x##U)

#define TMI_NO_MEASURE_CONTENT	U(0)
#define TMI_MEASURE_CONTENT	U(1)

/*
 * SMC_TMM_INIT_COMPLETE is the only function in the TMI that originates from
 * the CVM world and is handled by the SPMD. The remaining functions are
@@ -384,6 +387,8 @@ unsigned long cvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu,
	unsigned long target_affinity, unsigned long lowest_affinity_level);
int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu,
	bool serror_pending, bool ext_dabt_pending);
int kvm_create_cvm_vm(struct kvm *kvm);
int kvm_init_cvm_vm(struct kvm *kvm);

#endif
#endif
+0 −35
Original line number Diff line number Diff line
@@ -145,41 +145,6 @@ static void set_default_csv2(struct kvm *kvm)
		kvm->arch.pfr0_csv2 = 1;
}

static int kvm_create_cvm_vm(struct kvm *kvm)
{
	struct cvm *cvm;

	if (!static_key_enabled(&kvm_cvm_is_available))
		return -EFAULT;

	if (kvm->arch.cvm) {
		kvm_info("cvm already create.\n");
		return 0;
	}

	kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT);
	if (!kvm->arch.cvm)
		return -ENOMEM;

	cvm = (struct cvm *)kvm->arch.cvm;
	cvm->is_cvm = true;
	return 0;
}

static int kvm_init_cvm_vm(struct kvm *kvm)
{
	struct tmi_cvm_params *params;
	struct cvm *cvm = (struct cvm *)kvm->arch.cvm;

	params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT);
	if (!params)
		return -ENOMEM;

	cvm->params = params;

	return 0;
}

/**
 * kvm_arch_init_vm - initializes a VM data structure
 * @kvm:	pointer to the KVM struct
+44 −5
Original line number Diff line number Diff line
@@ -158,8 +158,10 @@ int kvm_arm_create_cvm(struct kvm *kvm)
	if (!kvm_is_cvm(kvm) || kvm_cvm_state(kvm) != CVM_STATE_NONE)
		return 0;

	if (!cvm->params)
		return -EFAULT;
	if (!cvm->params) {
		ret = -EFAULT;
		goto out;
	}

	ret = cvm_vmid_reserve();
	if (ret < 0)
@@ -184,12 +186,14 @@ int kvm_arm_create_cvm(struct kvm *kvm)
	}

	WRITE_ONCE(cvm->state, CVM_STATE_NEW);
	kfree(cvm->params);
	cvm->params = NULL;
	return ret;
	ret = 0;
out:
	kfree(cvm->params);
	cvm->params = NULL;
	if (ret < 0) {
		kfree(cvm);
		kvm->arch.cvm = NULL;
	}
	return ret;
}

@@ -835,3 +839,38 @@ int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu,
	}
	return 0;
}

int kvm_create_cvm_vm(struct kvm *kvm)
{
	struct cvm *cvm;

	if (!static_key_enabled(&kvm_cvm_is_available))
		return -EFAULT;

	if (kvm->arch.cvm) {
		kvm_info("cvm already create.\n");
		return 0;
	}

	kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT);
	if (!kvm->arch.cvm)
		return -ENOMEM;

	cvm = (struct cvm *)kvm->arch.cvm;
	cvm->is_cvm = true;
	return 0;
}

int kvm_init_cvm_vm(struct kvm *kvm)
{
	struct tmi_cvm_params *params;
	struct cvm *cvm = (struct cvm *)kvm->arch.cvm;

	params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT);
	if (!params)
		return -ENOMEM;

	cvm->params = params;

	return 0;
}
+0 −19
Original line number Diff line number Diff line
@@ -229,25 +229,6 @@ void __vgic_v3_save_state(struct vgic_v3_cpu_if *cpu_if)
	}
}

#ifdef CONFIG_CVM_HOST
void __vgic_v3_restore_tec_state(struct vgic_v3_cpu_if *cpu_if,
				 u64 *entry_hcr,
				 u64 *entry_lrs)
{
	u64 used_lrs = cpu_if->used_lrs;
	int i;

	*entry_hcr = cpu_if->vgic_hcr;
	for (i = 0; i < kvm_vgic_global_state.nr_lr; ++i) {
		if (i < used_lrs) {
			entry_lrs[i] = cpu_if->vgic_lr[i];
		} else {
			entry_lrs[i] = 0;
		}
	}
}
#endif

void __vgic_v3_restore_state(struct vgic_v3_cpu_if *cpu_if)
{
	u64 used_lrs = cpu_if->used_lrs;