• Sean Christopherson's avatar
    KVM: selftests: Add formatted guest assert support in ucall framework · 289c2b4d
    Sean Christopherson authored
    Add printf-based GUEST_ASSERT macros and accompanying host-side support to
    provide an assert-specific versions of GUEST_PRINTF().  To make it easier
    to parse assert messages, for humans and bots alike, preserve/use the same
    layout as host asserts, e.g. in the example below, the reported expression,
    file, line number, and message are from the guest assertion, not the host
    reporting of the assertion.
    
    The call stack still captures the host reporting, but capturing the guest
    stack is a less pressing concern, i.e. can be done in the future, and an
    optimal solution would capture *both* the host and guest stacks, i.e.
    capturing the host stack isn't an outright bug.
    
      Running soft int test
      ==== Test Assertion Failure ====
        x86_64/svm_nested_soft_inject_test.c:39: regs->rip != (unsigned long)l2_guest_code_int
        pid=214104 tid=214104 errno=4 - Interrupted system call
           1	0x0000000000401b35: run_test at svm_nested_soft_inject_test.c:191
           2	0x00000000004017d2: main at svm_nested_soft_inject_test.c:212
           3	0x0000000000415b03: __libc_start_call_main at libc-start.o:?
           4	0x000000000041714f: __libc_start_main_impl at ??:?
           5	0x0000000000401660: _start at ??:?
        Expected IRQ at RIP 0x401e50, received IRQ at 0x401e50
    
    Don't bother sharing code between ucall_assert() and ucall_fmt(), as
    forwarding the variable arguments would either require using macros or
    building a va_list, i.e. would make the code less readable and/or require
    just as much copy+paste code anyways.
    
    Gate the new macros with a flag so that tests can more or less be switched
    over one-by-one.  The slow conversion won't be perfect, e.g. library code
    won't pick up the flag, but the only asserts in library code are of the
    vanilla GUEST_ASSERT() variety, i.e. don't print out variables.
    
    Add a temporary alias to GUEST_ASSERT_1() to fudge around ARM's
    arch_timer.h header using GUEST_ASSERT_1(), thus thwarting any attempt to
    convert tests one-by-one.
    
    Link: https://lore.kernel.org/r/20230729003643.1053367-9-seanjc@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    289c2b4d
ucall_common.c 3.23 KB