stacktrace.hh revision 2665
17019SBrad.Beckmann@amd.com/* 27019SBrad.Beckmann@amd.com * Copyright (c) 2005 The Regents of The University of Michigan 37019SBrad.Beckmann@amd.com * All rights reserved. 47019SBrad.Beckmann@amd.com * 57019SBrad.Beckmann@amd.com * Redistribution and use in source and binary forms, with or without 67019SBrad.Beckmann@amd.com * modification, are permitted provided that the following conditions are 77019SBrad.Beckmann@amd.com * met: redistributions of source code must retain the above copyright 87019SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer; 97019SBrad.Beckmann@amd.com * redistributions in binary form must reproduce the above copyright 107019SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer in the 117019SBrad.Beckmann@amd.com * documentation and/or other materials provided with the distribution; 127019SBrad.Beckmann@amd.com * neither the name of the copyright holders nor the names of its 137019SBrad.Beckmann@amd.com * contributors may be used to endorse or promote products derived from 147019SBrad.Beckmann@amd.com * this software without specific prior written permission. 157019SBrad.Beckmann@amd.com * 167019SBrad.Beckmann@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177019SBrad.Beckmann@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187019SBrad.Beckmann@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197019SBrad.Beckmann@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207019SBrad.Beckmann@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217019SBrad.Beckmann@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227019SBrad.Beckmann@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237019SBrad.Beckmann@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247019SBrad.Beckmann@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257019SBrad.Beckmann@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267019SBrad.Beckmann@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277019SBrad.Beckmann@amd.com * 287019SBrad.Beckmann@amd.com * Authors: Korey Sewell 297019SBrad.Beckmann@amd.com */ 306876Ssteve.reinhardt@amd.com 319206Snilay@cs.wisc.edu#ifndef __ARCH_ALPHA_STACKTRACE_HH__ 3210525Snilay@cs.wisc.edu#define __ARCH_ALPHA_STACKTRACE_HH__ 336876Ssteve.reinhardt@amd.com 349206Snilay@cs.wisc.edu#include "base/trace.hh" 356876Ssteve.reinhardt@amd.com#include "cpu/static_inst.hh" 369338SAndreas.Sandberg@arm.com 376876Ssteve.reinhardt@amd.comclass ExecContext; 386876Ssteve.reinhardt@amd.comclass StackTrace; 396876Ssteve.reinhardt@amd.com 409504Snilay@cs.wisc.educlass ProcessInfo 416876Ssteve.reinhardt@amd.com{ 4210524Snilay@cs.wisc.edu private: 4310524Snilay@cs.wisc.edu ExecContext *xc; 4410012Snilay@cs.wisc.edu 4510012Snilay@cs.wisc.edu int thread_info_size; 4610012Snilay@cs.wisc.edu int task_struct_size; 4710012Snilay@cs.wisc.edu int task_off; 4810012Snilay@cs.wisc.edu int pid_off; 4910525Snilay@cs.wisc.edu int name_off; 50 51 public: 52 ProcessInfo(ExecContext *_xc); 53 54 Addr task(Addr ksp) const; 55 int pid(Addr ksp) const; 56 std::string name(Addr ksp) const; 57}; 58 59class StackTrace 60{ 61 protected: 62 typedef TheISA::MachInst MachInst; 63 private: 64 ExecContext *xc; 65 std::vector<Addr> stack; 66 67 private: 68 bool isEntry(Addr addr); 69 bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 70 bool decodeSave(MachInst inst, int ®, int &disp); 71 bool decodeStack(MachInst inst, int &disp); 72 73 void trace(ExecContext *xc, bool is_call); 74 75 public: 76 StackTrace(); 77 StackTrace(ExecContext *xc, StaticInstPtr inst); 78 ~StackTrace(); 79 80 void clear() 81 { 82 xc = 0; 83 stack.clear(); 84 } 85 86 bool valid() const { return xc != NULL; } 87 bool trace(ExecContext *xc, StaticInstPtr inst); 88 89 public: 90 const std::vector<Addr> &getstack() const { return stack; } 91 92 static const int user = 1; 93 static const int console = 2; 94 static const int unknown = 3; 95 96#if TRACING_ON 97 private: 98 void dump(); 99 100 public: 101 void dprintf() { if (DTRACE(Stack)) dump(); } 102#else 103 public: 104 void dprintf() {} 105#endif 106}; 107 108inline bool 109StackTrace::trace(ExecContext *xc, StaticInstPtr inst) 110{ 111 if (!inst->isCall() && !inst->isReturn()) 112 return false; 113 114 if (valid()) 115 clear(); 116 117 trace(xc, !inst->isReturn()); 118 return true; 119} 120 121#endif // __ARCH_ALPHA_STACKTRACE_HH__ 122