16d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy// -*- mode: c++ -*- 26d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy 383e085b7a331c96237cf8e814f97b3ef4c36a70fjimblandy// Copyright (c) 2010 Google Inc. 4246f4068280b5b191303ff13671e43a0522987demmentovai// All rights reserved. 5246f4068280b5b191303ff13671e43a0522987demmentovai// 6246f4068280b5b191303ff13671e43a0522987demmentovai// Redistribution and use in source and binary forms, with or without 7246f4068280b5b191303ff13671e43a0522987demmentovai// modification, are permitted provided that the following conditions are 8246f4068280b5b191303ff13671e43a0522987demmentovai// met: 9246f4068280b5b191303ff13671e43a0522987demmentovai// 10246f4068280b5b191303ff13671e43a0522987demmentovai// * Redistributions of source code must retain the above copyright 11246f4068280b5b191303ff13671e43a0522987demmentovai// notice, this list of conditions and the following disclaimer. 12246f4068280b5b191303ff13671e43a0522987demmentovai// * Redistributions in binary form must reproduce the above 13246f4068280b5b191303ff13671e43a0522987demmentovai// copyright notice, this list of conditions and the following disclaimer 14246f4068280b5b191303ff13671e43a0522987demmentovai// in the documentation and/or other materials provided with the 15246f4068280b5b191303ff13671e43a0522987demmentovai// distribution. 16246f4068280b5b191303ff13671e43a0522987demmentovai// * Neither the name of Google Inc. nor the names of its 17246f4068280b5b191303ff13671e43a0522987demmentovai// contributors may be used to endorse or promote products derived from 18246f4068280b5b191303ff13671e43a0522987demmentovai// this software without specific prior written permission. 19246f4068280b5b191303ff13671e43a0522987demmentovai// 20246f4068280b5b191303ff13671e43a0522987demmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21246f4068280b5b191303ff13671e43a0522987demmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22246f4068280b5b191303ff13671e43a0522987demmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23246f4068280b5b191303ff13671e43a0522987demmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24246f4068280b5b191303ff13671e43a0522987demmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25246f4068280b5b191303ff13671e43a0522987demmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26246f4068280b5b191303ff13671e43a0522987demmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27246f4068280b5b191303ff13671e43a0522987demmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28246f4068280b5b191303ff13671e43a0522987demmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29246f4068280b5b191303ff13671e43a0522987demmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30246f4068280b5b191303ff13671e43a0522987demmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31246f4068280b5b191303ff13671e43a0522987demmentovai 32246f4068280b5b191303ff13671e43a0522987demmentovai// stack_frame_cpu.h: CPU-specific StackFrame extensions. 33246f4068280b5b191303ff13671e43a0522987demmentovai// 34246f4068280b5b191303ff13671e43a0522987demmentovai// These types extend the StackFrame structure to carry CPU-specific register 35246f4068280b5b191303ff13671e43a0522987demmentovai// state. They are defined in this header instead of stack_frame.h to 36246f4068280b5b191303ff13671e43a0522987demmentovai// avoid the need to include minidump_format.h when only the generic 37246f4068280b5b191303ff13671e43a0522987demmentovai// StackFrame type is needed. 38246f4068280b5b191303ff13671e43a0522987demmentovai// 39246f4068280b5b191303ff13671e43a0522987demmentovai// Author: Mark Mentovai 40246f4068280b5b191303ff13671e43a0522987demmentovai 41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ 42e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ 43246f4068280b5b191303ff13671e43a0522987demmentovai 44e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/common/minidump_format.h" 45e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/stack_frame.h" 46246f4068280b5b191303ff13671e43a0522987demmentovai 47e5dc60822e5938fea2ae892ccddb906641ba174emmentovainamespace google_breakpad { 48246f4068280b5b191303ff13671e43a0522987demmentovai 492684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandystruct WindowsFrameInfo; 50921da5eb5412bc45368066966875ccc28d3b81d1benchan@chromium.orgclass CFIFrameInfo; 512684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy 52246f4068280b5b191303ff13671e43a0522987demmentovaistruct StackFrameX86 : public StackFrame { 536d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // ContextValidity has one entry for each relevant hardware pointer 546d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // register (%eip and %esp) and one entry for each general-purpose 556d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // register. It's worthwhile having validity flags for caller-saves 566d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // registers: they are valid in the youngest frame, and such a frame 576d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // might save a callee-saves register in a caller-saves register, but 586d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // SimpleCFIWalker won't touch registers unless they're marked as valid. 59246f4068280b5b191303ff13671e43a0522987demmentovai enum ContextValidity { 60246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_NONE = 0, 61246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_EIP = 1 << 0, 62246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_ESP = 1 << 1, 63246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_EBP = 1 << 2, 646d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_EAX = 1 << 3, 656d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_EBX = 1 << 4, 666d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_ECX = 1 << 5, 676d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_EDX = 1 << 6, 686d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_ESI = 1 << 7, 696d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CONTEXT_VALID_EDI = 1 << 8, 70246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_ALL = -1 71246f4068280b5b191303ff13671e43a0522987demmentovai }; 72246f4068280b5b191303ff13671e43a0522987demmentovai 739753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackFrameX86() 748d70618ffc6f87bfd3d7bfd05c87c35ec3179a7ated.mielczarek : context(), 758d70618ffc6f87bfd3d7bfd05c87c35ec3179a7ated.mielczarek context_validity(CONTEXT_VALID_NONE), 766d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy windows_frame_info(NULL), 776d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy cfi_frame_info(NULL) {} 782684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy ~StackFrameX86(); 79246f4068280b5b191303ff13671e43a0522987demmentovai 8092ea4edf7cef867798850de66c2701d9f97c0790jimblandy // Overriden to return the return address as saved on the stack. 816162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com virtual uint64_t ReturnAddress() const; 8292ea4edf7cef867798850de66c2701d9f97c0790jimblandy 83246f4068280b5b191303ff13671e43a0522987demmentovai // Register state. This is only fully valid for the topmost frame in a 84246f4068280b5b191303ff13671e43a0522987demmentovai // stack. In other frames, the values of nonvolatile registers may be 85246f4068280b5b191303ff13671e43a0522987demmentovai // present, given sufficient debugging information. Refer to 86246f4068280b5b191303ff13671e43a0522987demmentovai // context_validity. 87246f4068280b5b191303ff13671e43a0522987demmentovai MDRawContextX86 context; 88246f4068280b5b191303ff13671e43a0522987demmentovai 89246f4068280b5b191303ff13671e43a0522987demmentovai // context_validity is actually ContextValidity, but int is used because 90246f4068280b5b191303ff13671e43a0522987demmentovai // the OR operator doesn't work well with enumerated types. This indicates 91246f4068280b5b191303ff13671e43a0522987demmentovai // which fields in context are valid. 92246f4068280b5b191303ff13671e43a0522987demmentovai int context_validity; 932684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy 946d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // Any stack walking information we found describing this.instruction. 956d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // These may be NULL if there is no such information for that address. 962684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy WindowsFrameInfo *windows_frame_info; 976d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy CFIFrameInfo *cfi_frame_info; 98246f4068280b5b191303ff13671e43a0522987demmentovai}; 99246f4068280b5b191303ff13671e43a0522987demmentovai 100246f4068280b5b191303ff13671e43a0522987demmentovaistruct StackFramePPC : public StackFrame { 101246f4068280b5b191303ff13671e43a0522987demmentovai // ContextValidity should eventually contain entries for the validity of 102246f4068280b5b191303ff13671e43a0522987demmentovai // other nonvolatile (callee-save) registers as in 103246f4068280b5b191303ff13671e43a0522987demmentovai // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently 104246f4068280b5b191303ff13671e43a0522987demmentovai // locate registers other than the ones listed here. 105246f4068280b5b191303ff13671e43a0522987demmentovai enum ContextValidity { 106246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_NONE = 0, 107246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_SRR0 = 1 << 0, 108246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_GPR1 = 1 << 1, 109246f4068280b5b191303ff13671e43a0522987demmentovai CONTEXT_VALID_ALL = -1 110246f4068280b5b191303ff13671e43a0522987demmentovai }; 111246f4068280b5b191303ff13671e43a0522987demmentovai 112246f4068280b5b191303ff13671e43a0522987demmentovai StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {} 113246f4068280b5b191303ff13671e43a0522987demmentovai 114246f4068280b5b191303ff13671e43a0522987demmentovai // Register state. This is only fully valid for the topmost frame in a 115246f4068280b5b191303ff13671e43a0522987demmentovai // stack. In other frames, the values of nonvolatile registers may be 116246f4068280b5b191303ff13671e43a0522987demmentovai // present, given sufficient debugging information. Refer to 117246f4068280b5b191303ff13671e43a0522987demmentovai // context_validity. 118246f4068280b5b191303ff13671e43a0522987demmentovai MDRawContextPPC context; 119246f4068280b5b191303ff13671e43a0522987demmentovai 120246f4068280b5b191303ff13671e43a0522987demmentovai // context_validity is actually ContextValidity, but int is used because 121246f4068280b5b191303ff13671e43a0522987demmentovai // the OR operator doesn't work well with enumerated types. This indicates 1228eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek // which fields in context are valid. 1238eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek int context_validity; 1248eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek}; 1258eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek 126cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.orgstruct StackFramePPC64 : public StackFrame { 127cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // ContextValidity should eventually contain entries for the validity of 128cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // other nonvolatile (callee-save) registers as in 129cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently 130cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // locate registers other than the ones listed here. 131cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org enum ContextValidity { 132cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org CONTEXT_VALID_NONE = 0, 133cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org CONTEXT_VALID_SRR0 = 1 << 0, 134cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org CONTEXT_VALID_GPR1 = 1 << 1, 135cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org CONTEXT_VALID_ALL = -1 136cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org }; 137cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org 138cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org StackFramePPC64() : context(), context_validity(CONTEXT_VALID_NONE) {} 139cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org 140cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // Register state. This is only fully valid for the topmost frame in a 141cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // stack. In other frames, the values of nonvolatile registers may be 142cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // present, given sufficient debugging information. Refer to 143cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // context_validity. 144cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org MDRawContextPPC64 context; 145cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org 146cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // context_validity is actually ContextValidity, but int is used because 147cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // the OR operator doesn't work well with enumerated types. This indicates 148cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org // which fields in context are valid. 149cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org int context_validity; 150cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org}; 151cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org 1528eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarekstruct StackFrameAMD64 : public StackFrame { 153e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // ContextValidity has one entry for each register that we might be able 154e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // to recover. 1558eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek enum ContextValidity { 156e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_NONE = 0, 157e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RAX = 1 << 0, 158e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RDX = 1 << 1, 159e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RCX = 1 << 2, 160e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RBX = 1 << 3, 161e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RSI = 1 << 4, 162e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RDI = 1 << 5, 163e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RBP = 1 << 6, 164e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RSP = 1 << 7, 165e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R8 = 1 << 8, 166e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R9 = 1 << 9, 167e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R10 = 1 << 10, 168e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R11 = 1 << 11, 169e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R12 = 1 << 12, 170e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R13 = 1 << 13, 171e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R14 = 1 << 14, 172e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_R15 = 1 << 15, 173e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy CONTEXT_VALID_RIP = 1 << 16, 1748eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek CONTEXT_VALID_ALL = -1 1758eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek }; 1768eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek 1778eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {} 1788eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek 17992ea4edf7cef867798850de66c2701d9f97c0790jimblandy // Overriden to return the return address as saved on the stack. 1806162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com virtual uint64_t ReturnAddress() const; 18192ea4edf7cef867798850de66c2701d9f97c0790jimblandy 182e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // Register state. This is only fully valid for the topmost frame in a 183e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // stack. In other frames, which registers are present depends on what 184e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // debugging information we had available. Refer to context_validity. 1858eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek MDRawContextAMD64 context; 1868eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek 187e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // For each register in context whose value has been recovered, we set 188e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // the corresponding CONTEXT_VALID_ bit in context_validity. 189e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // 190e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // context_validity's type should actually be ContextValidity, but 191e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // we use int instead because the bitwise inclusive or operator 192e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // yields an int when applied to enum values, and C++ doesn't 193e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy // silently convert from ints to enums. 194246f4068280b5b191303ff13671e43a0522987demmentovai int context_validity; 195246f4068280b5b191303ff13671e43a0522987demmentovai}; 196246f4068280b5b191303ff13671e43a0522987demmentovai 197ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovaistruct StackFrameSPARC : public StackFrame { 198ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // to be confirmed 199ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai enum ContextValidity { 200ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai CONTEXT_VALID_NONE = 0, 201dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek CONTEXT_VALID_PC = 1 << 0, 202dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek CONTEXT_VALID_SP = 1 << 1, 203dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek CONTEXT_VALID_FP = 1 << 2, 204ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai CONTEXT_VALID_ALL = -1 205ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai }; 206ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 207ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {} 208ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 209ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // Register state. This is only fully valid for the topmost frame in a 210ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // stack. In other frames, the values of nonvolatile registers may be 211ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // present, given sufficient debugging information. Refer to 212ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // context_validity. 213ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai MDRawContextSPARC context; 214ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 215ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // context_validity is actually ContextValidity, but int is used because 216ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // the OR operator doesn't work well with enumerated types. This indicates 217ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai // which fields in context are valid. 218ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai int context_validity; 219ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai}; 220ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 2219276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarekstruct StackFrameARM : public StackFrame { 222c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // A flag for each register we might know. 2239276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek enum ContextValidity { 2249276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek CONTEXT_VALID_NONE = 0, 225c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R0 = 1 << 0, 226c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R1 = 1 << 1, 227c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R2 = 1 << 2, 228c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R3 = 1 << 3, 229c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R4 = 1 << 4, 230c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R5 = 1 << 5, 231c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R6 = 1 << 6, 232c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R7 = 1 << 7, 233c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R8 = 1 << 8, 234c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R9 = 1 << 9, 235c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R10 = 1 << 10, 236c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R11 = 1 << 11, 237c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R12 = 1 << 12, 238c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R13 = 1 << 13, 239c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R14 = 1 << 14, 240c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_R15 = 1 << 15, 241c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE, 242c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy 243c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // Aliases for registers with dedicated or conventional roles. 244c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_FP = CONTEXT_VALID_R11, 245c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_SP = CONTEXT_VALID_R13, 246c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_LR = CONTEXT_VALID_R14, 247c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy CONTEXT_VALID_PC = CONTEXT_VALID_R15 2489276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek }; 2499276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 2509276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek StackFrameARM() : context(), context_validity(CONTEXT_VALID_NONE) {} 2519276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 252c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // Return the ContextValidity flag for register rN. 253c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy static ContextValidity RegisterValidFlag(int n) { 254c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy return ContextValidity(1 << n); 2559753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com } 256c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy 2579276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // Register state. This is only fully valid for the topmost frame in a 2589276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // stack. In other frames, the values of nonvolatile registers may be 2599276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // present, given sufficient debugging information. Refer to 2609276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // context_validity. 2619276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek MDRawContextARM context; 2629276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 263c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // For each register in context whose value has been recovered, we set 264c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // the corresponding CONTEXT_VALID_ bit in context_validity. 265c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // 266c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // context_validity's type should actually be ContextValidity, but 267c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // we use int instead because the bitwise inclusive or operator 268c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // yields an int when applied to enum values, and C++ doesn't 269c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // silently convert from ints to enums. 2709276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek int context_validity; 2719276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek}; 2729276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 27339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.orgstruct StackFrameARM64 : public StackFrame { 27439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // A flag for each register we might know. Note that we can't use an enum 27539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // here as there are 33 values to represent. 27639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_NONE = 0; 27739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X0 = 1ULL << 0; 27839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X1 = 1ULL << 1; 27939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X2 = 1ULL << 2; 28039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X3 = 1ULL << 3; 28139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X4 = 1ULL << 4; 28239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X5 = 1ULL << 5; 28339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X6 = 1ULL << 6; 28439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X7 = 1ULL << 7; 28539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X8 = 1ULL << 8; 28639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X9 = 1ULL << 9; 28739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X10 = 1ULL << 10; 28839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X11 = 1ULL << 11; 28939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X12 = 1ULL << 12; 29039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X13 = 1ULL << 13; 29139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X14 = 1ULL << 14; 29239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X15 = 1ULL << 15; 29339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X16 = 1ULL << 16; 29439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X17 = 1ULL << 17; 29539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X18 = 1ULL << 18; 29639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X19 = 1ULL << 19; 29739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X20 = 1ULL << 20; 29839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X21 = 1ULL << 21; 29939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X22 = 1ULL << 22; 30039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X23 = 1ULL << 23; 30139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X24 = 1ULL << 24; 30239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X25 = 1ULL << 25; 30339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X26 = 1ULL << 26; 30439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X27 = 1ULL << 27; 30539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X28 = 1ULL << 28; 30639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X29 = 1ULL << 29; 30739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X30 = 1ULL << 30; 30839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X31 = 1ULL << 31; 30939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_X32 = 1ULL << 32; 31039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE; 31139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 31239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // Aliases for registers with dedicated or conventional roles. 31339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_FP = CONTEXT_VALID_X29; 31439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_LR = CONTEXT_VALID_X30; 31539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_SP = CONTEXT_VALID_X31; 31639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static const uint64_t CONTEXT_VALID_PC = CONTEXT_VALID_X32; 31739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 31839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org StackFrameARM64() : context(), 31939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org context_validity(CONTEXT_VALID_NONE) {} 32039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 32139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // Return the validity flag for register xN. 32239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org static uint64_t RegisterValidFlag(int n) { 32339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org return 1ULL << n; 32439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org } 32539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 32639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // Register state. This is only fully valid for the topmost frame in a 32739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // stack. In other frames, the values of nonvolatile registers may be 32839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // present, given sufficient debugging information. Refer to 32939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // context_validity. 33039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org MDRawContextARM64 context; 33139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 33239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // For each register in context whose value has been recovered, we set 33339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org // the corresponding CONTEXT_VALID_ bit in context_validity. 33439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org uint64_t context_validity; 33539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org}; 33639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 3375f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.comstruct StackFrameMIPS : public StackFrame { 3385f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // MIPS callee save registers for o32 ABI (32bit registers) are: 3395f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // 1. $s0-$s7, 3405f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // 2. $sp, $fp 3415f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // 3. $f20-$f31 3425f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // 3435f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // The register structure is available at 3445f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // http://en.wikipedia.org/wiki/MIPS_architecture#Compiler_register_usage 3455f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3465f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_S0 MD_CONTEXT_MIPS_REG_S0 // 16 3475f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_S7 MD_CONTEXT_MIPS_REG_S7 // 23 3485f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_GP MD_CONTEXT_MIPS_REG_GP // 28 3495f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_RA MD_CONTEXT_MIPS_REG_RA // 31 3505f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_PC 34 3515f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_S0 0 3525f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_GP 8 3535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_PC 12 3545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com enum ContextValidity { 3565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_NONE = 0, 3575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S0 = 1 << 0, // $16 3585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S1 = 1 << 1, // $17 3595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S2 = 1 << 2, // $18 3605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S3 = 1 << 3, // $19 3615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S4 = 1 << 4, // $20 3625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S5 = 1 << 5, // $21 3635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S6 = 1 << 6, // $22 3645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_S7 = 1 << 7, // $23 3655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // GP is not calee-save for o32 abi. 3665f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_GP = 1 << 8, // $28 3675f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_SP = 1 << 9, // $29 3685f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_FP = 1 << 10, // $30 3695f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_RA = 1 << 11, // $31 3705f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_PC = 1 << 12, // $34 3715f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE 3725f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com }; 3735f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3745f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // Return the ContextValidity flag for register rN. 3755f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com static ContextValidity RegisterValidFlag(int n) { 3765f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com if (n >= INDEX_MIPS_REG_S0 && n <= INDEX_MIPS_REG_S7) 3775f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com return ContextValidity(1 << (n - INDEX_MIPS_REG_S0 + SHIFT_MIPS_REG_S0)); 3785f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com else if (n >= INDEX_MIPS_REG_GP && n <= INDEX_MIPS_REG_RA) 3795f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com return ContextValidity(1 << (n - INDEX_MIPS_REG_GP + SHIFT_MIPS_REG_GP)); 3805f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com else if (n == INDEX_MIPS_REG_PC) 3815f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com return ContextValidity(1 << SHIFT_MIPS_REG_PC); 3825f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3835f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com return CONTEXT_VALID_NONE; 3845f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com } 3855f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3865f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com StackFrameMIPS() : context(), context_validity(CONTEXT_VALID_NONE) {} 3875f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3885f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // Register state. This is only fully valid for the topmost frame in a 3895f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // stack. In other frames, which registers are present depends on what 3905f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // debugging information were available. Refer to 'context_validity' below. 3915f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com MDRawContextMIPS context; 3925f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 3935f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // For each register in context whose value has been recovered, 3945f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // the corresponding CONTEXT_VALID_ bit in 'context_validity' is set. 3955f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // 3965f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // context_validity's type should actually be ContextValidity, but 3975f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // type int is used instead because the bitwise inclusive or operator 3985f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // yields an int when applied to enum values, and C++ doesn't 3995f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com // silently convert from ints to enums. 4005f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com int context_validity; 4015f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com}; 4025f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 403e5dc60822e5938fea2ae892ccddb906641ba174emmentovai} // namespace google_breakpad 404246f4068280b5b191303ff13671e43a0522987demmentovai 405e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ 406