19244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Copyright (c) 2010, Google Inc.
29244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// All rights reserved.
39244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//
49244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Redistribution and use in source and binary forms, with or without
59244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// modification, are permitted provided that the following conditions are
69244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// met:
79244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//
89244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//     * Redistributions of source code must retain the above copyright
99244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// notice, this list of conditions and the following disclaimer.
109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//     * Redistributions in binary form must reproduce the above
119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// copyright notice, this list of conditions and the following disclaimer
129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// in the documentation and/or other materials provided with the
139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// distribution.
149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//     * Neither the name of Google Inc. nor the names of its
159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// contributors may be used to endorse or promote products derived from
169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// this software without specific prior written permission.
179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy//
189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// synth_minidump.cc: Implementation of SynthMinidump.  See synth_minidump.h
339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include "processor/synth_minidump.h"
359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
369244496c6f875ef1f7166d65f218d57ae92cabaajimblandynamespace google_breakpad {
379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
389244496c6f875ef1f7166d65f218d57ae92cabaajimblandynamespace SynthMinidump {
399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
409244496c6f875ef1f7166d65f218d57ae92cabaajimblandySection::Section(const Dump &dump)
416f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek  : test_assembler::Section(dump.endianness()) { }
429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
436f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Section::CiteLocationIn(test_assembler::Section *section) const {
449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  if (this)
459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    (*section).D32(size_).D32(file_offset_);
469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  else
479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    (*section).D32(0).D32(0);
489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
506f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Stream::CiteStreamIn(test_assembler::Section *section) const {
519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  section->D32(type_);
529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  CiteLocationIn(section);
539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
559244496c6f875ef1f7166d65f218d57ae92cabaajimblandySystemInfo::SystemInfo(const Dump &dump,
569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                       const MDRawSystemInfo &system_info,
579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                       const String &csd_version)
589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    : Stream(dump, MD_SYSTEM_INFO_STREAM) {
599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D16(system_info.processor_architecture);
609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D16(system_info.processor_level);
619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D16(system_info.processor_revision);
629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D8(system_info.number_of_processors);
639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D8(system_info.product_type);
649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(system_info.major_version);
659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(system_info.minor_version);
669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(system_info.build_number);
679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(system_info.platform_id);
689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  csd_version.CiteStringIn(this);
699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D16(system_info.suite_mask);
709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D16(system_info.reserved2);           // Well, why not?
719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // MDCPUInformation cpu;
739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_X86) {
749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.vendor_id[0]);
759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.vendor_id[1]);
769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.vendor_id[2]);
779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.version_information);
789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.feature_information);
799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D32(system_info.cpu.x86_cpu_info.amd_extended_cpu_features);
80972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  } else if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_ARM) {
81972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    D32(system_info.cpu.arm_cpu_info.cpuid);
82972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    D32(system_info.cpu.arm_cpu_info.elf_hwcaps);
839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  } else {
849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D64(system_info.cpu.other_cpu_info.processor_features[0]);
859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D64(system_info.cpu.other_cpu_info.processor_features[1]);
869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  }
879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
899244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst MDRawSystemInfo SystemInfo::windows_x86 = {
909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_CPU_ARCHITECTURE_X86,              // processor_architecture
919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  6,                                    // processor_level
929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0xd08,                                // processor_revision
939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  1,                                    // number_of_processors
949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  1,                                    // product_type
959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  5,                                    // major_version
969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  1,                                    // minor_version
979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  2600,                                 // build_number
989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  2,                                    // platform_id
999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0xdeadbeef,                           // csd_version_rva
1009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0x100,                                // suite_mask
1019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0,                                    // reserved2
1029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  {                                     // cpu
1039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    { // x86_cpu_info
1049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id
1059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      0x6d8,                                  // version_information
1069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      0xafe9fbff,                             // feature_information
1079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      0xffffffff                              // amd_extended_cpu_features
1089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    }
1099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  }
1109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy};
1119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1129244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst string SystemInfo::windows_x86_csd_version = "Service Pack 2";
1139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1149244496c6f875ef1f7166d65f218d57ae92cabaajimblandyString::String(const Dump &dump, const string &contents) : Section(dump) {
1159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(contents.size() * 2);
1169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  for (string::const_iterator i = contents.begin(); i != contents.end(); i++)
1179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy    D16(*i);
1189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1206f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid String::CiteStringIn(test_assembler::Section *section) const {
1219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  section->D32(file_offset_);
1229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1246f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Memory::CiteMemoryIn(test_assembler::Section *section) const {
1259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  section->D64(address_);
1269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  CiteLocationIn(section);
1279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1299244496c6f875ef1f7166d65f218d57ae92cabaajimblandyContext::Context(const Dump &dump, const MDRawContextX86 &context)
1309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  : Section(dump) {
1319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // The caller should have properly set the CPU type flag.
132233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // The high 24 bits identify the CPU.  Note that context records with no CPU
133233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  // type information can be valid (e.g. produced by ::RtlCaptureContext).
134233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com  assert(((context.context_flags & MD_CONTEXT_CPU_MASK) == 0) ||
135233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com         (context.context_flags & MD_CONTEXT_X86));
1369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // It doesn't make sense to store x86 registers in big-endian form.
1379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  assert(dump.endianness() == kLittleEndian);
1389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.context_flags);
1399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr0);
1409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr1);
1419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr2);
1429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr3);
1439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr6);
1449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.dr7);
1459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.control_word);
1469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.status_word);
1479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.tag_word);
1489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.error_offset);
1499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.error_selector);
1509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.data_offset);
1519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.data_selector);
1529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // context.float_save.register_area[] contains 8-bit quantities and
1539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // does not need to be swapped.
1549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Append(context.float_save.register_area,
1559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy         sizeof(context.float_save.register_area));
1569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.float_save.cr0_npx_state);
1579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.gs);
1589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.fs);
1599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.es);
1609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.ds);
1619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.edi);
1629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.esi);
1639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.ebx);
1649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.edx);
1659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.ecx);
1669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.eax);
1679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.ebp);
1689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.eip);
1699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.cs);
1709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.eflags);
1719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.esp);
1729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(context.ss);
1739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // context.extended_registers[] contains 8-bit quantities and does
1749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // not need to be swapped.
1759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Append(context.extended_registers, sizeof(context.extended_registers));
1769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  assert(Size() == sizeof(MDRawContextX86));
1779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
1789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
1791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekContext::Context(const Dump &dump, const MDRawContextARM &context)
1801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  : Section(dump) {
1811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  // The caller should have properly set the CPU type flag.
1821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  assert((context.context_flags & MD_CONTEXT_ARM) ||
1831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek         (context.context_flags & MD_CONTEXT_ARM_OLD));
1841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  // It doesn't make sense to store ARM registers in big-endian form.
1851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  assert(dump.endianness() == kLittleEndian);
1861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(context.context_flags);
1871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i)
1881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek    D32(context.iregs[i]);
1891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(context.cpsr);
1901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D64(context.float_save.fpscr);
1911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; ++i)
1921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek    D64(context.float_save.regs[i]);
1931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; ++i)
1941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek    D32(context.float_save.extra[i]);
1951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  assert(Size() == sizeof(MDRawContextARM));
1961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
1971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
1985f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.comContext::Context(const Dump &dump, const MDRawContextMIPS &context)
1995f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    : Section(dump) {
2005f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // The caller should have properly set the CPU type flag.
2015f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  assert(context.context_flags & MD_CONTEXT_MIPS);
2025f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.context_flags);
2035f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context._pad0);
2045f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2055f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i)
2065f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    D64(context.iregs[i]);
2075f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2085f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D64(context.mdhi);
2095f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D64(context.mdlo);
2105f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2115f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  for (int i = 0; i < MD_CONTEXT_MIPS_DSP_COUNT; ++i)
2125f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    D32(context.hi[i]);
2135f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2145f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  for (int i = 0; i < MD_CONTEXT_MIPS_DSP_COUNT; ++i)
2155f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    D32(context.lo[i]);
2165f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2175f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.dsp_control);
2185f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context._pad1);
2195f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2205f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D64(context.epc);
2215f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D64(context.badvaddr);
2225f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.status);
2235f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.cause);
2245f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2255f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i)
2265f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    D64(context.float_save.regs[i]);
2275f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2285f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.float_save.fpcsr);
2295f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  D32(context.float_save.fir);
2305f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2315f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  assert(Size() == sizeof(MDRawContextMIPS));
2325f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com}
2335f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
2349244496c6f875ef1f7166d65f218d57ae92cabaajimblandyThread::Thread(const Dump &dump,
2356162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t thread_id, const Memory &stack, const Context &context,
2366162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t suspend_count, uint32_t priority_class,
2376162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t priority, uint64_t teb) : Section(dump) {
2389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(thread_id);
2399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(suspend_count);
2409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(priority_class);
2419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(priority);
2429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D64(teb);
2439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stack.CiteMemoryIn(this);
2449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  context.CiteLocationIn(this);
2459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  assert(Size() == sizeof(MDRawThread));
2469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
2479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2489244496c6f875ef1f7166d65f218d57ae92cabaajimblandyModule::Module(const Dump &dump,
2496162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint64_t base_of_image,
2506162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t size_of_image,
2519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy               const String &name,
2526162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t time_date_stamp,
2536162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com               uint32_t checksum,
2549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy               const MDVSFixedFileInfo &version_info,
2559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy               const Section *cv_record,
2569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy               const Section *misc_record) : Section(dump) {
2579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D64(base_of_image);
2589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(size_of_image);
2599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(checksum);
2609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(time_date_stamp);
2619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  name.CiteStringIn(this);
2629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.signature);
2639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.struct_version);
2649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_version_hi);
2659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_version_lo);
2669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.product_version_hi);
2679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.product_version_lo);
2689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_flags_mask);
2699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_flags);
2709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_os);
2719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_type);
2729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_subtype);
2739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_date_hi);
2749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version_info.file_date_lo);
2759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  cv_record->CiteLocationIn(this);
2769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  misc_record->CiteLocationIn(this);
2779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D64(0).D64(0);
2789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
2799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
2809244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst MDVSFixedFileInfo Module::stock_version_info = {
2819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_SIGNATURE,         // signature
2829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_VERSION,           // struct_version
2839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0x11111111,                           // file_version_hi
2849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0x22222222,                           // file_version_lo
2859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0x33333333,                           // product_version_hi
2869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0x44444444,                           // product_version_lo
2879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG,  // file_flags_mask
2889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG,  // file_flags
2899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_FILE_OS_NT | MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32,
2909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy                                        // file_os
2919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_FILE_TYPE_APP,     // file_type
2929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN, // file_subtype
2939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0,                                    // file_date_hi
2949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  0                                     // file_date_lo
2951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek};
2961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek
2971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekException::Exception(const Dump &dump,
2981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek                     const Context &context,
2996162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com                     uint32_t thread_id,
3006162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com                     uint32_t exception_code,
3016162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com                     uint32_t exception_flags,
3026162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com                     uint64_t exception_address)
3031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  : Stream(dump, MD_EXCEPTION_STREAM) {
3041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(thread_id);
3051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(0);  // __align
3061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(exception_code);
3071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(exception_flags);
3081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D64(0);  // exception_record
3091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D64(exception_address);
3101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(0);  // number_parameters
3111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  D32(0);  // __align
3121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  for (int i = 0; i < MD_EXCEPTION_MAXIMUM_PARAMETERS; ++i)
3131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek    D64(0);  // exception_information
3141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  context.CiteLocationIn(this);
3151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek  assert(Size() == sizeof(MDRawExceptionStream));
3161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}
3179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3186162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.comDump::Dump(uint64_t flags,
3199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy           Endianness endianness,
3206162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com           uint32_t version,
3216162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com           uint32_t date_time_stamp)
3226f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek    : test_assembler::Section(endianness),
3239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      file_start_(0),
3249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      stream_directory_(*this),
3259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      stream_count_(0),
3269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      thread_list_(*this, MD_THREAD_LIST_STREAM),
3279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      module_list_(*this, MD_MODULE_LIST_STREAM),
3289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy      memory_list_(*this, MD_MEMORY_LIST_STREAM)
3299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy {
3309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(MD_HEADER_SIGNATURE);
3319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(version);
3329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(stream_count_label_);
3339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(stream_directory_rva_);
3349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(0);
3359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D32(date_time_stamp);
3369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  D64(flags);
3379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  assert(Size() == sizeof(MDRawHeader));
3389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3409244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(SynthMinidump::Section *section) {
3419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  section->Finish(file_start_ + Size());
3429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Append(*section);
3439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  return *this;
3449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3469244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Stream *stream) {
3479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Add(static_cast<SynthMinidump::Section *>(stream));
3489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stream->CiteStreamIn(&stream_directory_);
3499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stream_count_++;
3509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  return *this;
3519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3539244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Memory *memory) {
3549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Add the memory contents themselves to the file.
3559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  Add(static_cast<SynthMinidump::Section *>(memory));
3569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // The memory list is a list of MDMemoryDescriptors, not of actual
3589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // memory elements. Produce a descriptor, and add that to the list.
3599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  SynthMinidump::Section descriptor(*this);
3609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  memory->CiteMemoryIn(&descriptor);
3619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  memory_list_.Add(&descriptor);
3629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  return *this;
3639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3659244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Thread *thread) {
3669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  thread_list_.Add(thread);
3679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  return *this;
3689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3709244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Module *module) {
3719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  module_list_.Add(module);
3729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  return *this;
3739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3759244496c6f875ef1f7166d65f218d57ae92cabaajimblandyvoid Dump::Finish() {
3769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  if (!thread_list_.Empty()) Add(&thread_list_);
3779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  if (!module_list_.Empty()) Add(&module_list_);
3789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  if (!memory_list_.Empty()) Add(&memory_list_);
3799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // Create the stream directory. We don't use
3819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // stream_directory_.Finish here, because the stream directory isn't
3829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // cited using a location descriptor; rather, the Minidump header
3839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  // has the stream count and MDRVA.
3849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stream_count_label_ = stream_count_;
3859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy  stream_directory_rva_ = file_start_ + Size();
3866f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek  Append(static_cast<test_assembler::Section &>(stream_directory_));
3879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}
3889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} // namespace SynthMinidump
3909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy
3919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} // namespace google_breakpad
392