Commit df1f2940 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: selftests: Add ex_str() to print human friendly name of exception vectors



Steal exception_mnemonic() from KVM-Unit-Tests as ex_str() (to keep line
lengths reasonable) and use it in assert messages that currently print the
raw vector number.

Co-developed-by: default avatarChao Gao <chao.gao@intel.com>
Signed-off-by: default avatarChao Gao <chao.gao@intel.com>
Link: https://lore.kernel.org/r/20250919223258.1604852-45-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent ff86b48d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ extern uint64_t guest_tsc_khz;

#define NMI_VECTOR		0x02

const char *ex_str(int vector);

#define X86_EFLAGS_FIXED	 (1u << 1)

#define X86_CR4_VME		(1ul << 0)
+33 −0
Original line number Diff line number Diff line
@@ -24,6 +24,39 @@ bool host_cpu_is_intel;
bool is_forced_emulation_enabled;
uint64_t guest_tsc_khz;

const char *ex_str(int vector)
{
	switch (vector) {
#define VEC_STR(v) case v##_VECTOR: return "#" #v
	case DE_VECTOR: return "no exception";
	case KVM_MAGIC_DE_VECTOR: return "#DE";
	VEC_STR(DB);
	VEC_STR(NMI);
	VEC_STR(BP);
	VEC_STR(OF);
	VEC_STR(BR);
	VEC_STR(UD);
	VEC_STR(NM);
	VEC_STR(DF);
	VEC_STR(TS);
	VEC_STR(NP);
	VEC_STR(SS);
	VEC_STR(GP);
	VEC_STR(PF);
	VEC_STR(MF);
	VEC_STR(AC);
	VEC_STR(MC);
	VEC_STR(XM);
	VEC_STR(VE);
	VEC_STR(CP);
	VEC_STR(HV);
	VEC_STR(VC);
	VEC_STR(SX);
	default: return "#??";
#undef VEC_STR
	}
}

static void regs_dump(FILE *stream, struct kvm_regs *regs, uint8_t indent)
{
	fprintf(stream, "%*srax: 0x%.16llx rbx: 0x%.16llx "
+8 −8
Original line number Diff line number Diff line
@@ -54,12 +54,12 @@ static void guest_msr(struct msr_data *msr)

	if (msr->fault_expected)
		__GUEST_ASSERT(vector == GP_VECTOR,
			       "Expected #GP on %sMSR(0x%x), got vector '0x%x'",
			       msr->write ? "WR" : "RD", msr->idx, vector);
			       "Expected #GP on %sMSR(0x%x), got %s",
			       msr->write ? "WR" : "RD", msr->idx, ex_str(vector));
	else
		__GUEST_ASSERT(!vector,
			       "Expected success on %sMSR(0x%x), got vector '0x%x'",
			       msr->write ? "WR" : "RD", msr->idx, vector);
			       "Expected success on %sMSR(0x%x), got %s",
			       msr->write ? "WR" : "RD", msr->idx, ex_str(vector));

	if (vector || is_write_only_msr(msr->idx))
		goto done;
@@ -102,12 +102,12 @@ static void guest_hcall(vm_vaddr_t pgs_gpa, struct hcall_data *hcall)
	vector = __hyperv_hypercall(hcall->control, input, output, &res);
	if (hcall->ud_expected) {
		__GUEST_ASSERT(vector == UD_VECTOR,
			       "Expected #UD for control '%lu', got vector '0x%x'",
			       hcall->control, vector);
			       "Expected #UD for control '%lu', got %s",
			       hcall->control, ex_str(vector));
	} else {
		__GUEST_ASSERT(!vector,
			       "Expected no exception for control '%lu', got vector '0x%x'",
			       hcall->control, vector);
			       "Expected no exception for control '%lu', got %s",
			       hcall->control, ex_str(vector));
		GUEST_ASSERT_EQ(res, hcall->expect);
	}

+4 −4
Original line number Diff line number Diff line
@@ -30,12 +30,12 @@ do { \
									\
	if (fault_wanted)						\
		__GUEST_ASSERT((vector) == UD_VECTOR,			\
			       "Expected #UD on " insn " for testcase '0x%x', got '0x%x'", \
			       testcase, vector);			\
			       "Expected #UD on " insn " for testcase '0x%x', got %s", \
			       testcase, ex_str(vector));		\
	else								\
		__GUEST_ASSERT(!(vector),				\
			       "Expected success on " insn " for testcase '0x%x', got '0x%x'", \
			       testcase, vector);			\
			       "Expected success on " insn " for testcase '0x%x', got %s", \
			       testcase, ex_str(vector));		\
} while (0)

static void guest_monitor_wait(void *arg)
+2 −2
Original line number Diff line number Diff line
@@ -363,8 +363,8 @@ static void test_arch_events(uint8_t pmu_version, uint64_t perf_capabilities,

#define GUEST_ASSERT_PMC_MSR_ACCESS(insn, msr, expect_gp, vector)		\
__GUEST_ASSERT(expect_gp ? vector == GP_VECTOR : !vector,			\
	       "Expected %s on " #insn "(0x%x), got vector %u",			\
	       expect_gp ? "#GP" : "no fault", msr, vector)			\
	       "Expected %s on " #insn "(0x%x), got %s",			\
	       expect_gp ? "#GP" : "no fault", msr, ex_str(vector))		\

#define GUEST_ASSERT_PMC_VALUE(insn, msr, val, expected)			\
	__GUEST_ASSERT(val == expected,					\
Loading