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