Better support 64bit x86 kernel crashes.
FindCrashingFunction() fails to find the crashing kernel function because
the x86 64bit kernel code (arch/x86/kernel/dumpstack.c:die()) issues "RIP"
instead of "EIP". So it falls back to using the panic string in the crash
signature.
This causes the logging_KernelCrash.py test to fail because it looks for the
crashing function in the signature string.
BUG=chromium-os:22353
TEST=logging_KernelCrash
Change-Id: Ic4790648facf5f0be2b82001f8e18b606eca16c7
Reviewed-on: https://gerrit.chromium.org/gerrit/19492
Reviewed-by: Ben Chan <benchan@chromium.org>
Tested-by: Bryan Freed <bfreed@chromium.org>
Commit-Ready: Bryan Freed <bfreed@chromium.org>
diff --git a/crash_reporter/kernel_collector.cc b/crash_reporter/kernel_collector.cc
index d23c595..0895b4e 100644
--- a/crash_reporter/kernel_collector.cc
+++ b/crash_reporter/kernel_collector.cc
@@ -41,6 +41,7 @@
0,
" PC is at ([^\\+ ]+).*",
" EIP: \\[<.*>\\] ([^\\+ ]+).*", // X86 uses EIP for the program counter
+ " RIP \\[<.*>\\] ([^\\+ ]+).*", // X86_64 uses RIP for the program counter
};
COMPILE_ASSERT(arraysize(s_pc_regex) == KernelCollector::archCount,
@@ -342,6 +343,8 @@
{
#if defined(COMPILER_GCC) && defined(ARCH_CPU_ARM_FAMILY)
return archArm;
+#elif defined(COMPILER_GCC) && defined(ARCH_CPU_X86_64)
+ return archX86_64;
#elif defined(COMPILER_GCC) && defined(ARCH_CPU_X86_FAMILY)
return archX86;
#else
diff --git a/crash_reporter/kernel_collector.h b/crash_reporter/kernel_collector.h
index abbdee9..b4f3c1a 100644
--- a/crash_reporter/kernel_collector.h
+++ b/crash_reporter/kernel_collector.h
@@ -23,6 +23,7 @@
archUnknown,
archArm,
archX86,
+ archX86_64,
archCount // Number of architectures.
};