stacktrace.hh revision 10417
16691Stjones1@inf.ed.ac.uk/* 26691Stjones1@inf.ed.ac.uk * Copyright (c) 2005 The Regents of The University of Michigan 36691Stjones1@inf.ed.ac.uk * Copyright (c) 2007-2008 The Florida State University 46691Stjones1@inf.ed.ac.uk * Copyright (c) 2009 The University of Edinburgh 56691Stjones1@inf.ed.ac.uk * All rights reserved. 66691Stjones1@inf.ed.ac.uk * 76691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without 86691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are 96691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright 106691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer; 116691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright 126691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the 136691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution; 146691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its 156691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from 166691Stjones1@inf.ed.ac.uk * this software without specific prior written permission. 176691Stjones1@inf.ed.ac.uk * 186691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 196691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 206691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 216691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 226691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 236691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 246691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 256691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 266691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 276691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 286691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 296691Stjones1@inf.ed.ac.uk * 306691Stjones1@inf.ed.ac.uk * Authors: Ali Saidi 316691Stjones1@inf.ed.ac.uk * Stephen Hines 326691Stjones1@inf.ed.ac.uk * Timothy M. Jones 336691Stjones1@inf.ed.ac.uk */ 346691Stjones1@inf.ed.ac.uk 356691Stjones1@inf.ed.ac.uk#ifndef __ARCH_POWER_STACKTRACE_HH__ 366691Stjones1@inf.ed.ac.uk#define __ARCH_POWER_STACKTRACE_HH__ 376691Stjones1@inf.ed.ac.uk 386691Stjones1@inf.ed.ac.uk#include "base/trace.hh" 396691Stjones1@inf.ed.ac.uk#include "cpu/static_inst.hh" 408232Snate@binkert.org#include "debug/Stack.hh" 416691Stjones1@inf.ed.ac.uk 426691Stjones1@inf.ed.ac.ukclass ThreadContext; 436691Stjones1@inf.ed.ac.ukclass StackTrace; 446691Stjones1@inf.ed.ac.uk 456691Stjones1@inf.ed.ac.uknamespace PowerISA 466691Stjones1@inf.ed.ac.uk{ 476691Stjones1@inf.ed.ac.uk 486691Stjones1@inf.ed.ac.ukclass ProcessInfo 496691Stjones1@inf.ed.ac.uk{ 506691Stjones1@inf.ed.ac.uk public: 516691Stjones1@inf.ed.ac.uk ProcessInfo(ThreadContext *_tc); 526691Stjones1@inf.ed.ac.uk 536691Stjones1@inf.ed.ac.uk Addr task(Addr ksp) const; 546691Stjones1@inf.ed.ac.uk int pid(Addr ksp) const; 556691Stjones1@inf.ed.ac.uk std::string name(Addr ksp) const; 566691Stjones1@inf.ed.ac.uk}; 576691Stjones1@inf.ed.ac.uk 586691Stjones1@inf.ed.ac.ukclass StackTrace 596691Stjones1@inf.ed.ac.uk{ 606691Stjones1@inf.ed.ac.uk protected: 616691Stjones1@inf.ed.ac.uk typedef TheISA::MachInst MachInst; 626691Stjones1@inf.ed.ac.uk private: 636691Stjones1@inf.ed.ac.uk ThreadContext *tc; 646691Stjones1@inf.ed.ac.uk std::vector<Addr> stack; 656691Stjones1@inf.ed.ac.uk 666691Stjones1@inf.ed.ac.uk private: 676691Stjones1@inf.ed.ac.uk bool isEntry(Addr addr); 686691Stjones1@inf.ed.ac.uk bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 696691Stjones1@inf.ed.ac.uk bool decodeSave(MachInst inst, int ®, int &disp); 706691Stjones1@inf.ed.ac.uk bool decodeStack(MachInst inst, int &disp); 716691Stjones1@inf.ed.ac.uk 726691Stjones1@inf.ed.ac.uk void trace(ThreadContext *tc, bool is_call); 736691Stjones1@inf.ed.ac.uk 746691Stjones1@inf.ed.ac.uk public: 756691Stjones1@inf.ed.ac.uk StackTrace(); 7610417Sandreas.hansson@arm.com StackTrace(ThreadContext *tc, const StaticInstPtr &inst); 776691Stjones1@inf.ed.ac.uk ~StackTrace(); 786691Stjones1@inf.ed.ac.uk 796691Stjones1@inf.ed.ac.uk void 806691Stjones1@inf.ed.ac.uk clear() 816691Stjones1@inf.ed.ac.uk { 826691Stjones1@inf.ed.ac.uk tc = 0; 836691Stjones1@inf.ed.ac.uk stack.clear(); 846691Stjones1@inf.ed.ac.uk } 856691Stjones1@inf.ed.ac.uk 866691Stjones1@inf.ed.ac.uk bool 876691Stjones1@inf.ed.ac.uk valid() const 886691Stjones1@inf.ed.ac.uk { 896691Stjones1@inf.ed.ac.uk return tc != NULL; 906691Stjones1@inf.ed.ac.uk } 916691Stjones1@inf.ed.ac.uk 9210417Sandreas.hansson@arm.com bool trace(ThreadContext *tc, const StaticInstPtr &inst); 936691Stjones1@inf.ed.ac.uk 946691Stjones1@inf.ed.ac.uk public: 956691Stjones1@inf.ed.ac.uk const std::vector<Addr> & 966691Stjones1@inf.ed.ac.uk getstack() const 976691Stjones1@inf.ed.ac.uk { 986691Stjones1@inf.ed.ac.uk return stack; 996691Stjones1@inf.ed.ac.uk } 1006691Stjones1@inf.ed.ac.uk 1016691Stjones1@inf.ed.ac.uk static const int user = 1; 1026691Stjones1@inf.ed.ac.uk static const int console = 2; 1036691Stjones1@inf.ed.ac.uk static const int unknown = 3; 1046691Stjones1@inf.ed.ac.uk 1056691Stjones1@inf.ed.ac.uk#if TRACING_ON 1066691Stjones1@inf.ed.ac.uk private: 1076691Stjones1@inf.ed.ac.uk void dump(); 1086691Stjones1@inf.ed.ac.uk 1096691Stjones1@inf.ed.ac.uk public: 1106691Stjones1@inf.ed.ac.uk void 1116691Stjones1@inf.ed.ac.uk dprintf() 1126691Stjones1@inf.ed.ac.uk { 1136691Stjones1@inf.ed.ac.uk if (DTRACE(Stack)) 1146691Stjones1@inf.ed.ac.uk dump(); 1156691Stjones1@inf.ed.ac.uk } 1166691Stjones1@inf.ed.ac.uk#else 1176691Stjones1@inf.ed.ac.uk public: 1186691Stjones1@inf.ed.ac.uk void 1196691Stjones1@inf.ed.ac.uk dprintf() 1206691Stjones1@inf.ed.ac.uk { 1216691Stjones1@inf.ed.ac.uk } 1226691Stjones1@inf.ed.ac.uk#endif 1236691Stjones1@inf.ed.ac.uk}; 1246691Stjones1@inf.ed.ac.uk 1256691Stjones1@inf.ed.ac.ukinline bool 12610417Sandreas.hansson@arm.comStackTrace::trace(ThreadContext *tc, const StaticInstPtr &inst) 1276691Stjones1@inf.ed.ac.uk{ 1286691Stjones1@inf.ed.ac.uk if (!inst->isCall() && !inst->isReturn()) 1296691Stjones1@inf.ed.ac.uk return false; 1306691Stjones1@inf.ed.ac.uk 1316691Stjones1@inf.ed.ac.uk if (valid()) 1326691Stjones1@inf.ed.ac.uk clear(); 1336691Stjones1@inf.ed.ac.uk 1346691Stjones1@inf.ed.ac.uk trace(tc, !inst->isReturn()); 1356691Stjones1@inf.ed.ac.uk return true; 1366691Stjones1@inf.ed.ac.uk} 1376691Stjones1@inf.ed.ac.uk 1387811Ssteve.reinhardt@amd.com} // namespace PowerISA 1396691Stjones1@inf.ed.ac.uk 1406691Stjones1@inf.ed.ac.uk#endif // __ARCH_POWER_STACKTRACE_HH__ 141