stacktrace.hh revision 5222:bb733a878f85
1/* 2 * Copyright .AN) 2007 MIPS Technologies, Inc. All Rights Reserved 3 * 4 * This software is part of the M5 simulator. 5 * 6 * THIS IS A LEGAL AGREEMENT. BY DOWNLOADING, USING, COPYING, CREATING 7 * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING 8 * TO THESE TERMS AND CONDITIONS. 9 * 10 * Permission is granted to use, copy, create derivative works and 11 * distribute this software and such derivative works for any purpose, 12 * so long as (1) the copyright notice above, this grant of permission, 13 * and the disclaimer below appear in all copies and derivative works 14 * made, (2) the copyright notice above is augmented as appropriate to 15 * reflect the addition of any new copyrightable work in a derivative 16 * work (e.g., Copyright .AN) <Publication Year> Copyright Owner), and (3) 17 * the name of MIPS Technologies, Inc. ($B!H(BMIPS$B!I(B) is not used in any 18 * advertising or publicity pertaining to the use or distribution of 19 * this software without specific, written prior authorization. 20 * 21 * THIS SOFTWARE IS PROVIDED $B!H(BAS IS.$B!I(B MIPS MAKES NO WARRANTIES AND 22 * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR 23 * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND 25 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE. 26 * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, 27 * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF 28 * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, 29 * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY 30 * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR 31 * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE 32 * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE. 33 * 34 * Authors: Ali G. Saidi 35 * 36 */ 37 38#ifndef __ARCH_MIPS_STACKTRACE_HH__ 39#define __ARCH_MIPS_STACKTRACE_HH__ 40 41#include "base/trace.hh" 42#include "cpu/static_inst.hh" 43 44class ThreadContext; 45 46namespace MipsISA 47{ 48 49class ProcessInfo 50{ 51 private: 52 ThreadContext *tc; 53 54 int thread_info_size; 55 int task_struct_size; 56 int task_off; 57 int pid_off; 58 int name_off; 59 60 public: 61 ProcessInfo(ThreadContext *_tc); 62 63 Addr task(Addr ksp) const; 64 int pid(Addr ksp) const; 65 std::string name(Addr ksp) const; 66}; 67 68class StackTrace 69{ 70 protected: 71 typedef TheISA::MachInst MachInst; 72 private: 73 ThreadContext *tc; 74 std::vector<Addr> stack; 75 76 private: 77 bool isEntry(Addr addr); 78 bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 79 bool decodeSave(MachInst inst, int ®, int &disp); 80 bool decodeStack(MachInst inst, int &disp); 81 82 void trace(ThreadContext *tc, bool is_call); 83 84 public: 85 StackTrace(); 86 StackTrace(ThreadContext *tc, StaticInstPtr inst); 87 ~StackTrace(); 88 89 void clear() 90 { 91 tc = 0; 92 stack.clear(); 93 } 94 95 bool valid() const { return tc != NULL; } 96 bool trace(ThreadContext *tc, StaticInstPtr inst); 97 98 public: 99 const std::vector<Addr> &getstack() const { return stack; } 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 dprintf() { if (DTRACE(Stack)) dump(); } 111#else 112 public: 113 void dprintf() {} 114#endif 115}; 116 117inline bool 118StackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 119{ 120 if (!inst->isCall() && !inst->isReturn()) 121 return false; 122 123 if (valid()) 124 clear(); 125 126 trace(tc, !inst->isReturn()); 127 return true; 128} 129 130} 131 132#endif // __ARCH_MIPS_STACKTRACE_HH__ 133