stacktrace.hh revision 11723
17732SAli.Saidi@ARM.com/* 27732SAli.Saidi@ARM.com * Copyright (c) 2005 The Regents of The University of Michigan 37732SAli.Saidi@ARM.com * Copyright (c) 2007-2008 The Florida State University 47732SAli.Saidi@ARM.com * Copyright (c) 2009 The University of Edinburgh 57732SAli.Saidi@ARM.com * All rights reserved. 67732SAli.Saidi@ARM.com * 77732SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 87732SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 97732SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 107732SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 117732SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 127732SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 137732SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 147732SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 157732SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 167732SAli.Saidi@ARM.com * this software without specific prior written permission. 177732SAli.Saidi@ARM.com * 187732SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197732SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207732SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217732SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227732SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237732SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247732SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257732SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267732SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277732SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287732SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 297732SAli.Saidi@ARM.com * 307732SAli.Saidi@ARM.com * Authors: Ali Saidi 317732SAli.Saidi@ARM.com * Stephen Hines 327732SAli.Saidi@ARM.com * Timothy M. Jones 337732SAli.Saidi@ARM.com */ 347732SAli.Saidi@ARM.com 357732SAli.Saidi@ARM.com#ifndef __ARCH_RISCV_STACKTRACE_HH__ 367732SAli.Saidi@ARM.com#define __ARCH_RISCV_STACKTRACE_HH__ 377732SAli.Saidi@ARM.com 387732SAli.Saidi@ARM.com#include "base/trace.hh" 397732SAli.Saidi@ARM.com#include "cpu/static_inst.hh" 407732SAli.Saidi@ARM.com#include "debug/Stack.hh" 417732SAli.Saidi@ARM.com 428204SAli.Saidi@ARM.comclass ThreadContext; 438204SAli.Saidi@ARM.comclass StackTrace; 448204SAli.Saidi@ARM.com 458204SAli.Saidi@ARM.comnamespace RiscvISA 468204SAli.Saidi@ARM.com{ 478204SAli.Saidi@ARM.com 488204SAli.Saidi@ARM.comclass ProcessInfo 498204SAli.Saidi@ARM.com{ 508204SAli.Saidi@ARM.com public: 518204SAli.Saidi@ARM.com ProcessInfo(ThreadContext *_tc); 528204SAli.Saidi@ARM.com 538204SAli.Saidi@ARM.com Addr task(Addr ksp) const; 548204SAli.Saidi@ARM.com int pid(Addr ksp) const; 557732SAli.Saidi@ARM.com std::string name(Addr ksp) const; 567732SAli.Saidi@ARM.com}; 577732SAli.Saidi@ARM.com 587732SAli.Saidi@ARM.comclass StackTrace 597732SAli.Saidi@ARM.com{ 607732SAli.Saidi@ARM.com protected: 617732SAli.Saidi@ARM.com typedef TheISA::MachInst MachInst; 627732SAli.Saidi@ARM.com private: 637732SAli.Saidi@ARM.com ThreadContext *tc; 647732SAli.Saidi@ARM.com std::vector<Addr> stack; 657732SAli.Saidi@ARM.com 667732SAli.Saidi@ARM.com private: 677732SAli.Saidi@ARM.com bool isEntry(Addr addr); 688204SAli.Saidi@ARM.com bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); 697732SAli.Saidi@ARM.com bool decodeSave(MachInst inst, int ®, int &disp); 707732SAli.Saidi@ARM.com bool decodeStack(MachInst inst, int &disp); 717732SAli.Saidi@ARM.com 727732SAli.Saidi@ARM.com void trace(ThreadContext *tc, bool is_call); 737732SAli.Saidi@ARM.com 747732SAli.Saidi@ARM.com public: 757732SAli.Saidi@ARM.com StackTrace(); 768142SAli.Saidi@ARM.com StackTrace(ThreadContext *tc, const StaticInstPtr &inst); 777732SAli.Saidi@ARM.com ~StackTrace(); 787732SAli.Saidi@ARM.com 798204SAli.Saidi@ARM.com void 807732SAli.Saidi@ARM.com clear() 817732SAli.Saidi@ARM.com { 827732SAli.Saidi@ARM.com tc = 0; 837732SAli.Saidi@ARM.com stack.clear(); 847732SAli.Saidi@ARM.com } 857732SAli.Saidi@ARM.com 867732SAli.Saidi@ARM.com bool 877732SAli.Saidi@ARM.com valid() const 888142SAli.Saidi@ARM.com { 897732SAli.Saidi@ARM.com return tc != nullptr; 907732SAli.Saidi@ARM.com } 918204SAli.Saidi@ARM.com 927732SAli.Saidi@ARM.com bool trace(ThreadContext *tc, const StaticInstPtr &inst); 937732SAli.Saidi@ARM.com 947732SAli.Saidi@ARM.com public: 957732SAli.Saidi@ARM.com const std::vector<Addr> & 967732SAli.Saidi@ARM.com getstack() const 977732SAli.Saidi@ARM.com { 987732SAli.Saidi@ARM.com return stack; 997732SAli.Saidi@ARM.com } 1008142SAli.Saidi@ARM.com 1017732SAli.Saidi@ARM.com static const int user = 1; 1027732SAli.Saidi@ARM.com static const int console = 2; 1038204SAli.Saidi@ARM.com static const int unknown = 3; 1048204SAli.Saidi@ARM.com 1058204SAli.Saidi@ARM.com#if TRACING_ON 1067732SAli.Saidi@ARM.com private: 1077732SAli.Saidi@ARM.com void dump(); 1087732SAli.Saidi@ARM.com 1097732SAli.Saidi@ARM.com public: 1107732SAli.Saidi@ARM.com void 1117732SAli.Saidi@ARM.com dprintf() 1127732SAli.Saidi@ARM.com { 1137732SAli.Saidi@ARM.com if (DTRACE(Stack)) 1147732SAli.Saidi@ARM.com dump(); 1157732SAli.Saidi@ARM.com } 1168204SAli.Saidi@ARM.com#else 1178204SAli.Saidi@ARM.com public: 1188204SAli.Saidi@ARM.com void 1198204SAli.Saidi@ARM.com dprintf() 1208204SAli.Saidi@ARM.com { 1218204SAli.Saidi@ARM.com } 1227732SAli.Saidi@ARM.com#endif 1238204SAli.Saidi@ARM.com}; 1247732SAli.Saidi@ARM.com 1257732SAli.Saidi@ARM.cominline bool 1267732SAli.Saidi@ARM.comStackTrace::trace(ThreadContext *tc, const StaticInstPtr &inst) 1277732SAli.Saidi@ARM.com{ 1287732SAli.Saidi@ARM.com if (!inst->isCall() && !inst->isReturn()) 1297732SAli.Saidi@ARM.com return false; 1308204SAli.Saidi@ARM.com 1318204SAli.Saidi@ARM.com if (valid()) 1328204SAli.Saidi@ARM.com clear(); 1338204SAli.Saidi@ARM.com 1347732SAli.Saidi@ARM.com trace(tc, !inst->isReturn()); 1358204SAli.Saidi@ARM.com return true; 1368204SAli.Saidi@ARM.com} 1378204SAli.Saidi@ARM.com 1387732SAli.Saidi@ARM.com} // namespace RiscvISA 1397732SAli.Saidi@ARM.com 1407732SAli.Saidi@ARM.com#endif // __ARCH_RISCV_STACKTRACE_HH__ 1417732SAli.Saidi@ARM.com