stacktrace.hh revision 2754
12689Sktlim@umich.edu/* 22689Sktlim@umich.edu * Copyright (c) 2005 The Regents of The University of Michigan 32689Sktlim@umich.edu * All rights reserved. 42689Sktlim@umich.edu * 52689Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 62689Sktlim@umich.edu * modification, are permitted provided that the following conditions are 72689Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 82689Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 92689Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 102689Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 112689Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 122689Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 132689Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 142689Sktlim@umich.edu * this software without specific prior written permission. 152689Sktlim@umich.edu * 162689Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172689Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182689Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192689Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202689Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212689Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222689Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232689Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242689Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252689Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262689Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272689Sktlim@umich.edu * 282689Sktlim@umich.edu * Authors: Ali Saidi 292689Sktlim@umich.edu */ 302689Sktlim@umich.edu 312689Sktlim@umich.edu#ifndef __ARCH_MIPS_STACKTRACE_HH__ 322689Sktlim@umich.edu#define __ARCH_MIPS_STACKTRACE_HH__ 332689Sktlim@umich.edu 342521SN/A#include "base/trace.hh" 353960Sgblack@eecs.umich.edu#include "cpu/static_inst.hh" 364194Ssaidi@eecs.umich.edu 371070SN/Aclass ThreadContext; 381070SN/Aclass StackTrace; 392521SN/A 402680Sktlim@umich.educlass ProcessInfo 416658Snate@binkert.org{ 426658Snate@binkert.org private: 432521SN/A ThreadContext *tc; 442522SN/A 452037SN/A int thread_info_size; 4656SN/A int task_struct_size; 475512SMichael.Adler@intel.com int task_off; 486658Snate@binkert.org int pid_off; 492378SN/A int name_off; 502521SN/A 512378SN/A public: 527723SAli.Saidi@ARM.com ProcessInfo(ThreadContext *_tc); 534762Snate@binkert.org 544762Snate@binkert.org Addr task(Addr ksp) const; 552378SN/A int pid(Addr ksp) const; 562SN/A std::string name(Addr ksp) const; 572SN/A}; 582107SN/A 592SN/Aclass StackTrace 602SN/A{ 612SN/A protected: 622SN/A typedef TheISA::MachInst MachInst; 632SN/A private: 641070SN/A ThreadContext *tc; 655714Shsul@eecs.umich.edu std::vector<Addr> stack; 662378SN/A 672521SN/A private: 687580SAli.Saidi@arm.com bool isEntry(Addr addr); 692378SN/A bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 707770SAli.Saidi@ARM.com bool decodeSave(MachInst inst, int ®, int &disp); 717770SAli.Saidi@ARM.com bool decodeStack(MachInst inst, int &disp); 722378SN/A 732902Ssaidi@eecs.umich.edu void trace(ThreadContext *tc, bool is_call); 742SN/A 751070SN/A public: 761070SN/A StackTrace(); 771070SN/A StackTrace(ThreadContext *tc, StaticInstPtr inst); 782378SN/A ~StackTrace(); 791070SN/A 804838Ssaidi@eecs.umich.edu void clear() 814838Ssaidi@eecs.umich.edu { 821070SN/A tc = 0; 832520SN/A stack.clear(); 842520SN/A } 852520SN/A 862520SN/A bool valid() const { return tc != NULL; } 872520SN/A bool trace(ThreadContext *tc, StaticInstPtr inst); 887723SAli.Saidi@ARM.com 892520SN/A public: 907723SAli.Saidi@ARM.com const std::vector<Addr> &getstack() const { return stack; } 917723SAli.Saidi@ARM.com 922520SN/A static const int user = 1; 937723SAli.Saidi@ARM.com static const int console = 2; 942521SN/A static const int unknown = 3; 957723SAli.Saidi@ARM.com 967723SAli.Saidi@ARM.com#if TRACING_ON 972521SN/A private: 982520SN/A void dump(); 991070SN/A 1002158SN/A public: 1011070SN/A void dprintf() { if (DTRACE(Stack)) dump(); } 1024762Snate@binkert.org#else 1035823Ssaidi@eecs.umich.edu public: 1043812Ssaidi@eecs.umich.edu void dprintf() {} 1053812Ssaidi@eecs.umich.edu#endif 1063812Ssaidi@eecs.umich.edu}; 1074762Snate@binkert.org 1085823Ssaidi@eecs.umich.eduinline bool 1095222Sksewell@umich.eduStackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 1103812Ssaidi@eecs.umich.edu{ 1114762Snate@binkert.org if (!inst->isCall() && !inst->isReturn()) 1121070SN/A return false; 1133812Ssaidi@eecs.umich.edu 1147723SAli.Saidi@ARM.com if (valid()) 1151070SN/A clear(); 1163812Ssaidi@eecs.umich.edu 1173812Ssaidi@eecs.umich.edu trace(tc, !inst->isReturn()); 1183812Ssaidi@eecs.umich.edu return true; 1193812Ssaidi@eecs.umich.edu} 1201070SN/A 1213812Ssaidi@eecs.umich.edu#endif // __ARCH_MIPS_STACKTRACE_HH__ 1223812Ssaidi@eecs.umich.edu