stacktrace.hh revision 5254
12155SN/A/* 22155SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan 32155SN/A * All rights reserved. 42155SN/A * 52155SN/A * Redistribution and use in source and binary forms, with or without 62155SN/A * modification, are permitted provided that the following conditions are 72155SN/A * met: redistributions of source code must retain the above copyright 82155SN/A * notice, this list of conditions and the following disclaimer; 92155SN/A * redistributions in binary form must reproduce the above copyright 102155SN/A * notice, this list of conditions and the following disclaimer in the 112155SN/A * documentation and/or other materials provided with the distribution; 122155SN/A * neither the name of the copyright holders nor the names of its 132155SN/A * contributors may be used to endorse or promote products derived from 142155SN/A * this software without specific prior written permission. 152155SN/A * 162155SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172155SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182155SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192155SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202155SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212155SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222155SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232155SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242155SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252155SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262155SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272155SN/A * 282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi 292665Ssaidi@eecs.umich.edu */ 302155SN/A 314202Sbinkertn@umich.edu#ifndef __ARCH_MIPS_STACKTRACE_HH__ 322155SN/A#define __ARCH_MIPS_STACKTRACE_HH__ 337768SAli.Saidi@ARM.com 347768SAli.Saidi@ARM.com#include "base/trace.hh" 357768SAli.Saidi@ARM.com#include "cpu/static_inst.hh" 362178SN/A 372178SN/Aclass ThreadContext; 382178SN/A 392178SN/Anamespace MipsISA 402178SN/A{ 412178SN/A 422178SN/Aclass ProcessInfo 432178SN/A{ 442178SN/A private: 452178SN/A ThreadContext *tc; 462178SN/A 472155SN/A int thread_info_size; 485865Sksewell@umich.edu int task_struct_size; 496181Sksewell@umich.edu int task_off; 506181Sksewell@umich.edu int pid_off; 515865Sksewell@umich.edu int name_off; 523918Ssaidi@eecs.umich.edu 535865Sksewell@umich.edu public: 542623SN/A ProcessInfo(ThreadContext *_tc); 553918Ssaidi@eecs.umich.edu 562155SN/A Addr task(Addr ksp) const; 572155SN/A int pid(Addr ksp) const; 582292SN/A std::string name(Addr ksp) const; 596181Sksewell@umich.edu}; 606181Sksewell@umich.edu 613918Ssaidi@eecs.umich.educlass StackTrace 622292SN/A{ 632292SN/A protected: 642292SN/A typedef TheISA::MachInst MachInst; 653918Ssaidi@eecs.umich.edu private: 662292SN/A ThreadContext *tc; 672292SN/A std::vector<Addr> stack; 682766Sktlim@umich.edu 692766Sktlim@umich.edu private: 702766Sktlim@umich.edu bool isEntry(Addr addr); 712921Sktlim@umich.edu bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 722921Sktlim@umich.edu bool decodeSave(MachInst inst, int ®, int &disp); 732766Sktlim@umich.edu bool decodeStack(MachInst inst, int &disp); 742766Sktlim@umich.edu 755529Snate@binkert.org void trace(ThreadContext *tc, bool is_call); 762766Sktlim@umich.edu 774762Snate@binkert.org public: 782155SN/A StackTrace(); 792155SN/A StackTrace(ThreadContext *tc, StaticInstPtr inst); 802155SN/A ~StackTrace(); 812155SN/A 822155SN/A void clear() 832155SN/A { 842766Sktlim@umich.edu tc = 0; 852155SN/A stack.clear(); 865865Sksewell@umich.edu } 872155SN/A 882155SN/A bool valid() const { return tc != NULL; } 892155SN/A bool trace(ThreadContext *tc, StaticInstPtr inst); 902155SN/A 912178SN/A public: 922178SN/A const std::vector<Addr> &getstack() const { return stack; } 937756SAli.Saidi@ARM.com 942766Sktlim@umich.edu static const int user = 1; 952178SN/A static const int console = 2; 962178SN/A static const int unknown = 3; 976994Snate@binkert.org 982178SN/A#if TRACING_ON 992766Sktlim@umich.edu private: 1002766Sktlim@umich.edu void dump(); 1012766Sktlim@umich.edu 1022788Sktlim@umich.edu public: 1032178SN/A void dprintf() { if (DTRACE(Stack)) dump(); } 1042733Sktlim@umich.edu#else 1052733Sktlim@umich.edu public: 1062817Sksewell@umich.edu void dprintf() {} 1072733Sktlim@umich.edu#endif 1084486Sbinkertn@umich.edu}; 1094486Sbinkertn@umich.edu 1104776Sgblack@eecs.umich.eduinline bool 1114776Sgblack@eecs.umich.eduStackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 1128739Sgblack@eecs.umich.edu{ 1136365Sgblack@eecs.umich.edu if (!inst->isCall() && !inst->isReturn()) 1144486Sbinkertn@umich.edu return false; 1154202Sbinkertn@umich.edu 1164202Sbinkertn@umich.edu if (valid()) 1174202Sbinkertn@umich.edu clear(); 1188541Sgblack@eecs.umich.edu 1194202Sbinkertn@umich.edu trace(tc, !inst->isReturn()); 1204202Sbinkertn@umich.edu return true; 1214776Sgblack@eecs.umich.edu} 1228739Sgblack@eecs.umich.edu 1236365Sgblack@eecs.umich.edu} 1244202Sbinkertn@umich.edu 1254202Sbinkertn@umich.edu#endif // __ARCH_MIPS_STACKTRACE_HH__ 1264202Sbinkertn@umich.edu