stacktrace.hh revision 8232
12292SN/A/* 22292SN/A * Copyright (c) 2005 The Regents of The University of Michigan 32292SN/A * Copyright (c) 2007-2008 The Florida State University 42292SN/A * Copyright (c) 2009 The University of Edinburgh 52292SN/A * All rights reserved. 62292SN/A * 72292SN/A * Redistribution and use in source and binary forms, with or without 82292SN/A * modification, are permitted provided that the following conditions are 92292SN/A * met: redistributions of source code must retain the above copyright 102292SN/A * notice, this list of conditions and the following disclaimer; 112292SN/A * redistributions in binary form must reproduce the above copyright 122292SN/A * notice, this list of conditions and the following disclaimer in the 132292SN/A * documentation and/or other materials provided with the distribution; 142292SN/A * neither the name of the copyright holders nor the names of its 152292SN/A * contributors may be used to endorse or promote products derived from 162292SN/A * this software without specific prior written permission. 172292SN/A * 182292SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 192292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 202292SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212292SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222292SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 232292SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 242292SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 252292SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 262292SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 272689Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 282689Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292689Sktlim@umich.edu * 302292SN/A * Authors: Ali Saidi 312292SN/A * Stephen Hines 323326Sktlim@umich.edu * Timothy M. Jones 336658Snate@binkert.org */ 342733Sktlim@umich.edu 352907Sktlim@umich.edu#ifndef __ARCH_POWER_STACKTRACE_HH__ 362292SN/A#define __ARCH_POWER_STACKTRACE_HH__ 372292SN/A 382722Sktlim@umich.edu#include "base/trace.hh" 392669Sktlim@umich.edu#include "cpu/static_inst.hh" 402292SN/A#include "debug/Stack.hh" 412790Sktlim@umich.edu 422790Sktlim@umich.educlass ThreadContext; 432790Sktlim@umich.educlass StackTrace; 442790Sktlim@umich.edu 452669Sktlim@umich.edunamespace PowerISA 462678Sktlim@umich.edu{ 472678Sktlim@umich.edu 485606Snate@binkert.orgclass ProcessInfo 492292SN/A{ 502678Sktlim@umich.edu private: 512292SN/A ThreadContext *tc; 522292SN/A 532669Sktlim@umich.edu int thread_info_size; 542292SN/A int task_struct_size; 552678Sktlim@umich.edu int task_off; 562292SN/A int pid_off; 572678Sktlim@umich.edu int name_off; 582678Sktlim@umich.edu 592678Sktlim@umich.edu public: 604319Sktlim@umich.edu ProcessInfo(ThreadContext *_tc); 614319Sktlim@umich.edu 624319Sktlim@umich.edu Addr task(Addr ksp) const; 634319Sktlim@umich.edu int pid(Addr ksp) const; 644319Sktlim@umich.edu std::string name(Addr ksp) const; 652678Sktlim@umich.edu}; 662678Sktlim@umich.edu 672292SN/Aclass StackTrace 682678Sktlim@umich.edu{ 692678Sktlim@umich.edu protected: 705336Shines@cs.fsu.edu typedef TheISA::MachInst MachInst; 712678Sktlim@umich.edu private: 724873Sstever@eecs.umich.edu ThreadContext *tc; 732678Sktlim@umich.edu std::vector<Addr> stack; 742292SN/A 752678Sktlim@umich.edu private: 762678Sktlim@umich.edu bool isEntry(Addr addr); 772678Sktlim@umich.edu bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 782678Sktlim@umich.edu bool decodeSave(MachInst inst, int ®, int &disp); 792678Sktlim@umich.edu bool decodeStack(MachInst inst, int &disp); 802678Sktlim@umich.edu 812678Sktlim@umich.edu void trace(ThreadContext *tc, bool is_call); 822698Sktlim@umich.edu 832344SN/A public: 842678Sktlim@umich.edu StackTrace(); 852678Sktlim@umich.edu StackTrace(ThreadContext *tc, StaticInstPtr inst); 864986Ssaidi@eecs.umich.edu ~StackTrace(); 874986Ssaidi@eecs.umich.edu 882678Sktlim@umich.edu void 892820Sktlim@umich.edu clear() 902678Sktlim@umich.edu { 912678Sktlim@umich.edu tc = 0; 922678Sktlim@umich.edu stack.clear(); 932678Sktlim@umich.edu } 942678Sktlim@umich.edu 952678Sktlim@umich.edu bool 962678Sktlim@umich.edu valid() const 972678Sktlim@umich.edu { 982344SN/A return tc != NULL; 992307SN/A } 1002678Sktlim@umich.edu 1014032Sktlim@umich.edu bool trace(ThreadContext *tc, StaticInstPtr inst); 1022678Sktlim@umich.edu 1032292SN/A public: 1042292SN/A const std::vector<Addr> & 1052292SN/A getstack() const 1062292SN/A { 1072678Sktlim@umich.edu return stack; 1082678Sktlim@umich.edu } 1092292SN/A 1102292SN/A static const int user = 1; 1112292SN/A static const int console = 2; 1122292SN/A static const int unknown = 3; 1132292SN/A 1142292SN/A#if TRACING_ON 1155529Snate@binkert.org private: 1165529Snate@binkert.org void dump(); 1175529Snate@binkert.org 1182292SN/A public: 1194329Sktlim@umich.edu void 1204329Sktlim@umich.edu dprintf() 1214329Sktlim@umich.edu { 1224329Sktlim@umich.edu if (DTRACE(Stack)) 1232292SN/A dump(); 1242307SN/A } 1252307SN/A#else 1262907Sktlim@umich.edu public: 1272907Sktlim@umich.edu void 1282292SN/A dprintf() 1292292SN/A { 1302329SN/A } 1312329SN/A#endif 1322329SN/A}; 1332292SN/A 1342292SN/Ainline bool 1352292SN/AStackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 1362292SN/A{ 1372292SN/A if (!inst->isCall() && !inst->isReturn()) 1382292SN/A return false; 1392292SN/A 1402292SN/A if (valid()) 1412292SN/A clear(); 1422292SN/A 1432292SN/A trace(tc, !inst->isReturn()); 1443492Sktlim@umich.edu return true; 1452329SN/A} 1462292SN/A 1472292SN/A} // namespace PowerISA 1482292SN/A 1492292SN/A#endif // __ARCH_POWER_STACKTRACE_HH__ 1502292SN/A