stacktrace.hh revision 7811
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" 406691Stjones1@inf.ed.ac.uk 416691Stjones1@inf.ed.ac.ukclass ThreadContext; 426691Stjones1@inf.ed.ac.ukclass StackTrace; 436691Stjones1@inf.ed.ac.uk 446691Stjones1@inf.ed.ac.uknamespace PowerISA 456691Stjones1@inf.ed.ac.uk{ 466691Stjones1@inf.ed.ac.uk 476691Stjones1@inf.ed.ac.ukclass ProcessInfo 486691Stjones1@inf.ed.ac.uk{ 496691Stjones1@inf.ed.ac.uk private: 506691Stjones1@inf.ed.ac.uk ThreadContext *tc; 516691Stjones1@inf.ed.ac.uk 526691Stjones1@inf.ed.ac.uk int thread_info_size; 536691Stjones1@inf.ed.ac.uk int task_struct_size; 546691Stjones1@inf.ed.ac.uk int task_off; 556691Stjones1@inf.ed.ac.uk int pid_off; 566691Stjones1@inf.ed.ac.uk int name_off; 576691Stjones1@inf.ed.ac.uk 586691Stjones1@inf.ed.ac.uk public: 596691Stjones1@inf.ed.ac.uk ProcessInfo(ThreadContext *_tc); 606691Stjones1@inf.ed.ac.uk 616691Stjones1@inf.ed.ac.uk Addr task(Addr ksp) const; 626691Stjones1@inf.ed.ac.uk int pid(Addr ksp) const; 636691Stjones1@inf.ed.ac.uk std::string name(Addr ksp) const; 646691Stjones1@inf.ed.ac.uk}; 656691Stjones1@inf.ed.ac.uk 666691Stjones1@inf.ed.ac.ukclass StackTrace 676691Stjones1@inf.ed.ac.uk{ 686691Stjones1@inf.ed.ac.uk protected: 696691Stjones1@inf.ed.ac.uk typedef TheISA::MachInst MachInst; 706691Stjones1@inf.ed.ac.uk private: 716691Stjones1@inf.ed.ac.uk ThreadContext *tc; 726691Stjones1@inf.ed.ac.uk std::vector<Addr> stack; 736691Stjones1@inf.ed.ac.uk 746691Stjones1@inf.ed.ac.uk private: 756691Stjones1@inf.ed.ac.uk bool isEntry(Addr addr); 766691Stjones1@inf.ed.ac.uk bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 776691Stjones1@inf.ed.ac.uk bool decodeSave(MachInst inst, int ®, int &disp); 786691Stjones1@inf.ed.ac.uk bool decodeStack(MachInst inst, int &disp); 796691Stjones1@inf.ed.ac.uk 806691Stjones1@inf.ed.ac.uk void trace(ThreadContext *tc, bool is_call); 816691Stjones1@inf.ed.ac.uk 826691Stjones1@inf.ed.ac.uk public: 836691Stjones1@inf.ed.ac.uk StackTrace(); 846691Stjones1@inf.ed.ac.uk StackTrace(ThreadContext *tc, StaticInstPtr inst); 856691Stjones1@inf.ed.ac.uk ~StackTrace(); 866691Stjones1@inf.ed.ac.uk 876691Stjones1@inf.ed.ac.uk void 886691Stjones1@inf.ed.ac.uk clear() 896691Stjones1@inf.ed.ac.uk { 906691Stjones1@inf.ed.ac.uk tc = 0; 916691Stjones1@inf.ed.ac.uk stack.clear(); 926691Stjones1@inf.ed.ac.uk } 936691Stjones1@inf.ed.ac.uk 946691Stjones1@inf.ed.ac.uk bool 956691Stjones1@inf.ed.ac.uk valid() const 966691Stjones1@inf.ed.ac.uk { 976691Stjones1@inf.ed.ac.uk return tc != NULL; 986691Stjones1@inf.ed.ac.uk } 996691Stjones1@inf.ed.ac.uk 1006691Stjones1@inf.ed.ac.uk bool trace(ThreadContext *tc, StaticInstPtr inst); 1016691Stjones1@inf.ed.ac.uk 1026691Stjones1@inf.ed.ac.uk public: 1036691Stjones1@inf.ed.ac.uk const std::vector<Addr> & 1046691Stjones1@inf.ed.ac.uk getstack() const 1056691Stjones1@inf.ed.ac.uk { 1066691Stjones1@inf.ed.ac.uk return stack; 1076691Stjones1@inf.ed.ac.uk } 1086691Stjones1@inf.ed.ac.uk 1096691Stjones1@inf.ed.ac.uk static const int user = 1; 1106691Stjones1@inf.ed.ac.uk static const int console = 2; 1116691Stjones1@inf.ed.ac.uk static const int unknown = 3; 1126691Stjones1@inf.ed.ac.uk 1136691Stjones1@inf.ed.ac.uk#if TRACING_ON 1146691Stjones1@inf.ed.ac.uk private: 1156691Stjones1@inf.ed.ac.uk void dump(); 1166691Stjones1@inf.ed.ac.uk 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 if (DTRACE(Stack)) 1226691Stjones1@inf.ed.ac.uk dump(); 1236691Stjones1@inf.ed.ac.uk } 1246691Stjones1@inf.ed.ac.uk#else 1256691Stjones1@inf.ed.ac.uk public: 1266691Stjones1@inf.ed.ac.uk void 1276691Stjones1@inf.ed.ac.uk dprintf() 1286691Stjones1@inf.ed.ac.uk { 1296691Stjones1@inf.ed.ac.uk } 1306691Stjones1@inf.ed.ac.uk#endif 1316691Stjones1@inf.ed.ac.uk}; 1326691Stjones1@inf.ed.ac.uk 1336691Stjones1@inf.ed.ac.ukinline bool 1346691Stjones1@inf.ed.ac.ukStackTrace::trace(ThreadContext *tc, StaticInstPtr inst) 1356691Stjones1@inf.ed.ac.uk{ 1366691Stjones1@inf.ed.ac.uk if (!inst->isCall() && !inst->isReturn()) 1376691Stjones1@inf.ed.ac.uk return false; 1386691Stjones1@inf.ed.ac.uk 1396691Stjones1@inf.ed.ac.uk if (valid()) 1406691Stjones1@inf.ed.ac.uk clear(); 1416691Stjones1@inf.ed.ac.uk 1426691Stjones1@inf.ed.ac.uk trace(tc, !inst->isReturn()); 1436691Stjones1@inf.ed.ac.uk return true; 1446691Stjones1@inf.ed.ac.uk} 1456691Stjones1@inf.ed.ac.uk 1467811Ssteve.reinhardt@amd.com} // namespace PowerISA 1476691Stjones1@inf.ed.ac.uk 1486691Stjones1@inf.ed.ac.uk#endif // __ARCH_POWER_STACKTRACE_HH__ 149