1c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy// -*- mode: C++ -*- 2c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy 383e085b7a331c96237cf8e814f97b3ef4c36a70fjimblandy// Copyright (c) 2010 Google Inc. 49276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// All rights reserved. 59276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// 69276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// Redistribution and use in source and binary forms, with or without 79276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// modification, are permitted provided that the following conditions are 89276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// met: 99276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// 109276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// * Redistributions of source code must retain the above copyright 119276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// notice, this list of conditions and the following disclaimer. 129276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// * Redistributions in binary form must reproduce the above 139276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// copyright notice, this list of conditions and the following disclaimer 149276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// in the documentation and/or other materials provided with the 159276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// distribution. 169276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// * Neither the name of Google Inc. nor the names of its 179276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// contributors may be used to endorse or promote products derived from 189276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// this software without specific prior written permission. 199276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// 209276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 219276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 229276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 239276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 249276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 259276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 269276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 279276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 289276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 299276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 309276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 319276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 329276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// stackwalker_arm.h: arm-specific stackwalker. 339276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// 349276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// Provides stack frames given arm register context and a memory region 359276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// corresponding to an arm stack. 369276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// 379276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek// Author: Mark Mentovai, Ted Mielczarek 389276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 399276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 409276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#ifndef PROCESSOR_STACKWALKER_ARM_H__ 419276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#define PROCESSOR_STACKWALKER_ARM_H__ 429276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 439276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#include "google_breakpad/common/breakpad_types.h" 449276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#include "google_breakpad/common/minidump_format.h" 459276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#include "google_breakpad/processor/stackwalker.h" 469276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 479276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczareknamespace google_breakpad { 489276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 499276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarekclass CodeModules; 509276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 519276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarekclass StackwalkerARM : public Stackwalker { 529276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek public: 539276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // context is an arm context object that gives access to arm-specific 549276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // register state corresponding to the innermost called frame to be 559276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // included in the stack. The other arguments are passed directly through 569276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // to the base Stackwalker constructor. 579753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackwalkerARM(const SystemInfo* system_info, 589753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com const MDRawContextARM* context, 590fd250335b66b12609aaf1b749384b711ecddaa9qsr@chromium.org int fp_register, 609753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com MemoryRegion* memory, 619753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com const CodeModules* modules, 629753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackFrameSymbolizer* frame_symbolizer); 639276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 64c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // Change the context validity mask of the frame returned by 65c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // GetContextFrame to VALID. This is only for use by unit tests; the 66c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // default behavior is correct for all application code. 67c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy void SetContextFrameValidity(int valid) { context_frame_validity_ = valid; } 68c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy 699276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek private: 709276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // Implementation of Stackwalker, using arm context and stack conventions. 719276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek virtual StackFrame* GetContextFrame(); 7242b91fbbf30f8a6d900d1fb97e96394dbb363890ted.mielczarek@gmail.com virtual StackFrame* GetCallerFrame(const CallStack* stack, 7342b91fbbf30f8a6d900d1fb97e96394dbb363890ted.mielczarek@gmail.com bool stack_scan_allowed); 749276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 75c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek // Use cfi_frame_info (derived from STACK CFI records) to construct 76c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek // the frame that called frames.back(). The caller takes ownership 77c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek // of the returned frame. Return NULL on failure. 789753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackFrameARM* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames, 799753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com CFIFrameInfo* cfi_frame_info); 80c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek 810fd250335b66b12609aaf1b749384b711ecddaa9qsr@chromium.org // Use the frame pointer. The caller takes ownership of the returned frame. 820fd250335b66b12609aaf1b749384b711ecddaa9qsr@chromium.org // Return NULL on failure. 839753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackFrameARM* GetCallerByFramePointer(const vector<StackFrame*> &frames); 840fd250335b66b12609aaf1b749384b711ecddaa9qsr@chromium.org 85c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek // Scan the stack for plausible return addresses. The caller takes ownership 860fd250335b66b12609aaf1b749384b711ecddaa9qsr@chromium.org // of the returned frame. Return NULL on failure. 879753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com StackFrameARM* GetCallerByStackScan(const vector<StackFrame*> &frames); 88c653618a9175d3252cc6d1aa8c3393f9558646e8ted.mielczarek 89c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // Stores the CPU context corresponding to the youngest stack frame, to 909276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek // be returned by GetContextFrame. 919753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com const MDRawContextARM* context_; 92c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy 93bad9e9cb5cfb4829c15c7346327543ff22fa7b51qsr@chromium.org // The register to use a as frame pointer. The value is -1 if frame pointer 94bad9e9cb5cfb4829c15c7346327543ff22fa7b51qsr@chromium.org // cannot be used. 95bad9e9cb5cfb4829c15c7346327543ff22fa7b51qsr@chromium.org int fp_register_; 96bad9e9cb5cfb4829c15c7346327543ff22fa7b51qsr@chromium.org 97c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // Validity mask for youngest stack frame. This is always 98c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of 99c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy // unit tests. 100c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy int context_frame_validity_; 1019276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek}; 1029276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 1039276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 1049276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek} // namespace google_breakpad 1059276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 1069276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 1079276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek#endif // PROCESSOR_STACKWALKER_ARM_H__ 108