stacktrace.hh revision 3580
114209Sandreas.sandberg@arm.com/* 211878Sandreas.sandberg@arm.com * Copyright (c) 2005 The Regents of The University of Michigan 311878Sandreas.sandberg@arm.com * All rights reserved. 411878Sandreas.sandberg@arm.com * 511878Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 611878Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 711878Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 811878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 911878Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1011878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1111878Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1211878Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 134126SN/A * contributors may be used to endorse or promote products derived from 148295Snate@binkert.org * this software without specific prior written permission. 154126SN/A * 164126SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174126SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184126SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194126SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204126SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214126SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224126SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234126SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244126SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254126SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264126SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274126SN/A * 284126SN/A * Authors: Ali Saidi 294126SN/A */ 304126SN/A 314126SN/A#ifndef __ARCH_MIPS_STACKTRACE_HH__ 324126SN/A#define __ARCH_MIPS_STACKTRACE_HH__ 334126SN/A 344126SN/A#include "base/trace.hh" 354126SN/A#include "cpu/static_inst.hh" 364126SN/A 374126SN/Aclass ThreadContext; 384126SN/Aclass StackTrace; 394126SN/A 404126SN/Anamespace MipsISA 4111878Sandreas.sandberg@arm.com{ 424126SN/A 4314213Sandreas.sandberg@arm.comclass ProcessInfo 4414213Sandreas.sandberg@arm.com{ 4514213Sandreas.sandberg@arm.com private: 468296Snate@binkert.org ThreadContext *tc; 478296Snate@binkert.org 4811802Sandreas.sandberg@arm.com int thread_info_size; 498295Snate@binkert.org int task_struct_size; 508296Snate@binkert.org int task_off; 514126SN/A int pid_off; 5211766Sandreas.sandberg@arm.com int name_off; 5311802Sandreas.sandberg@arm.com 5411802Sandreas.sandberg@arm.com public: 5511766Sandreas.sandberg@arm.com ProcessInfo(ThreadContext *_tc); 568296Snate@binkert.org 5711878Sandreas.sandberg@arm.com Addr task(Addr ksp) const; 5814213Sandreas.sandberg@arm.com int pid(Addr ksp) const; 5914213Sandreas.sandberg@arm.com std::string name(Addr ksp) const; 6014213Sandreas.sandberg@arm.com}; 6114213Sandreas.sandberg@arm.com 6214213Sandreas.sandberg@arm.comclass StackTrace 6314213Sandreas.sandberg@arm.com{ 6414213Sandreas.sandberg@arm.com protected: 6514213Sandreas.sandberg@arm.com typedef TheISA::MachInst MachInst; 6614213Sandreas.sandberg@arm.com private: 6711878Sandreas.sandberg@arm.com ThreadContext *tc; 6811878Sandreas.sandberg@arm.com std::vector<Addr> stack; 6911878Sandreas.sandberg@arm.com 7011878Sandreas.sandberg@arm.com private: 7111878Sandreas.sandberg@arm.com bool isEntry(Addr addr); 7211878Sandreas.sandberg@arm.com bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 7311878Sandreas.sandberg@arm.com bool decodeSave(MachInst inst, int ®, int &disp); 7411878Sandreas.sandberg@arm.com bool decodeStack(MachInst inst, int &disp); 7514213Sandreas.sandberg@arm.com 7614213Sandreas.sandberg@arm.com void trace(ThreadContext *tc, bool is_call); 7714213Sandreas.sandberg@arm.com 7814213Sandreas.sandberg@arm.com public: 7914213Sandreas.sandberg@arm.com StackTrace(); 8014213Sandreas.sandberg@arm.com StackTrace(ThreadContext *tc, StaticInstPtr inst); 8114213Sandreas.sandberg@arm.com ~StackTrace(); 8211878Sandreas.sandberg@arm.com 8311878Sandreas.sandberg@arm.com void clear() 8411878Sandreas.sandberg@arm.com { 8511878Sandreas.sandberg@arm.com tc = 0; 8611878Sandreas.sandberg@arm.com stack.clear(); 8711878Sandreas.sandberg@arm.com } 8811878Sandreas.sandberg@arm.com 8911878Sandreas.sandberg@arm.com bool valid() const { return tc != NULL; } 9014213Sandreas.sandberg@arm.com bool trace(ThreadContext *tc, StaticInstPtr inst); 9114213Sandreas.sandberg@arm.com 9214213Sandreas.sandberg@arm.com public: 9314213Sandreas.sandberg@arm.com const std::vector<Addr> &getstack() const { return stack; } 9414213Sandreas.sandberg@arm.com 9514213Sandreas.sandberg@arm.com static const int user = 1; 9614213Sandreas.sandberg@arm.com static const int console = 2; 9714213Sandreas.sandberg@arm.com static const int unknown = 3; 9814213Sandreas.sandberg@arm.com 9911878Sandreas.sandberg@arm.com#if TRACING_ON 10014213Sandreas.sandberg@arm.com private: 10111878Sandreas.sandberg@arm.com void dump(); 10214213Sandreas.sandberg@arm.com 10314213Sandreas.sandberg@arm.com public: 10414213Sandreas.sandberg@arm.com void dprintf() { if (DTRACE(Stack)) dump(); } 10514213Sandreas.sandberg@arm.com#else 10614213Sandreas.sandberg@arm.com public: 10714213Sandreas.sandberg@arm.com void dprintf() {} 10814213Sandreas.sandberg@arm.com#endif 10914213Sandreas.sandberg@arm.com}; 11014213Sandreas.sandberg@arm.com 11114213Sandreas.sandberg@arm.cominline bool 11214213Sandreas.sandberg@arm.comStackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 11314213Sandreas.sandberg@arm.com{ 11414213Sandreas.sandberg@arm.com if (!inst->isCall() && !inst->isReturn()) 11514213Sandreas.sandberg@arm.com return false; 11614213Sandreas.sandberg@arm.com 11714213Sandreas.sandberg@arm.com if (valid()) 11814213Sandreas.sandberg@arm.com clear(); 11911878Sandreas.sandberg@arm.com 12014213Sandreas.sandberg@arm.com trace(tc, !inst->isReturn()); 12111878Sandreas.sandberg@arm.com return true; 12214213Sandreas.sandberg@arm.com} 12314213Sandreas.sandberg@arm.com 12414213Sandreas.sandberg@arm.com} 12514213Sandreas.sandberg@arm.com 12611878Sandreas.sandberg@arm.com#endif // __ARCH_MIPS_STACKTRACE_HH__ 12714213Sandreas.sandberg@arm.com