17daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Copyright (c) 2006, Google Inc.
27daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// All rights reserved.
3d5e66382d10b1570d75e924410d58b47857fe799bryner//
47daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Redistribution and use in source and binary forms, with or without
57daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// modification, are permitted provided that the following conditions are
67daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// met:
7d5e66382d10b1570d75e924410d58b47857fe799bryner//
87daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai//     * Redistributions of source code must retain the above copyright
97daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// notice, this list of conditions and the following disclaimer.
107daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai//     * Redistributions in binary form must reproduce the above
117daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// copyright notice, this list of conditions and the following disclaimer
127daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// in the documentation and/or other materials provided with the
137daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// distribution.
145f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com//    * Neither the name of Google Inc. nor the names of its
157daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// contributors may be used to endorse or promote products derived from
167daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// this software without specific prior written permission.
17d5e66382d10b1570d75e924410d58b47857fe799bryner//
187daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29d5e66382d10b1570d75e924410d58b47857fe799bryner
30e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump_processor.h"
31e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek
32e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <assert.h>
33e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <stdio.h>
34e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek
355f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com#include <string>
365f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com
372cc15ba4327831f917ff55b87e6d5fc3c7750085ted.mielczarek@gmail.com#include "common/scoped_ptr.h"
385f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com#include "common/using_std_string.h"
39e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/call_stack.h"
40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump.h"
41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/process_state.h"
428d2c518c0b1dd6e1c956340759983f0464d356d5nealsid#include "google_breakpad/processor/exploitability.h"
439753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com#include "google_breakpad/processor/stack_frame_symbolizer.h"
44af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai#include "processor/logging.h"
45d5e66382d10b1570d75e924410d58b47857fe799bryner#include "processor/stackwalker_x86.h"
467dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org#include "processor/symbolic_constants_win.h"
47d5e66382d10b1570d75e924410d58b47857fe799bryner
48e5dc60822e5938fea2ae892ccddb906641ba174emmentovainamespace google_breakpad {
49d5e66382d10b1570d75e924410d58b47857fe799bryner
50fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbrynerMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,
51fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner                                     SourceLineResolverInterface *resolver)
529753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com    : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
539753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com      own_frame_symbolizer_(true),
548d2c518c0b1dd6e1c956340759983f0464d356d5nealsid      enable_exploitability_(false) {
558d2c518c0b1dd6e1c956340759983f0464d356d5nealsid}
568d2c518c0b1dd6e1c956340759983f0464d356d5nealsid
578d2c518c0b1dd6e1c956340759983f0464d356d5nealsidMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,
588d2c518c0b1dd6e1c956340759983f0464d356d5nealsid                                     SourceLineResolverInterface *resolver,
598d2c518c0b1dd6e1c956340759983f0464d356d5nealsid                                     bool enable_exploitability)
609753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com    : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
619753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com      own_frame_symbolizer_(true),
628d2c518c0b1dd6e1c956340759983f0464d356d5nealsid      enable_exploitability_(enable_exploitability) {
63d5e66382d10b1570d75e924410d58b47857fe799bryner}
64d5e66382d10b1570d75e924410d58b47857fe799bryner
659753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.comMinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer *frame_symbolizer,
669753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com                                     bool enable_exploitability)
679753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com    : frame_symbolizer_(frame_symbolizer),
689753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com      own_frame_symbolizer_(false),
699753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com      enable_exploitability_(enable_exploitability) {
709753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  assert(frame_symbolizer_);
719753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com}
729753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com
73cce3492afc263be86236600d41dca40be7224ee7brynerMinidumpProcessor::~MinidumpProcessor() {
749753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  if (own_frame_symbolizer_) delete frame_symbolizer_;
75d5e66382d10b1570d75e924410d58b47857fe799bryner}
76d5e66382d10b1570d75e924410d58b47857fe799bryner
77b56cfa067add059d0894433393e798fe0604970enealsidProcessResult MinidumpProcessor::Process(
78b56cfa067add059d0894433393e798fe0604970enealsid    Minidump *dump, ProcessState *process_state) {
79b56cfa067add059d0894433393e798fe0604970enealsid  assert(dump);
80b56cfa067add059d0894433393e798fe0604970enealsid  assert(process_state);
81d5e66382d10b1570d75e924410d58b47857fe799bryner
82f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  process_state->Clear();
83e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
84b56cfa067add059d0894433393e798fe0604970enealsid  const MDRawHeader *header = dump->header();
85b56cfa067add059d0894433393e798fe0604970enealsid  if (!header) {
86b56cfa067add059d0894433393e798fe0604970enealsid    BPLOG(ERROR) << "Minidump " << dump->path() << " has no header";
87b56cfa067add059d0894433393e798fe0604970enealsid    return PROCESS_ERROR_NO_MINIDUMP_HEADER;
88b56cfa067add059d0894433393e798fe0604970enealsid  }
89daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis  process_state->time_date_stamp_ = header->time_date_stamp;
90daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis
91ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  bool has_process_create_time =
92ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      GetProcessCreateTime(dump, &process_state->process_create_time_);
93ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
94b56cfa067add059d0894433393e798fe0604970enealsid  bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_);
95b56cfa067add059d0894433393e798fe0604970enealsid  bool has_os_info = GetOSInfo(dump, &process_state->system_info_);
96e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
976162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t dump_thread_id = 0;
9876f052f8fbf8864dee5992b857229d06560a766ammentovai  bool has_dump_thread = false;
996162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t requesting_thread_id = 0;
10076f052f8fbf8864dee5992b857229d06560a766ammentovai  bool has_requesting_thread = false;
10176f052f8fbf8864dee5992b857229d06560a766ammentovai
102b56cfa067add059d0894433393e798fe0604970enealsid  MinidumpBreakpadInfo *breakpad_info = dump->GetBreakpadInfo();
103e5dc60822e5938fea2ae892ccddb906641ba174emmentovai  if (breakpad_info) {
104e5dc60822e5938fea2ae892ccddb906641ba174emmentovai    has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id);
10576f052f8fbf8864dee5992b857229d06560a766ammentovai    has_requesting_thread =
106e5dc60822e5938fea2ae892ccddb906641ba174emmentovai        breakpad_info->GetRequestingThreadID(&requesting_thread_id);
10776f052f8fbf8864dee5992b857229d06560a766ammentovai  }
10876f052f8fbf8864dee5992b857229d06560a766ammentovai
109b56cfa067add059d0894433393e798fe0604970enealsid  MinidumpException *exception = dump->GetException();
110e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (exception) {
111e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    process_state->crashed_ = true;
11276f052f8fbf8864dee5992b857229d06560a766ammentovai    has_requesting_thread = exception->GetThreadID(&requesting_thread_id);
113e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
114e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    process_state->crash_reason_ = GetCrashReason(
115b56cfa067add059d0894433393e798fe0604970enealsid        dump, &process_state->crash_address_);
116d5e66382d10b1570d75e924410d58b47857fe799bryner  }
117d5e66382d10b1570d75e924410d58b47857fe799bryner
118cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org  // This will just return an empty string if it doesn't exist.
119cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org  process_state->assertion_ = GetAssertion(dump);
1200314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
121b56cfa067add059d0894433393e798fe0604970enealsid  MinidumpModuleList *module_list = dump->GetModuleList();
122db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
123db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  // Put a copy of the module list into ProcessState object.  This is not
124db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  // necessarily a MinidumpModuleList, but it adheres to the CodeModules
125db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  // interface, which is all that ProcessState needs to expose.
126db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai  if (module_list)
127db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    process_state->modules_ = module_list->Copy();
128db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai
12902ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com  MinidumpMemoryList *memory_list = dump->GetMemoryList();
13002ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com  if (memory_list) {
13102ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    BPLOG(INFO) << "Found " << memory_list->region_count()
13202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com                << " memory regions.";
13302ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com  }
13402ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com
135b56cfa067add059d0894433393e798fe0604970enealsid  MinidumpThreadList *threads = dump->GetThreadList();
136d5e66382d10b1570d75e924410d58b47857fe799bryner  if (!threads) {
137b56cfa067add059d0894433393e798fe0604970enealsid    BPLOG(ERROR) << "Minidump " << dump->path() << " has no thread list";
138b56cfa067add059d0894433393e798fe0604970enealsid    return PROCESS_ERROR_NO_THREAD_LIST;
139d5e66382d10b1570d75e924410d58b47857fe799bryner  }
140d5e66382d10b1570d75e924410d58b47857fe799bryner
141b56cfa067add059d0894433393e798fe0604970enealsid  BPLOG(INFO) << "Minidump " << dump->path() << " has " <<
142ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (has_cpu_info            ? "" : "no ") << "CPU info, " <<
143ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (has_os_info             ? "" : "no ") << "OS info, " <<
144ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (breakpad_info != NULL   ? "" : "no ") << "Breakpad info, " <<
145ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (exception != NULL       ? "" : "no ") << "exception, " <<
146ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (module_list != NULL     ? "" : "no ") << "module list, " <<
147ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (threads != NULL         ? "" : "no ") << "thread list, " <<
148ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (has_dump_thread         ? "" : "no ") << "dump thread, " <<
149ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (has_requesting_thread   ? "" : "no ") << "requesting thread, and " <<
150ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org      (has_process_create_time ? "" : "no ") << "process create time";
151af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
1526ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai  bool interrupted = false;
15376f052f8fbf8864dee5992b857229d06560a766ammentovai  bool found_requesting_thread = false;
154e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  unsigned int thread_count = threads->thread_count();
1559753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com
1569753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  // Reset frame_symbolizer_ at the beginning of stackwalk for each minidump.
1579753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  frame_symbolizer_->Reset();
1589753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com
159e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  for (unsigned int thread_index = 0;
160e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai       thread_index < thread_count;
161e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai       ++thread_index) {
162af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    char thread_string_buffer[64];
163af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d",
164af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai             thread_index, thread_count);
165b56cfa067add059d0894433393e798fe0604970enealsid    string thread_string = dump->path() + ":" + thread_string_buffer;
166af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
167e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    MinidumpThread *thread = threads->GetThreadAtIndex(thread_index);
168e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    if (!thread) {
169af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      BPLOG(ERROR) << "Could not get thread for " << thread_string;
170b56cfa067add059d0894433393e798fe0604970enealsid      return PROCESS_ERROR_GETTING_THREAD;
171e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
172e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
1736162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com    uint32_t thread_id;
17476f052f8fbf8864dee5992b857229d06560a766ammentovai    if (!thread->GetThreadID(&thread_id)) {
175af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      BPLOG(ERROR) << "Could not get thread ID for " << thread_string;
176b56cfa067add059d0894433393e798fe0604970enealsid      return PROCESS_ERROR_GETTING_THREAD_ID;
17776f052f8fbf8864dee5992b857229d06560a766ammentovai    }
17876f052f8fbf8864dee5992b857229d06560a766ammentovai
179af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    thread_string += " id " + HexString(thread_id);
180af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    BPLOG(INFO) << "Looking at thread " << thread_string;
181af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
18276f052f8fbf8864dee5992b857229d06560a766ammentovai    // If this thread is the thread that produced the minidump, don't process
18376f052f8fbf8864dee5992b857229d06560a766ammentovai    // it.  Because of the problems associated with a thread producing a
18476f052f8fbf8864dee5992b857229d06560a766ammentovai    // dump of itself (when both its context and its stack are in flux),
18576f052f8fbf8864dee5992b857229d06560a766ammentovai    // processing that stack wouldn't provide much useful data.
18676f052f8fbf8864dee5992b857229d06560a766ammentovai    if (has_dump_thread && thread_id == dump_thread_id) {
18776f052f8fbf8864dee5992b857229d06560a766ammentovai      continue;
18876f052f8fbf8864dee5992b857229d06560a766ammentovai    }
18976f052f8fbf8864dee5992b857229d06560a766ammentovai
190f944ba3fbb6136a14d47bf40f5cf1567ba3f8008mmentovai    MinidumpContext *context = thread->GetContext();
191f944ba3fbb6136a14d47bf40f5cf1567ba3f8008mmentovai
19276f052f8fbf8864dee5992b857229d06560a766ammentovai    if (has_requesting_thread && thread_id == requesting_thread_id) {
19376f052f8fbf8864dee5992b857229d06560a766ammentovai      if (found_requesting_thread) {
19476f052f8fbf8864dee5992b857229d06560a766ammentovai        // There can't be more than one requesting thread.
195af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai        BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string;
196b56cfa067add059d0894433393e798fe0604970enealsid        return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS;
197e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      }
198e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
19976f052f8fbf8864dee5992b857229d06560a766ammentovai      // Use processed_state->threads_.size() instead of thread_index.
20076f052f8fbf8864dee5992b857229d06560a766ammentovai      // thread_index points to the thread index in the minidump, which
20176f052f8fbf8864dee5992b857229d06560a766ammentovai      // might be greater than the thread index in the threads vector if
20276f052f8fbf8864dee5992b857229d06560a766ammentovai      // any of the minidump's threads are skipped and not placed into the
20376f052f8fbf8864dee5992b857229d06560a766ammentovai      // processed threads vector.  The thread vector's current size will
20476f052f8fbf8864dee5992b857229d06560a766ammentovai      // be the index of the current thread when it's pushed into the
20576f052f8fbf8864dee5992b857229d06560a766ammentovai      // vector.
20676f052f8fbf8864dee5992b857229d06560a766ammentovai      process_state->requesting_thread_ = process_state->threads_.size();
20776f052f8fbf8864dee5992b857229d06560a766ammentovai
20876f052f8fbf8864dee5992b857229d06560a766ammentovai      found_requesting_thread = true;
20976f052f8fbf8864dee5992b857229d06560a766ammentovai
21076f052f8fbf8864dee5992b857229d06560a766ammentovai      if (process_state->crashed_) {
21176f052f8fbf8864dee5992b857229d06560a766ammentovai        // Use the exception record's context for the crashed thread, instead
21276f052f8fbf8864dee5992b857229d06560a766ammentovai        // of the thread's own context.  For the crashed thread, the thread's
21376f052f8fbf8864dee5992b857229d06560a766ammentovai        // own context is the state inside the exception handler.  Using it
21476f052f8fbf8864dee5992b857229d06560a766ammentovai        // would not result in the expected stack trace from the time of the
2155f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org        // crash. If the exception context is invalid, however, we fall back
2165f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org        // on the thread context.
21796c69639ee2f806b181f4923c3a8e35ba2f25473jschuh@chromium.org        MinidumpContext *ctx = exception->GetContext();
2185f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org        context = ctx ? ctx : thread->GetContext();
21976f052f8fbf8864dee5992b857229d06560a766ammentovai      }
220e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
221e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
22202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    // If the memory region for the stack cannot be read using the RVA stored
22302ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    // in the memory descriptor inside MINIDUMP_THREAD, try to locate and use
22402ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    // a memory region (containing the stack) from the minidump memory list.
225e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    MinidumpMemoryRegion *thread_memory = thread->GetMemory();
22602ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    if (!thread_memory && memory_list) {
22702ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com      uint64_t start_stack_memory_range = thread->GetStartOfStackMemoryRange();
22802ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com      if (start_stack_memory_range) {
22902ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com        thread_memory = memory_list->GetMemoryRegionForAddress(
23002ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com           start_stack_memory_range);
23102ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com      }
23202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com    }
233e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    if (!thread_memory) {
234af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      BPLOG(ERROR) << "No memory region for " << thread_string;
235e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
236e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
237db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // Use process_state->modules_ instead of module_list, because the
238db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // |modules| argument will be used to populate the |module| fields in
239db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // the returned StackFrame objects, which will be placed into the
240db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // returned ProcessState object.  module_list's lifetime is only as
241db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // long as the Minidump object: it will be deleted when this function
242db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // returns.  process_state->modules_ is owned by the ProcessState object
243db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // (just like the StackFrame objects), and is much more suitable for this
244db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai    // task.
245e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    scoped_ptr<Stackwalker> stackwalker(
24697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai        Stackwalker::StackwalkerForCPU(process_state->system_info(),
24797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai                                       context,
248e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai                                       thread_memory,
249db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai                                       process_state->modules_,
2509753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com                                       frame_symbolizer_));
251e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
252f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner    scoped_ptr<CallStack> stack(new CallStack());
253e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com    if (stackwalker.get()) {
2545a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com      if (!stackwalker->Walk(stack.get(),
2552d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com                             &process_state->modules_without_symbols_,
2562d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com                             &process_state->modules_with_corrupt_symbols_)) {
2575a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com        BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at "
2585a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com                    << thread_string;
259e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com        interrupted = true;
260e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com      }
261e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com    } else {
262e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com      // Threads with missing CPU contexts will hit this, but
263e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com      // don't abort processing the rest of the dump just for
264e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com      // one bad thread.
265e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com      BPLOG(ERROR) << "No stackwalker for " << thread_string;
266e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
267e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    process_state->threads_.push_back(stack.release());
2686e525cbfbba74d702dadf62c1878f3aa453a28c4nealsid    process_state->thread_memory_regions_.push_back(thread_memory);
269d5e66382d10b1570d75e924410d58b47857fe799bryner  }
270d5e66382d10b1570d75e924410d58b47857fe799bryner
2716ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai  if (interrupted) {
272b56cfa067add059d0894433393e798fe0604970enealsid    BPLOG(INFO) << "Processing interrupted for " << dump->path();
273b56cfa067add059d0894433393e798fe0604970enealsid    return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED;
2746ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai  }
2756ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai
27676f052f8fbf8864dee5992b857229d06560a766ammentovai  // If a requesting thread was indicated, it must be present.
27776f052f8fbf8864dee5992b857229d06560a766ammentovai  if (has_requesting_thread && !found_requesting_thread) {
2783a9a38a29e1cad32d33a239f999c207d513471e0waylonis    // Don't mark as an error, but invalidate the requesting thread
279af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    BPLOG(ERROR) << "Minidump indicated requesting thread " <<
280b56cfa067add059d0894433393e798fe0604970enealsid        HexString(requesting_thread_id) << ", not found in " <<
281b56cfa067add059d0894433393e798fe0604970enealsid        dump->path();
2823a9a38a29e1cad32d33a239f999c207d513471e0waylonis    process_state->requesting_thread_ = -1;
283d5e66382d10b1570d75e924410d58b47857fe799bryner  }
284d5e66382d10b1570d75e924410d58b47857fe799bryner
2858d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  // Exploitability defaults to EXPLOITABILITY_NOT_ANALYZED
2868d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  process_state->exploitability_ = EXPLOITABILITY_NOT_ANALYZED;
2878d2c518c0b1dd6e1c956340759983f0464d356d5nealsid
2888d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  // If an exploitability run was requested we perform the platform specific
2898d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  // rating.
2908d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  if (enable_exploitability_) {
2918d2c518c0b1dd6e1c956340759983f0464d356d5nealsid    scoped_ptr<Exploitability> exploitability(
2928d2c518c0b1dd6e1c956340759983f0464d356d5nealsid        Exploitability::ExploitabilityForPlatform(dump, process_state));
2938d2c518c0b1dd6e1c956340759983f0464d356d5nealsid    // The engine will be null if the platform is not supported
2948d2c518c0b1dd6e1c956340759983f0464d356d5nealsid    if (exploitability != NULL) {
2958d2c518c0b1dd6e1c956340759983f0464d356d5nealsid      process_state->exploitability_ = exploitability->CheckExploitability();
2968d2c518c0b1dd6e1c956340759983f0464d356d5nealsid    } else {
2978d2c518c0b1dd6e1c956340759983f0464d356d5nealsid      process_state->exploitability_ = EXPLOITABILITY_ERR_NOENGINE;
2988d2c518c0b1dd6e1c956340759983f0464d356d5nealsid    }
2998d2c518c0b1dd6e1c956340759983f0464d356d5nealsid  }
3008d2c518c0b1dd6e1c956340759983f0464d356d5nealsid
301b56cfa067add059d0894433393e798fe0604970enealsid  BPLOG(INFO) << "Processed " << dump->path();
302f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner  return PROCESS_OK;
303e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai}
304e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
305b56cfa067add059d0894433393e798fe0604970enealsidProcessResult MinidumpProcessor::Process(
306b56cfa067add059d0894433393e798fe0604970enealsid    const string &minidump_file, ProcessState *process_state) {
307b56cfa067add059d0894433393e798fe0604970enealsid  BPLOG(INFO) << "Processing minidump in file " << minidump_file;
308b56cfa067add059d0894433393e798fe0604970enealsid
309b56cfa067add059d0894433393e798fe0604970enealsid  Minidump dump(minidump_file);
310b56cfa067add059d0894433393e798fe0604970enealsid  if (!dump.Read()) {
311b56cfa067add059d0894433393e798fe0604970enealsid     BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read";
312b56cfa067add059d0894433393e798fe0604970enealsid     return PROCESS_ERROR_MINIDUMP_NOT_FOUND;
313cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org  }
314b56cfa067add059d0894433393e798fe0604970enealsid
315b56cfa067add059d0894433393e798fe0604970enealsid  return Process(&dump, process_state);
316b56cfa067add059d0894433393e798fe0604970enealsid}
317b56cfa067add059d0894433393e798fe0604970enealsid
318e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// Returns the MDRawSystemInfo from a minidump, or NULL if system info is
31980e98391dc7ff361355e72c24c0fb222518bcdfcmmentovai// not available from the minidump.  If system_info is non-NULL, it is used
320e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// to pass back the MinidumpSystemInfo object.
321e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovaistatic const MDRawSystemInfo* GetSystemInfo(Minidump *dump,
322e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai                                            MinidumpSystemInfo **system_info) {
323e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo();
324e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!minidump_system_info)
325d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai    return NULL;
326e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
327e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (system_info)
328e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    *system_info = minidump_system_info;
329e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
330e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  return minidump_system_info->system_info();
331e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai}
332e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
333972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Extract CPU info string from ARM-specific MDRawSystemInfo structure.
334972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// raw_info: pointer to source MDRawSystemInfo.
335972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// cpu_info: address of target string, cpu info text will be appended to it.
336972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgstatic void GetARMCpuInfo(const MDRawSystemInfo* raw_info,
3375f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com                          string* cpu_info) {
338972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  assert(raw_info != NULL && cpu_info != NULL);
339972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
340972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  // Write ARM architecture version.
341972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  char cpu_string[32];
342972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  snprintf(cpu_string, sizeof(cpu_string), "ARMv%d",
343972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org           raw_info->processor_level);
344972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  cpu_info->append(cpu_string);
345972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
346972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  // There is no good list of implementer id values, but the following
347972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  // pages provide some help:
348972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  //   http://comments.gmane.org/gmane.linux.linaro.devel/6903
349972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  //   http://forum.xda-developers.com/archive/index.php/t-480226.html
350972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const struct {
351972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    uint32_t id;
352972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* name;
353972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  } vendors[] = {
354972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x41, "ARM" },
355972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x51, "Qualcomm" },
356972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x56, "Marvell" },
357972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x69, "Intel/Marvell" },
358972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  };
359972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const struct {
360972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    uint32_t id;
361972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* name;
362972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  } parts[] = {
363972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c050, "Cortex-A5" },
364972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c080, "Cortex-A8" },
365972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c090, "Cortex-A9" },
366972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c0f0, "Cortex-A15" },
367972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c140, "Cortex-R4" },
368972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100c150, "Cortex-R5" },
369972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100b360, "ARM1136" },
370972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100b560, "ARM1156" },
371972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100b760, "ARM1176" },
372972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x4100b020, "ARM11-MPCore" },
373972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x41009260, "ARM926" },
374972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x41009460, "ARM946" },
375972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x41009660, "ARM966" },
376972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x510006f0, "Krait" },
377972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { 0x510000f0, "Scorpion" },
378972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  };
379972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
380972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const struct {
381972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    uint32_t hwcap;
382972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* name;
383972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  } features[] = {
384972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_SWP, "swp" },
385972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_HALF, "half" },
386972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_THUMB, "thumb" },
387972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_26BIT, "26bit" },
388972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_FAST_MULT, "fastmult" },
389972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_FPA, "fpa" },
390972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_VFP, "vfpv2" },
391972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_EDSP, "edsp" },
392972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_JAVA, "java" },
393972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_IWMMXT, "iwmmxt" },
394972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_CRUNCH, "crunch" },
395972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_THUMBEE, "thumbee" },
396972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_NEON, "neon" },
397972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_VFPv3, "vfpv3" },
398972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_VFPv3D16, "vfpv3d16" },
399972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_TLS, "tls" },
400972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_VFPv4, "vfpv4" },
401972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_IDIVA, "idiva" },
402972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    { MD_CPU_ARM_ELF_HWCAP_IDIVT, "idivt" },
403972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  };
404972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
405972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  uint32_t cpuid = raw_info->cpu.arm_cpu_info.cpuid;
406972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  if (cpuid != 0) {
407972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    // Extract vendor name from CPUID
408972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* vendor = NULL;
409972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    uint32_t vendor_id = (cpuid >> 24) & 0xff;
410972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    for (size_t i = 0; i < sizeof(vendors)/sizeof(vendors[0]); ++i) {
411972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      if (vendors[i].id == vendor_id) {
412972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        vendor = vendors[i].name;
413972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        break;
414972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      }
415972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    }
416972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    cpu_info->append(" ");
417972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    if (vendor) {
418972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      cpu_info->append(vendor);
419972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    } else {
420972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      snprintf(cpu_string, sizeof(cpu_string), "vendor(0x%x)", vendor_id);
421972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      cpu_info->append(cpu_string);
422972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    }
423972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
424972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    // Extract part name from CPUID
425972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    uint32_t part_id = (cpuid & 0xff00fff0);
426972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* part = NULL;
427972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    for (size_t i = 0; i < sizeof(parts)/sizeof(parts[0]); ++i) {
428972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      if (parts[i].id == part_id) {
429972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        part = parts[i].name;
430972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        break;
431972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      }
432972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    }
433972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    cpu_info->append(" ");
434972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    if (part != NULL) {
435972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      cpu_info->append(part);
436972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    } else {
437972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      snprintf(cpu_string, sizeof(cpu_string), "part(0x%x)", part_id);
438972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      cpu_info->append(cpu_string);
439972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    }
440972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  }
441972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  uint32_t elf_hwcaps = raw_info->cpu.arm_cpu_info.elf_hwcaps;
442972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  if (elf_hwcaps != 0) {
443972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    cpu_info->append(" features: ");
444972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    const char* comma = "";
445972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    for (size_t i = 0; i < sizeof(features)/sizeof(features[0]); ++i) {
446972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      if (elf_hwcaps & features[i].hwcap) {
447972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        cpu_info->append(comma);
448972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        cpu_info->append(features[i].name);
449972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org        comma = ",";
450972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      }
451972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    }
452972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  }
453972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
454972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
455e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static
456af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovaibool MinidumpProcessor::GetCPUInfo(Minidump *dump, SystemInfo *info) {
45797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  assert(dump);
45897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  assert(info);
45997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
46097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->cpu.clear();
46197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->cpu_info.clear();
462e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
463e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  MinidumpSystemInfo *system_info;
464e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info);
465e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!raw_system_info)
466af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    return false;
467e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
468e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  switch (raw_system_info->processor_architecture) {
4698eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek    case MD_CPU_ARCHITECTURE_X86:
4708eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek    case MD_CPU_ARCHITECTURE_AMD64: {
471b56cfa067add059d0894433393e798fe0604970enealsid      if (raw_system_info->processor_architecture ==
4728eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek          MD_CPU_ARCHITECTURE_X86)
4738eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek        info->cpu = "x86";
4748eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek      else
4758eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek        info->cpu = "amd64";
4768eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek
47797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      const string *cpu_vendor = system_info->GetCPUVendor();
47897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      if (cpu_vendor) {
47997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai        info->cpu_info = *cpu_vendor;
48097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai        info->cpu_info.append(" ");
481e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      }
48297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
48397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      char x86_info[36];
48497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      snprintf(x86_info, sizeof(x86_info), "family %u model %u stepping %u",
48597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai               raw_system_info->processor_level,
48697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai               raw_system_info->processor_revision >> 8,
48797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai               raw_system_info->processor_revision & 0xff);
48897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->cpu_info.append(x86_info);
489e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
490e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
491e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
492e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_CPU_ARCHITECTURE_PPC: {
49397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->cpu = "ppc";
494e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
495e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
496e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
497cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    case MD_CPU_ARCHITECTURE_PPC64: {
498cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org      info->cpu = "ppc64";
499cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org      break;
500cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    }
501cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org
502ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    case MD_CPU_ARCHITECTURE_SPARC: {
503ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      info->cpu = "sparc";
504ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      break;
505ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    }
506ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
5079276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek    case MD_CPU_ARCHITECTURE_ARM: {
5089276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek      info->cpu = "arm";
509972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org      GetARMCpuInfo(raw_system_info, &info->cpu_info);
5109276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek      break;
5119276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek    }
5129276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek
51339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org    case MD_CPU_ARCHITECTURE_ARM64: {
51439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org      info->cpu = "arm64";
51539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org      break;
51639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org    }
51739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
5185f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    case MD_CPU_ARCHITECTURE_MIPS: {
5195f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com      info->cpu = "mips";
5205f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com      break;
5215f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    }
5225f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
523e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    default: {
524e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      // Assign the numeric architecture ID into the CPU string.
525e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      char cpu_string[7];
526e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      snprintf(cpu_string, sizeof(cpu_string), "0x%04x",
527e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai               raw_system_info->processor_architecture);
52897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->cpu = cpu_string;
529e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
530e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
531e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  }
532af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
53390e050e5982a5cddc3d544d103eccc06be42f184ted.mielczarek  info->cpu_count = raw_system_info->number_of_processors;
53490e050e5982a5cddc3d544d103eccc06be42f184ted.mielczarek
535af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai  return true;
536e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai}
537e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
538e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static
539af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovaibool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) {
54097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  assert(dump);
54197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  assert(info);
54297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
54397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->os.clear();
54497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->os_short.clear();
54597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->os_version.clear();
546e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
547e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  MinidumpSystemInfo *system_info;
548e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info);
549e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!raw_system_info)
550af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    return false;
55197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
55297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->os_short = system_info->GetOS();
553e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
554e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  switch (raw_system_info->platform_id) {
555e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_WIN32_NT: {
55697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->os = "Windows NT";
557e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
558e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
559e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
560e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_WIN32_WINDOWS: {
56197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->os = "Windows";
562e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
563e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
564e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
565e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_MAC_OS_X: {
56697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->os = "Mac OS X";
567e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
568e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
569e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
57063f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org    case MD_OS_IOS: {
57163f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org      info->os = "iOS";
57263f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org      break;
57363f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org    }
57463f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org
575e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_LINUX: {
57697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->os = "Linux";
577e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
578e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
579e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
580ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    case MD_OS_SOLARIS: {
581ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      info->os = "Solaris";
582ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      break;
583ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    }
584ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
5855187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org    case MD_OS_ANDROID: {
5865187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org      info->os = "Android";
5875187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org      break;
5885187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org    }
5895187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org
590d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org    case MD_OS_PS3: {
591d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org      info->os = "PS3";
59242faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org      break;
59342faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org    }
59442faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org
59542faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org    case MD_OS_NACL: {
59642faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org      info->os = "NaCl";
59742faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org      break;
598d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org    }
599d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org
600e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    default: {
601e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      // Assign the numeric platform ID into the OS string.
602e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      char os_string[11];
603e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      snprintf(os_string, sizeof(os_string), "0x%08x",
604e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai               raw_system_info->platform_id);
60597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai      info->os = os_string;
606e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      break;
607e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
608e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  }
609e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
61097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  char os_version_string[33];
61197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  snprintf(os_version_string, sizeof(os_version_string), "%u.%u.%u",
61297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai           raw_system_info->major_version,
61397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai           raw_system_info->minor_version,
61497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai           raw_system_info->build_number);
61597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  info->os_version = os_version_string;
61697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai
61797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  const string *csd_version = system_info->GetCSDVersion();
61897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai  if (csd_version) {
61997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    info->os_version.append(" ");
62097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai    info->os_version.append(*csd_version);
621e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  }
622af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
623af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai  return true;
624e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai}
625e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
626e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static
627ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.orgbool MinidumpProcessor::GetProcessCreateTime(Minidump* dump,
628ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org                                             uint32_t* process_create_time) {
629ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  assert(dump);
630ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  assert(process_create_time);
631ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
632ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  *process_create_time = 0;
633ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
634ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  MinidumpMiscInfo* minidump_misc_info = dump->GetMiscInfo();
635ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  if (!minidump_misc_info) {
636ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org    return false;
637ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  }
638ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
639ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  const MDRawMiscInfo* md_raw_misc_info = minidump_misc_info->misc_info();
640ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  if (!md_raw_misc_info) {
641ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org    return false;
642ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  }
643ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
644ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  if (!(md_raw_misc_info->flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES)) {
645ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org    return false;
646ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  }
647ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
648ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  *process_create_time = md_raw_misc_info->process_create_time;
649ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org  return true;
650ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org}
651ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org
652ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org// static
6536162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.comstring MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) {
654e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  MinidumpException *exception = dump->GetException();
655e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!exception)
656e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    return "";
657e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
658e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  const MDRawExceptionStream *raw_exception = exception->exception();
659e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!raw_exception)
660e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    return "";
661e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
662e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (address)
663e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    *address = raw_exception->exception_record.exception_address;
664e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
665e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  // The reason value is OS-specific and possibly CPU-specific.  Set up
666e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  // sensible numeric defaults for the reason string in case we can't
667e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  // map the codes to a string (because there's no system info, or because
668e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  // it's an unrecognized platform, or because it's an unrecognized code.)
669e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  char reason_string[24];
6706162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t exception_code = raw_exception->exception_record.exception_code;
6716162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint32_t exception_flags = raw_exception->exception_record.exception_flags;
672e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x",
673daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis           exception_code, exception_flags);
674e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  string reason = reason_string;
675e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
676e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL);
677e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  if (!raw_system_info)
678e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    return reason;
679e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai
68080e98391dc7ff361355e72c24c0fb222518bcdfcmmentovai  switch (raw_system_info->platform_id) {
68163f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org    case MD_OS_MAC_OS_X:
68263f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org    case MD_OS_IOS: {
683daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      char flags_string[11];
684daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags);
685daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      switch (exception_code) {
686daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_BAD_ACCESS:
687daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_BAD_ACCESS / ";
688daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          switch (exception_flags) {
689daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS:
690daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("KERN_INVALID_ADDRESS");
691daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
692daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE:
693daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("KERN_PROTECTION_FAILURE");
694daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
695daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_NO_ACCESS:
696daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("KERN_NO_ACCESS");
697daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
698daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE:
699daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("KERN_MEMORY_FAILURE");
700daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
701daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR:
702daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("KERN_MEMORY_ERROR");
703daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
704daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            default:
70515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              // arm and ppc overlap
70615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              if (raw_system_info->processor_architecture ==
70739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org                  MD_CPU_ARCHITECTURE_ARM ||
70839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org                  raw_system_info->processor_architecture ==
70939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org                  MD_CPU_ARCHITECTURE_ARM64) {
71015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                switch (exception_flags) {
71115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
71215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append("EXC_ARM_DA_ALIGN");
71315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
71415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
71515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append("EXC_ARM_DA_DEBUG");
71615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
71715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  default:
71815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append(flags_string);
71915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    BPLOG(INFO) << "Unknown exception reason " << reason;
72015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
72115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                }
72215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              } else if (raw_system_info->processor_architecture ==
72315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                         MD_CPU_ARCHITECTURE_PPC) {
72415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                switch (exception_flags) {
72515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ:
72615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append("EXC_PPC_VM_PROT_READ");
72715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
72815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE:
72915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append("EXC_PPC_BADSPACE");
73015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
73115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED:
73215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append("EXC_PPC_UNALIGNED");
73315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
73415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  default:
73515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    reason.append(flags_string);
73615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    BPLOG(INFO) << "Unknown exception reason " << reason;
73715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                    break;
73815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                }
73915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              } else {
74015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                reason.append(flags_string);
74115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                BPLOG(INFO) << "Unknown exception reason " << reason;
74215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              }
743daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
744daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          }
745daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
746daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_BAD_INSTRUCTION:
747daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_BAD_INSTRUCTION / ";
748daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          switch (raw_system_info->processor_architecture) {
74939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org            case MD_CPU_ARCHITECTURE_ARM:
75039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org            case MD_CPU_ARCHITECTURE_ARM64: {
75115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              switch (exception_flags) {
75215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED:
75315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append("EXC_ARM_UNDEFINED");
75415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
75515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                default:
75615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append(flags_string);
75715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  BPLOG(INFO) << "Unknown exception reason " << reason;
75815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
75915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              }
76015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              break;
76115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org            }
762daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_PPC: {
763daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
764daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL:
765daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_INVALID_SYSCALL");
766daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
767daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION:
768daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_UNIPL_INST");
769daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
770daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION:
771daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_PRIVINST");
772daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
773daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER:
774daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_PRIVREG");
775daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
776daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_TRACE:
777daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_TRACE");
778daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
779daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR:
780daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_PERFMON");
781daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
782daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
783daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
784af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
785daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
786daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
787daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
788daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
789daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_X86: {
790daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
791daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION:
792daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_INVOP");
793daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
794daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT:
795daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_INVTSSFLT");
796daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
797daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT:
798daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_SEGNPFLT");
799daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
800daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT:
801daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_STKFLT");
802daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
803daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
804daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_GPFLT");
805daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
806daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT:
807daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_ALIGNFLT");
808daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
809daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
810daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
811af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
812daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
813daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
814daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
815daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
816daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            default:
817daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append(flags_string);
818af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai              BPLOG(INFO) << "Unknown exception reason " << reason;
819daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
820daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          }
821daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
822daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_ARITHMETIC:
823daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_ARITHMETIC / ";
824daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          switch (raw_system_info->processor_architecture) {
825daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_PPC: {
826daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
827daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW:
828daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_OVERFLOW");
829daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
830daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE:
831daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_ZERO_DIVIDE");
832daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
833daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT:
834daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_FLT_INEXACT");
835daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
836daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE:
837daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_FLT_ZERO_DIVIDE");
838daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
839daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW:
840daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_FLT_UNDERFLOW");
841daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
842daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW:
843daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_FLT_OVERFLOW");
844daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
845daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER:
846daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_FLT_NOT_A_NUMBER");
847daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
848daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION:
849daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_NOEMULATION");
850daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
851daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST:
852daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_ALTIVECASSIST");
853daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
854daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
855af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
856daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
857daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
858daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
859daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
860daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_X86: {
861daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
862daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_DIV:
863daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_DIV");
864daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
865daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_INTO:
866daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_INTO");
867daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
868daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_NOEXT:
869daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_NOEXT");
870daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
871daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_EXTOVR:
872daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_EXTOVR");
873daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
874daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_EXTERR:
875daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_EXTERR");
876daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
877daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_EMERR:
878daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_EMERR");
879daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
880daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_BOUND:
881daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_BOUND");
882daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
883daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR:
884daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_SSEEXTERR");
885daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
886daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
887daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
888af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
889daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
890daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
891daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
892daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
893daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            default:
894daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append(flags_string);
895af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai              BPLOG(INFO) << "Unknown exception reason " << reason;
896daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
897daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          }
898daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
899daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_EMULATION:
900daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_EMULATION / ";
901daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason.append(flags_string);
902daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
903daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_SOFTWARE:
904daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_SOFTWARE / ";
905daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          switch (exception_flags) {
906f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org            case MD_EXCEPTION_CODE_MAC_ABORT:
907f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org              reason.append("SIGABRT");
908f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org              break;
909f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org            case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION:
910f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org              reason.append("UNCAUGHT_NS_EXCEPTION");
911f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org              break;
912daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            // These are ppc only but shouldn't be a problem as they're
913daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            // unused on x86
914daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_PPC_TRAP:
915daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("EXC_PPC_TRAP");
916daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
917daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE:
918daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append("EXC_PPC_MIGRATE");
919daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
920daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            default:
921daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append(flags_string);
922af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai              BPLOG(INFO) << "Unknown exception reason " << reason;
923daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
924daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          }
925daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
926daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_BREAKPOINT:
927daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_BREAKPOINT / ";
928daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          switch (raw_system_info->processor_architecture) {
92939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org            case MD_CPU_ARCHITECTURE_ARM:
93039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org            case MD_CPU_ARCHITECTURE_ARM64: {
93115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              switch (exception_flags) {
93215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
93315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append("EXC_ARM_DA_ALIGN");
93415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
93515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
93615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append("EXC_ARM_DA_DEBUG");
93715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
93815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                case MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT:
93915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append("EXC_ARM_BREAKPOINT");
94015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
94115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                default:
94215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  reason.append(flags_string);
94315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  BPLOG(INFO) << "Unknown exception reason " << reason;
94415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org                  break;
94515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              }
94615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org              break;
94715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org            }
948daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_PPC: {
949daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
950daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT:
951daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_PPC_BREAKPOINT");
952daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
953daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
954daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
955af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
956daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
957daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
958daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
959daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
960daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            case MD_CPU_ARCHITECTURE_X86: {
961daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              switch (exception_flags) {
962daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_SGL:
963daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_SGL");
964daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
965daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                case MD_EXCEPTION_CODE_MAC_X86_BPT:
966daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append("EXC_I386_BPT");
967daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
968daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                default:
969daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  reason.append(flags_string);
970af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai                  BPLOG(INFO) << "Unknown exception reason " << reason;
971daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis                  break;
972daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              }
973daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
974daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            }
975daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis            default:
976daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              reason.append(flags_string);
977af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai              BPLOG(INFO) << "Unknown exception reason " << reason;
978daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis              break;
979daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          }
980daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
981daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_SYSCALL:
982daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_SYSCALL / ";
983daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason.append(flags_string);
984daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
985daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_MACH_SYSCALL:
986daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_MACH_SYSCALL / ";
987daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason.append(flags_string);
988daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
989daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis        case MD_EXCEPTION_MAC_RPC_ALERT:
990daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason = "EXC_RPC_ALERT / ";
991daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          reason.append(flags_string);
992daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis          break;
993daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      }
994daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      break;
995daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis    }
996daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis
997e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_WIN32_NT:
998e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    case MD_OS_WIN32_WINDOWS: {
999daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis      switch (exception_code) {
1000e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_CONTROL_C:
1001e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "DBG_CONTROL_C";
1002e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1003e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION:
1004e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_GUARD_PAGE";
1005e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1006e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT:
1007e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_DATATYPE_MISALIGNMENT";
1008e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1009e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_BREAKPOINT:
1010e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_BREAKPOINT";
1011e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1012e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_SINGLE_STEP:
1013e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_SINGLE_STEP";
1014e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1015e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION:
1016e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that
1017e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          // caused the fault in exception_information[1].
1018e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          // exception_information[0] is 0 if the violation was caused by
10197dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // an attempt to read data, 1 if it was an attempt to write data,
10207dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // and 8 if this was a data execution violation.
1021e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          // This information is useful in addition to the code address, which
1022e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          // will be present in the crash thread's instruction field anyway.
10234f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          if (raw_exception->exception_record.number_parameters >= 1) {
1024cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org            MDAccessViolationTypeWin av_type =
1025cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org                static_cast<MDAccessViolationTypeWin>
1026cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org                (raw_exception->exception_record.exception_information[0]);
1027cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org            switch (av_type) {
1028cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org              case MD_ACCESS_VIOLATION_WIN_READ:
10294f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                reason = "EXCEPTION_ACCESS_VIOLATION_READ";
10304f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                break;
1031cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org              case MD_ACCESS_VIOLATION_WIN_WRITE:
10324f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                reason = "EXCEPTION_ACCESS_VIOLATION_WRITE";
10334f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                break;
1034cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org              case MD_ACCESS_VIOLATION_WIN_EXEC:
10354f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                reason = "EXCEPTION_ACCESS_VIOLATION_EXEC";
10364f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                break;
10374f182c746bccc64a141cd4bbda4d3d901ef013cenealsid              default:
10384f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                reason = "EXCEPTION_ACCESS_VIOLATION";
10394f182c746bccc64a141cd4bbda4d3d901ef013cenealsid                break;
10404f182c746bccc64a141cd4bbda4d3d901ef013cenealsid            }
10414f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          } else {
10424f182c746bccc64a141cd4bbda4d3d901ef013cenealsid            reason = "EXCEPTION_ACCESS_VIOLATION";
10434f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          }
1044e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          if (address &&
1045e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai              raw_exception->exception_record.number_parameters >= 2) {
1046e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai            *address =
1047e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai                raw_exception->exception_record.exception_information[1];
1048e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          }
1049e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1050e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR:
10517dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // For EXCEPTION_IN_PAGE_ERROR, Windows puts the address that
10527dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // caused the fault in exception_information[1].
10537dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // exception_information[0] is 0 if the violation was caused by
10547dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // an attempt to read data, 1 if it was an attempt to write data,
10557dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // and 8 if this was a data execution violation.
10567dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // exception_information[2] contains the underlying NTSTATUS code,
10577dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // which is the explanation for why this error occured.
10587dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // This information is useful in addition to the code address, which
10597dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          // will be present in the crash thread's instruction field anyway.
10607dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          if (raw_exception->exception_record.number_parameters >= 1) {
10617dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            MDInPageErrorTypeWin av_type =
10627dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                static_cast<MDInPageErrorTypeWin>
10637dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                (raw_exception->exception_record.exception_information[0]);
10647dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            switch (av_type) {
10657dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org              case MD_IN_PAGE_ERROR_WIN_READ:
10667dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                reason = "EXCEPTION_IN_PAGE_ERROR_READ";
10677dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                break;
10687dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org              case MD_IN_PAGE_ERROR_WIN_WRITE:
10697dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                reason = "EXCEPTION_IN_PAGE_ERROR_WRITE";
10707dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                break;
10717dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org              case MD_IN_PAGE_ERROR_WIN_EXEC:
10727dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                reason = "EXCEPTION_IN_PAGE_ERROR_EXEC";
10737dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                break;
10747dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org              default:
10757dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                reason = "EXCEPTION_IN_PAGE_ERROR";
10767dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                break;
10777dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            }
10787dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          } else {
10797dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            reason = "EXCEPTION_IN_PAGE_ERROR";
10807dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          }
10817dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          if (address &&
10827dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org              raw_exception->exception_record.number_parameters >= 2) {
10837dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            *address =
10847dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                raw_exception->exception_record.exception_information[1];
10857dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          }
10867dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          if (raw_exception->exception_record.number_parameters >= 3) {
10877dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            uint32_t ntstatus =
10887dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                static_cast<uint32_t>
10897dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org                (raw_exception->exception_record.exception_information[2]);
10907dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            reason.append(" / ");
10917dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org            reason.append(NTStatusToString(ntstatus));
10927dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org          }
1093e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1094e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE:
1095e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_INVALID_HANDLE";
1096e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1097e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION:
1098e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_ILLEGAL_INSTRUCTION";
1099e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1100e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION:
1101e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION";
1102e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1103e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION:
1104e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_INVALID_DISPOSITION";
1105e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1106e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED:
1107e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_BOUNDS_EXCEEDED";
1108e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1109e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND:
1110e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_DENORMAL_OPERAND";
1111e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1112e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO:
1113e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO";
1114e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1115e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:
1116e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_INEXACT_RESULT";
1117e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1118e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION:
1119e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_INVALID_OPERATION";
1120e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1121e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW:
1122e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_OVERFLOW";
1123e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1124e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK:
1125e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_STACK_CHECK";
1126e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1127e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW:
1128e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_FLT_UNDERFLOW";
1129e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1130e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO:
1131e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_INT_DIVIDE_BY_ZERO";
1132e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1133e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW:
1134e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_INT_OVERFLOW";
1135e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1136e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION:
1137e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_PRIV_INSTRUCTION";
1138e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1139e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:
1140e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_STACK_OVERFLOW";
1141e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
1142e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai        case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:
1143e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          reason = "EXCEPTION_POSSIBLE_DEADLOCK";
1144e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai          break;
11454f182c746bccc64a141cd4bbda4d3d901ef013cenealsid        case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:
11464f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          reason = "EXCEPTION_STACK_BUFFER_OVERRUN";
11474f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          break;
11484f182c746bccc64a141cd4bbda4d3d901ef013cenealsid        case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:
11494f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          reason = "EXCEPTION_HEAP_CORRUPTION";
11504f182c746bccc64a141cd4bbda4d3d901ef013cenealsid          break;
1151b2bc3bcc845b59c12db49feead091faebd6d116bted.mielczarek        case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:
1152cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org          reason = "Unhandled C++ Exception";
1153cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org          break;
1154af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai        default:
1155af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai          BPLOG(INFO) << "Unknown exception reason " << reason;
1156af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai          break;
1157e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai      }
1158af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      break;
1159278946c3b551078e0431b5920f113169a9ee8cd4mmentovai    }
1160b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek
11615187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org    case MD_OS_ANDROID:
1162278946c3b551078e0431b5920f113169a9ee8cd4mmentovai    case MD_OS_LINUX: {
1163b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek      switch (exception_code) {
1164b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGHUP:
1165b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGHUP";
1166b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1167b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGINT:
1168b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGINT";
1169b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1170b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGQUIT:
1171b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGQUIT";
1172b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1173b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGILL:
1174b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGILL";
1175b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1176b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGTRAP:
1177b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGTRAP";
1178b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1179b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGABRT:
1180b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGABRT";
1181b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1182b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGBUS:
1183b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGBUS";
1184b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1185b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGFPE:
1186b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGFPE";
1187b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1188b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGKILL:
1189b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGKILL";
1190b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1191b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGUSR1:
1192b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGUSR1";
1193b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1194b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGSEGV:
1195b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGSEGV";
1196b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1197b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGUSR2:
1198b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGUSR2";
1199b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1200b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGPIPE:
1201b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGPIPE";
1202b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1203b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGALRM:
1204b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGALRM";
1205b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1206b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGTERM:
1207b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGTERM";
1208b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1209b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGSTKFLT:
1210b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGSTKFLT";
1211b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1212b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGCHLD:
1213b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGCHLD";
1214b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1215b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGCONT:
1216b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGCONT";
1217b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1218b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGSTOP:
1219b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGSTOP";
1220b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1221b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGTSTP:
1222b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGTSTP";
1223b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1224b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGTTIN:
1225b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGTTIN";
1226b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1227b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGTTOU:
1228b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGTTOU";
1229b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1230b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGURG:
1231b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGURG";
1232b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1233b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGXCPU:
1234b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGXCPU";
1235b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1236b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGXFSZ:
1237b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGXFSZ";
1238b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1239b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGVTALRM:
1240b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGVTALRM";
1241b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1242b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGPROF:
1243b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGPROF";
1244b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1245b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGWINCH:
1246b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGWINCH";
1247b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1248b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGIO:
1249b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGIO";
1250b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1251b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGPWR:
1252b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGPWR";
1253b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1254b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        case MD_EXCEPTION_CODE_LIN_SIGSYS:
1255b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          reason = "SIGSYS";
1256b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1257f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com      case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED:
1258f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com          reason = "DUMP_REQUESTED";
1259f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com          break;
1260b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek        default:
1261b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          BPLOG(INFO) << "Unknown exception reason " << reason;
1262b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek          break;
1263b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek      }
1264b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek      break;
1265af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    }
1266af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai
1267ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    case MD_OS_SOLARIS: {
1268ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      switch (exception_code) {
1269ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGHUP:
1270ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGHUP";
1271ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          break;
1272ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGINT:
1273ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGINT";
1274ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          break;
1275ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGQUIT:
1276ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGQUIT";
1277b56cfa067add059d0894433393e798fe0604970enealsid          break;
1278ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGILL:
1279ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGILL";
1280b56cfa067add059d0894433393e798fe0604970enealsid          break;
1281ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTRAP:
1282ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTRAP";
1283b56cfa067add059d0894433393e798fe0604970enealsid          break;
1284ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGIOT:
1285ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGIOT | SIGABRT";
1286b56cfa067add059d0894433393e798fe0604970enealsid          break;
1287ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGEMT:
1288ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGEMT";
1289b56cfa067add059d0894433393e798fe0604970enealsid          break;
1290ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGFPE:
1291ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGFPE";
1292b56cfa067add059d0894433393e798fe0604970enealsid          break;
1293ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGKILL:
1294ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGKILL";
1295b56cfa067add059d0894433393e798fe0604970enealsid          break;
1296ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGBUS:
1297ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGBUS";
1298b56cfa067add059d0894433393e798fe0604970enealsid          break;
1299ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGSEGV:
1300ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGSEGV";
1301b56cfa067add059d0894433393e798fe0604970enealsid          break;
1302ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGSYS:
1303ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGSYS";
1304b56cfa067add059d0894433393e798fe0604970enealsid          break;
1305ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGPIPE:
1306ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGPIPE";
1307b56cfa067add059d0894433393e798fe0604970enealsid          break;
1308ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGALRM:
1309ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGALRM";
1310b56cfa067add059d0894433393e798fe0604970enealsid          break;
1311ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTERM:
1312ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTERM";
1313b56cfa067add059d0894433393e798fe0604970enealsid          break;
1314ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGUSR1:
1315ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGUSR1";
1316b56cfa067add059d0894433393e798fe0604970enealsid          break;
1317ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGUSR2:
1318ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGUSR2";
1319b56cfa067add059d0894433393e798fe0604970enealsid          break;
1320ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGCLD:
1321ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGCLD | SIGCHLD";
1322b56cfa067add059d0894433393e798fe0604970enealsid          break;
1323ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGPWR:
1324ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGPWR";
1325b56cfa067add059d0894433393e798fe0604970enealsid          break;
1326ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGWINCH:
1327ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGWINCH";
1328b56cfa067add059d0894433393e798fe0604970enealsid          break;
1329ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGURG:
1330ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGURG";
1331b56cfa067add059d0894433393e798fe0604970enealsid          break;
1332ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGPOLL:
1333ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGPOLL | SIGIO";
1334b56cfa067add059d0894433393e798fe0604970enealsid          break;
1335ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGSTOP:
1336ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGSTOP";
1337b56cfa067add059d0894433393e798fe0604970enealsid          break;
1338ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTSTP:
1339ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTSTP";
1340b56cfa067add059d0894433393e798fe0604970enealsid          break;
1341ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGCONT:
1342ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGCONT";
1343b56cfa067add059d0894433393e798fe0604970enealsid          break;
1344ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTTIN:
1345ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTTIN";
1346b56cfa067add059d0894433393e798fe0604970enealsid          break;
1347ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTTOU:
1348ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTTOU";
1349b56cfa067add059d0894433393e798fe0604970enealsid          break;
1350ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGVTALRM:
1351ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGVTALRM";
1352b56cfa067add059d0894433393e798fe0604970enealsid          break;
1353ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGPROF:
1354ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGPROF";
1355b56cfa067add059d0894433393e798fe0604970enealsid          break;
1356ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGXCPU:
1357ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGXCPU";
1358b56cfa067add059d0894433393e798fe0604970enealsid          break;
1359ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGXFSZ:
1360ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGXFSZ";
1361b56cfa067add059d0894433393e798fe0604970enealsid          break;
1362ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGWAITING:
1363ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGWAITING";
1364b56cfa067add059d0894433393e798fe0604970enealsid          break;
1365ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGLWP:
1366ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGLWP";
1367b56cfa067add059d0894433393e798fe0604970enealsid          break;
1368ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGFREEZE:
1369ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGFREEZE";
1370b56cfa067add059d0894433393e798fe0604970enealsid          break;
1371ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGTHAW:
1372ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGTHAW";
1373b56cfa067add059d0894433393e798fe0604970enealsid          break;
1374ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGCANCEL:
1375ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGCANCEL";
1376b56cfa067add059d0894433393e798fe0604970enealsid          break;
1377ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGLOST:
1378ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGLOST";
1379b56cfa067add059d0894433393e798fe0604970enealsid          break;
1380ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGXRES:
1381ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGXRES";
1382b56cfa067add059d0894433393e798fe0604970enealsid          break;
1383ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGJVM1:
1384ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGJVM1";
1385b56cfa067add059d0894433393e798fe0604970enealsid          break;
1386ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        case MD_EXCEPTION_CODE_SOL_SIGJVM2:
1387ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          reason = "SIGJVM2";
1388b56cfa067add059d0894433393e798fe0604970enealsid          break;
1389ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai        default:
1390ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          BPLOG(INFO) << "Unknown exception reason " << reason;
1391ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai          break;
1392ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      }
1393ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai      break;
1394ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    }
1395ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
1396d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org    case MD_OS_PS3: {
1397d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org      switch (exception_code) {
1398d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_UNKNOWN:
1399d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "UNKNOWN";
1400d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1401d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_TRAP_EXCEP:
1402d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "TRAP_EXCEP";
1403d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1404d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_PRIV_INSTR:
1405d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "PRIV_INSTR";
1406d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1407d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR:
1408d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "ILLEGAL_INSTR";
1409d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1410d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_INSTR_STORAGE:
1411d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "INSTR_STORAGE";
1412d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1413d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT:
1414d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "INSTR_SEGMENT";
1415d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1416d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_DATA_STORAGE:
1417d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "DATA_STORAGE";
1418d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1419d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_DATA_SEGMENT:
1420d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "DATA_SEGMENT";
1421d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1422d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_FLOAT_POINT:
1423d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "FLOAT_POINT";
1424d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1425d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_DABR_MATCH:
1426d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "DABR_MATCH";
1427d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1428d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP:
1429d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "ALIGN_EXCEP";
1430d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1431d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS:
1432d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "MEMORY_ACCESS";
1433d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1434d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_ALIGN:
1435d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_ALIGN";
1436d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1437d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM:
1438d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_INVALID_COM";
1439d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1440d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_ERR:
1441d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_ERR";
1442d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1443d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_FIR:
1444d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_FIR";
1445d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1446d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT:
1447d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_DATA_SEGMENT";
1448d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1449d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE:
1450d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_DATA_STORAGE";
1451d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1452d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR:
1453d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_STOP_INSTR";
1454d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1455d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR:
1456d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_HALT_INSTR";
1457d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1458d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN:
1459d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_HALTINSTR_UNKNOWN";
1460d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1461d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS:
1462d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "COPRO_MEMORY_ACCESS";
1463d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1464d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        case MD_EXCEPTION_CODE_PS3_GRAPHIC:
1465d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          reason = "GRAPHIC";
1466d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1467d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org        default:
1468d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          BPLOG(INFO) << "Unknown exception reason "<< reason;
1469d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org          break;
1470d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org      }
1471d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org      break;
1472d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org    }
1473d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org
1474af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai    default: {
1475af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      BPLOG(INFO) << "Unknown exception reason " << reason;
1476af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai      break;
1477e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai    }
1478960e5277ee489960c40c50c6222606200419302ammentovai  }
1479960e5277ee489960c40c50c6222606200419302ammentovai
1480e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai  return reason;
1481d5e66382d10b1570d75e924410d58b47857fe799bryner}
1482d5e66382d10b1570d75e924410d58b47857fe799bryner
14830314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek// static
1484cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.orgstring MinidumpProcessor::GetAssertion(Minidump *dump) {
14850314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  MinidumpAssertion *assertion = dump->GetAssertion();
14860314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (!assertion)
14870314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    return "";
14880314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
14890314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  const MDRawAssertionInfo *raw_assertion = assertion->assertion();
14900314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (!raw_assertion)
14910314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    return "";
14920314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
14930314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  string assertion_string;
14940314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  switch (raw_assertion->type) {
14950314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER:
14960314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string = "Invalid parameter passed to library function";
14970314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    break;
14980314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL:
14990314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string = "Pure virtual function called";
15000314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    break;
15010314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  default: {
15020314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    char assertion_type[32];
15039753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com    snprintf(assertion_type, sizeof(assertion_type),
15049753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com             "0x%08x", raw_assertion->type);
15050314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string = "Unknown assertion type ";
15060314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string += assertion_type;
15070314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    break;
15080314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15090314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15100314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
15110314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  string expression = assertion->expression();
15120314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (!expression.empty()) {
15130314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string.append(" " + expression);
15140314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15150314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
15160314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  string function = assertion->function();
15170314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (!function.empty()) {
15180314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string.append(" in function " + function);
15190314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15200314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
15210314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  string file = assertion->file();
15220314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (!file.empty()) {
15230314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string.append(", in file " + file);
15240314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15250314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
15260314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  if (raw_assertion->line != 0) {
15270314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    char assertion_line[32];
15289753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com    snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line);
15290314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string.append(" at line ");
15300314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek    assertion_string.append(assertion_line);
15310314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  }
15320314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
15330314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek  return assertion_string;
15340314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek}
15350314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek
1536e5dc60822e5938fea2ae892ccddb906641ba174emmentovai}  // namespace google_breakpad
1537