aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
diff options
context:
space:
mode:
authorthestig@chromium.org <thestig@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e>2013-12-09 20:22:43 +0000
committerthestig@chromium.org <thestig@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e>2013-12-09 20:22:43 +0000
commit0348c801bdcd6a35cdd4576bbc43fb66de7782d7 (patch)
treea1eaa267eb2b1a0b063c95149e02a26118a3ad22 /src/client/linux/minidump_writer/linux_ptrace_dumper.cc
parentBack out r1244 (diff)
downloadbreakpad-0348c801bdcd6a35cdd4576bbc43fb66de7782d7.tar.xz
Add MMX detection when getting registers in Linux.
For CPUs that don't support the MMX instruction set, such pre-Pentium III or industrial x86 embedded PCs, the minidump fails when it tries to retrieve MMX specific registers. This patch adds MMX detection for that call. Tested on Ubuntu 12.04 with i686, and on a custom Linux distro on a Vortex86DX microcontroller. Original review: https://breakpad.appspot.com/455002/ A=aras.vaichas BUG=495 Review URL: https://breakpad.appspot.com/864002 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1248 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/minidump_writer/linux_ptrace_dumper.cc')
-rw-r--r--src/client/linux/minidump_writer/linux_ptrace_dumper.cc13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/client/linux/minidump_writer/linux_ptrace_dumper.cc b/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
index 3256f532..0a537a8b 100644
--- a/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
+++ b/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
@@ -40,6 +40,7 @@
#include <asm/ptrace.h>
#include <assert.h>
+#include <cpuid.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@@ -191,8 +192,16 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
}
#if defined(__i386)
- if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1)
- return false;
+ // Detect if the CPU supports the MMX instructions
+ int eax,ebx,ecx,edx;
+ __cpuid(1,eax,ebx,ecx,edx);
+ if (edx & bit_MMX) {
+ if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1) {
+ return false;
+ }
+ } else {
+ memset( &info->fpxregs, 0, sizeof(info->fpxregs) );
+ }
#endif
#if defined(__i386) || defined(__x86_64)