Commit fe9b4f40 authored by chenjiajun's avatar chenjiajun Committed by liangtian
Browse files

kvm: debugfs: export remaining aarch64 kvm exit reasons to debugfs

virt inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I919BF


CVE: NA

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

This patch export remaining aarch64 exit items to vcpu_stat via debugfs.
The items include:
	fp_asimd_exit_stat, irq_exit_stat, sys64_exit_stat,
	mabt_exit_stat, fail_entry_exit_stat, internal_error_exit_stat,
	unknown_ec_exit_stat, cp15_32_exit_stat, cp15_64_exit_stat,
	cp14_mr_exit_stat, cp14_ls_exit_stat, cp14_64_exit_stat,
	smc_exit_stat, sve_exit_stat, debug_exit_stat

Signed-off-by: default avatarchenjiajun <chenjiajun8@huawei.com>
Signed-off-by: default avatarliangtian <liangtian13@huawei.com>
parent 06f89a27
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -919,6 +919,21 @@ struct kvm_vcpu_stat {
	u64 mmio_exit_kernel;
	u64 signal_exits;
	u64 exits;
	u64 fp_asimd_exit_stat;
	u64 irq_exit_stat;
	u64 sys64_exit_stat;
	u64 mabt_exit_stat;
	u64 fail_entry_exit_stat;
	u64 internal_error_exit_stat;
	u64 unknown_ec_exit_stat;
	u64 cp15_32_exit_stat;
	u64 cp15_64_exit_stat;
	u64 cp14_mr_exit_stat;
	u64 cp14_ls_exit_stat;
	u64 cp14_64_exit_stat;
	u64 smc_exit_stat;
	u64 sve_exit_stat;
	u64 debug_exit_stat;
};

unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu);
+15 −0
Original line number Diff line number Diff line
@@ -40,6 +40,21 @@ struct dfx_kvm_stats_debugfs_item dfx_debugfs_entries[] = {
	DFX_STAT("mmio_exit_kernel", mmio_exit_kernel),
	DFX_STAT("signal_exits", signal_exits),
	DFX_STAT("exits", exits),
	DFX_STAT("fp_asimd_exit_stat", fp_asimd_exit_stat),
	DFX_STAT("irq_exit_stat", irq_exit_stat),
	DFX_STAT("sys64_exit_stat", sys64_exit_stat),
	DFX_STAT("mabt_exit_stat", mabt_exit_stat),
	DFX_STAT("fail_entry_exit_stat", fail_entry_exit_stat),
	DFX_STAT("internal_error_exit_stat", internal_error_exit_stat),
	DFX_STAT("unknown_ec_exit_stat", unknown_ec_exit_stat),
	DFX_STAT("cp15_32_exit_stat", cp15_32_exit_stat),
	DFX_STAT("cp15_64_exit_stat", cp15_64_exit_stat),
	DFX_STAT("cp14_mr_exit_stat", cp14_mr_exit_stat),
	DFX_STAT("cp14_ls_exit_stat", cp14_ls_exit_stat),
	DFX_STAT("cp14_64_exit_stat", cp14_64_exit_stat),
	DFX_STAT("smc_exit_stat", smc_exit_stat),
	DFX_STAT("sve_exit_stat", sve_exit_stat),
	DFX_STAT("debug_exit_stat", debug_exit_stat),
	{ NULL }
};
#endif
+8 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ static int handle_smc(struct kvm_vcpu *vcpu)
	 */
	if (kvm_vcpu_hvc_get_imm(vcpu)) {
		vcpu_set_reg(vcpu, 0, ~0UL);
		vcpu->stat.smc_exit_stat++;
		return 1;
	}

@@ -172,6 +173,7 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu)
	run->debug.arch.hsr = lower_32_bits(esr);
	run->debug.arch.hsr_high = upper_32_bits(esr);
	run->flags = KVM_DEBUG_ARCH_HSR_HIGH_VALID;
	vcpu->stat.debug_exit_stat++;

	switch (ESR_ELx_EC(esr)) {
	case ESR_ELx_EC_WATCHPT_LOW:
@@ -193,6 +195,7 @@ static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu)
		      esr, esr_get_class_string(esr));

	kvm_inject_undefined(vcpu);
	vcpu->stat.unknown_ec_exit_stat++;
	return 1;
}

@@ -203,6 +206,7 @@ static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu)
static int handle_sve(struct kvm_vcpu *vcpu)
{
	kvm_inject_undefined(vcpu);
	vcpu->stat.sve_exit_stat++;
	return 1;
}

@@ -335,6 +339,7 @@ int handle_exit(struct kvm_vcpu *vcpu, int exception_index)

	switch (exception_index) {
	case ARM_EXCEPTION_IRQ:
		vcpu->stat.irq_exit_stat++;
		return 1;
	case ARM_EXCEPTION_EL1_SERROR:
		return 1;
@@ -346,6 +351,7 @@ int handle_exit(struct kvm_vcpu *vcpu, int exception_index)
		 * is pre-emptied by kvm_reboot()'s shutdown call.
		 */
		run->exit_reason = KVM_EXIT_FAIL_ENTRY;
		vcpu->stat.fail_entry_exit_stat++;
		return 0;
	case ARM_EXCEPTION_IL:
		/*
@@ -353,11 +359,13 @@ int handle_exit(struct kvm_vcpu *vcpu, int exception_index)
		 * have been corrupted somehow.  Give up.
		 */
		run->exit_reason = KVM_EXIT_FAIL_ENTRY;
		vcpu->stat.fail_entry_exit_stat++;
		return -EINVAL;
	default:
		kvm_pr_unimpl("Unsupported exception type: %d",
			      exception_index);
		run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
		vcpu->stat.internal_error_exit_stat++;
		return 0;
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -326,8 +326,10 @@ static bool kvm_hyp_handle_fpsimd(struct kvm_vcpu *vcpu, u64 *exit_code)
	/* Only handle traps the vCPU can support here: */
	switch (esr_ec) {
	case ESR_ELx_EC_FP_ASIMD:
		vcpu->stat.fp_asimd_exit_stat++;
		break;
	case ESR_ELx_EC_SVE:
		vcpu->stat.sve_exit_stat++;
		if (!sve_guest)
			return false;
		break;
+1 −0
Original line number Diff line number Diff line
@@ -1416,6 +1416,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
	write_fault = kvm_is_write_fault(vcpu);
	exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu);
	VM_BUG_ON(write_fault && exec_fault);
	vcpu->stat.mabt_exit_stat++;

	if (fault_status == ESR_ELx_FSC_PERM && !write_fault && !exec_fault) {
		kvm_err("Unexpected L2 read permission error\n");
Loading