stacktrace.hh revision 11723:0596db108c53
1/* 2 * Copyright (c) 2005 The Regents of The University of Michigan 3 * Copyright (c) 2007-2008 The Florida State University 4 * Copyright (c) 2009 The University of Edinburgh 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are 9 * met: redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer; 11 * redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution; 14 * neither the name of the copyright holders nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Authors: Ali Saidi 31 * Stephen Hines 32 * Timothy M. Jones 33 */ 34 35#ifndef __ARCH_RISCV_STACKTRACE_HH__ 36#define __ARCH_RISCV_STACKTRACE_HH__ 37 38#include "base/trace.hh" 39#include "cpu/static_inst.hh" 40#include "debug/Stack.hh" 41 42class ThreadContext; 43class StackTrace; 44 45namespace RiscvISA 46{ 47 48class ProcessInfo 49{ 50 public: 51 ProcessInfo(ThreadContext *_tc); 52 53 Addr task(Addr ksp) const; 54 int pid(Addr ksp) const; 55 std::string name(Addr ksp) const; 56}; 57 58class StackTrace 59{ 60 protected: 61 typedef TheISA::MachInst MachInst; 62 private: 63 ThreadContext *tc; 64 std::vector<Addr> stack; 65 66 private: 67 bool isEntry(Addr addr); 68 bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 69 bool decodeSave(MachInst inst, int ®, int &disp); 70 bool decodeStack(MachInst inst, int &disp); 71 72 void trace(ThreadContext *tc, bool is_call); 73 74 public: 75 StackTrace(); 76 StackTrace(ThreadContext *tc, const StaticInstPtr &inst); 77 ~StackTrace(); 78 79 void 80 clear() 81 { 82 tc = 0; 83 stack.clear(); 84 } 85 86 bool 87 valid() const 88 { 89 return tc != nullptr; 90 } 91 92 bool trace(ThreadContext *tc, const StaticInstPtr &inst); 93 94 public: 95 const std::vector<Addr> & 96 getstack() const 97 { 98 return stack; 99 } 100 101 static const int user = 1; 102 static const int console = 2; 103 static const int unknown = 3; 104 105#if TRACING_ON 106 private: 107 void dump(); 108 109 public: 110 void 111 dprintf() 112 { 113 if (DTRACE(Stack)) 114 dump(); 115 } 116#else 117 public: 118 void 119 dprintf() 120 { 121 } 122#endif 123}; 124 125inline bool 126StackTrace::trace(ThreadContext *tc, const StaticInstPtr &inst) 127{ 128 if (!inst->isCall() && !inst->isReturn()) 129 return false; 130 131 if (valid()) 132 clear(); 133 134 trace(tc, !inst->isReturn()); 135 return true; 136} 137 138} // namespace RiscvISA 139 140#endif // __ARCH_RISCV_STACKTRACE_HH__ 141