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.
   };