stacktrace.hh revision 2107
11917SN/A/* 21917SN/A * Copyright (c) 2005 The Regents of The University of Michigan 31917SN/A * All rights reserved. 41917SN/A * 51917SN/A * Redistribution and use in source and binary forms, with or without 61917SN/A * modification, are permitted provided that the following conditions are 71917SN/A * met: redistributions of source code must retain the above copyright 81917SN/A * notice, this list of conditions and the following disclaimer; 91917SN/A * redistributions in binary form must reproduce the above copyright 101917SN/A * notice, this list of conditions and the following disclaimer in the 111917SN/A * documentation and/or other materials provided with the distribution; 121917SN/A * neither the name of the copyright holders nor the names of its 131917SN/A * contributors may be used to endorse or promote products derived from 141917SN/A * this software without specific prior written permission. 151917SN/A * 161917SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171917SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181917SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191917SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201917SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211917SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221917SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231917SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241917SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251917SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261917SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu */ 282665Ssaidi@eecs.umich.edu 291917SN/A#ifndef __ARCH_ALPHA_STACKTRACE_HH__ 301917SN/A#define __ARCH_ALPHA_STACKTRACE_HH__ 311917SN/A 321917SN/A#include "base/trace.hh" 331917SN/A#include "cpu/static_inst.hh" 341917SN/A 351917SN/Aclass ExecContext; 361917SN/Aclass StackTrace; 371917SN/A 381917SN/Aclass ProcessInfo 392680Sktlim@umich.edu{ 402235SN/A protected: 411917SN/A typedef TheISA::Addr Addr; 421917SN/A private: 432107SN/A ExecContext *xc; 441917SN/A 452680Sktlim@umich.edu int thread_info_size; 462680Sktlim@umich.edu int task_struct_size; 471917SN/A int task_off; 481917SN/A int pid_off; 491917SN/A int name_off; 502684Ssaidi@eecs.umich.edu 512684Ssaidi@eecs.umich.edu public: 522684Ssaidi@eecs.umich.edu ProcessInfo(ExecContext *_xc); 532684Ssaidi@eecs.umich.edu 542680Sktlim@umich.edu Addr task(Addr ksp) const; 551917SN/A int pid(Addr ksp) const; 562684Ssaidi@eecs.umich.edu std::string name(Addr ksp) const; 571917SN/A}; 582680Sktlim@umich.edu 591917SN/Aclass StackTrace 602684Ssaidi@eecs.umich.edu{ 611917SN/A protected: 622680Sktlim@umich.edu typedef TheISA::Addr Addr; 631917SN/A typedef TheISA::MachInst MachInst; 642684Ssaidi@eecs.umich.edu private: 651917SN/A ExecContext *xc; 662680Sktlim@umich.edu std::vector<Addr> stack; 671917SN/A 682684Ssaidi@eecs.umich.edu private: 691917SN/A bool isEntry(Addr addr); 702680Sktlim@umich.edu bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 711917SN/A bool decodeSave(MachInst inst, int ®, int &disp); 722684Ssaidi@eecs.umich.edu bool decodeStack(MachInst inst, int &disp); 732684Ssaidi@eecs.umich.edu 742684Ssaidi@eecs.umich.edu void trace(ExecContext *xc, bool is_call); 751917SN/A 761917SN/A public: 771917SN/A StackTrace(); 781917SN/A StackTrace(ExecContext *xc, StaticInstPtr inst); 791917SN/A ~StackTrace(); 801917SN/A 811917SN/A void clear() 821917SN/A { 831917SN/A xc = 0; 842684Ssaidi@eecs.umich.edu stack.clear(); 852684Ssaidi@eecs.umich.edu } 862684Ssaidi@eecs.umich.edu 872684Ssaidi@eecs.umich.edu bool valid() const { return xc != NULL; } 882684Ssaidi@eecs.umich.edu bool trace(ExecContext *xc, StaticInstPtr inst); 892684Ssaidi@eecs.umich.edu 902684Ssaidi@eecs.umich.edu public: 912684Ssaidi@eecs.umich.edu const std::vector<Addr> &getstack() const { return stack; } 922684Ssaidi@eecs.umich.edu 931917SN/A static const int user = 1; 941917SN/A static const int console = 2; 951917SN/A static const int unknown = 3; 961917SN/A 971917SN/A#if TRACING_ON 981917SN/A private: 991917SN/A void dump(); 1001917SN/A 1011917SN/A public: 1022684Ssaidi@eecs.umich.edu void dprintf() { if (DTRACE(Stack)) dump(); } 1032684Ssaidi@eecs.umich.edu#else 1042684Ssaidi@eecs.umich.edu public: 1052684Ssaidi@eecs.umich.edu void dprintf() {} 1062684Ssaidi@eecs.umich.edu#endif 1072684Ssaidi@eecs.umich.edu}; 1082684Ssaidi@eecs.umich.edu 1092684Ssaidi@eecs.umich.eduinline bool 1102684Ssaidi@eecs.umich.eduStackTrace::trace(ExecContext *xc, StaticInstPtr inst) 1111917SN/A{ 1121917SN/A if (!inst->isCall() && !inst->isReturn()) 1131917SN/A return false; 1141917SN/A 1151917SN/A if (valid()) 1161917SN/A clear(); 1171917SN/A 1181917SN/A trace(xc, !inst->isReturn()); 1191917SN/A return true; 1201917SN/A} 1212680Sktlim@umich.edu 1221917SN/A#endif // __ARCH_ALPHA_STACKTRACE_HH__ 1231917SN/A