mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2026-01-27 12:47:24 +01:00
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: Chao Gao <chao.gao@intel.com> Signed-off-by: Chao Gao <chao.gao@intel.com> Link: https://lore.kernel.org/r/20250919223258.1604852-45-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
ff86b48d4c
commit
df1f294013
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 "
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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, \
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ static void guest_test_perf_capabilities_gp(uint64_t val)
|
|||
uint8_t vector = wrmsr_safe(MSR_IA32_PERF_CAPABILITIES, val);
|
||||
|
||||
__GUEST_ASSERT(vector == GP_VECTOR,
|
||||
"Expected #GP for value '0x%lx', got vector '0x%x'",
|
||||
val, vector);
|
||||
"Expected #GP for value '0x%lx', got %s",
|
||||
val, ex_str(vector));
|
||||
}
|
||||
|
||||
static void guest_code(uint64_t current_val)
|
||||
|
|
|
|||
|
|
@ -81,13 +81,13 @@ static void guest_code(void)
|
|||
|
||||
vector = xsetbv_safe(0, XFEATURE_MASK_FP);
|
||||
__GUEST_ASSERT(!vector,
|
||||
"Expected success on XSETBV(FP), got vector '0x%x'",
|
||||
vector);
|
||||
"Expected success on XSETBV(FP), got %s",
|
||||
ex_str(vector));
|
||||
|
||||
vector = xsetbv_safe(0, supported_xcr0);
|
||||
__GUEST_ASSERT(!vector,
|
||||
"Expected success on XSETBV(0x%lx), got vector '0x%x'",
|
||||
supported_xcr0, vector);
|
||||
"Expected success on XSETBV(0x%lx), got %s",
|
||||
supported_xcr0, ex_str(vector));
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (supported_xcr0 & BIT_ULL(i))
|
||||
|
|
@ -95,8 +95,8 @@ static void guest_code(void)
|
|||
|
||||
vector = xsetbv_safe(0, supported_xcr0 | BIT_ULL(i));
|
||||
__GUEST_ASSERT(vector == GP_VECTOR,
|
||||
"Expected #GP on XSETBV(0x%llx), supported XCR0 = %lx, got vector '0x%x'",
|
||||
BIT_ULL(i), supported_xcr0, vector);
|
||||
"Expected #GP on XSETBV(0x%llx), supported XCR0 = %lx, got %s",
|
||||
BIT_ULL(i), supported_xcr0, ex_str(vector));
|
||||
}
|
||||
|
||||
GUEST_DONE();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user