]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: arm64: Symbolize the nVHE HYP addresses
authorKalesh Singh <kaleshsingh@google.com>
Wed, 20 Apr 2022 21:42:57 +0000 (14:42 -0700)
committerMarc Zyngier <maz@kernel.org>
Thu, 28 Apr 2022 19:53:13 +0000 (20:53 +0100)
Reintroduce the __kvm_nvhe_ symbols in kallsyms, ignoring the local
symbols in this namespace. The local symbols are not informative and
can cause aliasing issues when symbolizing the addresses.

With the necessary symbols now in kallsyms we can symbolize nVHE
addresses using the %p print format specifier:

[   98.916444][  T426] kvm [426]: nVHE hyp panic at: [<ffffffc0096156fc>] __kvm_nvhe_overflow_stack+0x8/0x34!

Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220420214317.3303360-7-kaleshsingh@google.com
arch/arm64/kvm/handle_exit.c
scripts/kallsyms.c

index 97fe14aab1a38025c186f074643d0484d1c14aa3..a377b871bf587242abfde6669f3e71cd4775ca6c 100644 (file)
@@ -295,13 +295,8 @@ void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr,
        u64 elr_in_kimg = __phys_to_kimg(elr_phys);
        u64 hyp_offset = elr_in_kimg - kaslr_offset() - elr_virt;
        u64 mode = spsr & PSR_MODE_MASK;
+       u64 panic_addr = elr_virt + hyp_offset;
 
-       /*
-        * The nVHE hyp symbols are not included by kallsyms to avoid issues
-        * with aliasing. That means that the symbols cannot be printed with the
-        * "%pS" format specifier, so fall back to the vmlinux address if
-        * there's no better option.
-        */
        if (mode != PSR_MODE_EL2t && mode != PSR_MODE_EL2h) {
                kvm_err("Invalid host exception to nVHE hyp!\n");
        } else if (ESR_ELx_EC(esr) == ESR_ELx_EC_BRK64 &&
@@ -321,9 +316,11 @@ void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr,
                if (file)
                        kvm_err("nVHE hyp BUG at: %s:%u!\n", file, line);
                else
-                       kvm_err("nVHE hyp BUG at: %016llx!\n", elr_virt + hyp_offset);
+                       kvm_err("nVHE hyp BUG at: [<%016llx>] %pB!\n", panic_addr,
+                                       (void *)panic_addr);
        } else {
-               kvm_err("nVHE hyp panic at: %016llx!\n", elr_virt + hyp_offset);
+               kvm_err("nVHE hyp panic at: [<%016llx>] %pB!\n", panic_addr,
+                               (void *)panic_addr);
        }
 
        /*
index 8caabddf817ca0d69793935d20e9dcf75f1a4652..e6906f79833dcf9eb10231b9c24fcf4ee39d2f6d 100644 (file)
@@ -111,7 +111,8 @@ static bool is_ignored_symbol(const char *name, char type)
                ".L",                   /* local labels, .LBB,.Ltmpxxx,.L__unnamed_xx,.LASANPC, etc. */
                "__crc_",               /* modversions */
                "__efistub_",           /* arm64 EFI stub namespace */
-               "__kvm_nvhe_",          /* arm64 non-VHE KVM namespace */
+               "__kvm_nvhe_$",         /* arm64 local symbols in non-VHE KVM namespace */
+               "__kvm_nvhe_.L",        /* arm64 local symbols in non-VHE KVM namespace */
                "__AArch64ADRPThunk_",  /* arm64 lld */
                "__ARMV5PILongThunk_",  /* arm lld */
                "__ARMV7PILongThunk_",