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