stacktrace.hh revision 5254
12155SN/A/*
22155SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan
32155SN/A * All rights reserved.
42155SN/A *
52155SN/A * Redistribution and use in source and binary forms, with or without
62155SN/A * modification, are permitted provided that the following conditions are
72155SN/A * met: redistributions of source code must retain the above copyright
82155SN/A * notice, this list of conditions and the following disclaimer;
92155SN/A * redistributions in binary form must reproduce the above copyright
102155SN/A * notice, this list of conditions and the following disclaimer in the
112155SN/A * documentation and/or other materials provided with the distribution;
122155SN/A * neither the name of the copyright holders nor the names of its
132155SN/A * contributors may be used to endorse or promote products derived from
142155SN/A * this software without specific prior written permission.
152155SN/A *
162155SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172155SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182155SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192155SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202155SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212155SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222155SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232155SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242155SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252155SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262155SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272155SN/A *
282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi
292665Ssaidi@eecs.umich.edu */
302155SN/A
314202Sbinkertn@umich.edu#ifndef __ARCH_MIPS_STACKTRACE_HH__
322155SN/A#define __ARCH_MIPS_STACKTRACE_HH__
337768SAli.Saidi@ARM.com
347768SAli.Saidi@ARM.com#include "base/trace.hh"
357768SAli.Saidi@ARM.com#include "cpu/static_inst.hh"
362178SN/A
372178SN/Aclass ThreadContext;
382178SN/A
392178SN/Anamespace MipsISA
402178SN/A{
412178SN/A
422178SN/Aclass ProcessInfo
432178SN/A{
442178SN/A  private:
452178SN/A    ThreadContext *tc;
462178SN/A
472155SN/A    int thread_info_size;
485865Sksewell@umich.edu    int task_struct_size;
496181Sksewell@umich.edu    int task_off;
506181Sksewell@umich.edu    int pid_off;
515865Sksewell@umich.edu    int name_off;
523918Ssaidi@eecs.umich.edu
535865Sksewell@umich.edu  public:
542623SN/A    ProcessInfo(ThreadContext *_tc);
553918Ssaidi@eecs.umich.edu
562155SN/A    Addr task(Addr ksp) const;
572155SN/A    int pid(Addr ksp) const;
582292SN/A    std::string name(Addr ksp) const;
596181Sksewell@umich.edu};
606181Sksewell@umich.edu
613918Ssaidi@eecs.umich.educlass StackTrace
622292SN/A{
632292SN/A  protected:
642292SN/A    typedef TheISA::MachInst MachInst;
653918Ssaidi@eecs.umich.edu  private:
662292SN/A    ThreadContext *tc;
672292SN/A    std::vector<Addr> stack;
682766Sktlim@umich.edu
692766Sktlim@umich.edu  private:
702766Sktlim@umich.edu    bool isEntry(Addr addr);
712921Sktlim@umich.edu    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
722921Sktlim@umich.edu    bool decodeSave(MachInst inst, int &reg, int &disp);
732766Sktlim@umich.edu    bool decodeStack(MachInst inst, int &disp);
742766Sktlim@umich.edu
755529Snate@binkert.org    void trace(ThreadContext *tc, bool is_call);
762766Sktlim@umich.edu
774762Snate@binkert.org  public:
782155SN/A    StackTrace();
792155SN/A    StackTrace(ThreadContext *tc, StaticInstPtr inst);
802155SN/A    ~StackTrace();
812155SN/A
822155SN/A    void clear()
832155SN/A    {
842766Sktlim@umich.edu        tc = 0;
852155SN/A        stack.clear();
865865Sksewell@umich.edu    }
872155SN/A
882155SN/A    bool valid() const { return tc != NULL; }
892155SN/A    bool trace(ThreadContext *tc, StaticInstPtr inst);
902155SN/A
912178SN/A  public:
922178SN/A    const std::vector<Addr> &getstack() const { return stack; }
937756SAli.Saidi@ARM.com
942766Sktlim@umich.edu    static const int user = 1;
952178SN/A    static const int console = 2;
962178SN/A    static const int unknown = 3;
976994Snate@binkert.org
982178SN/A#if TRACING_ON
992766Sktlim@umich.edu  private:
1002766Sktlim@umich.edu    void dump();
1012766Sktlim@umich.edu
1022788Sktlim@umich.edu  public:
1032178SN/A    void dprintf() { if (DTRACE(Stack)) dump(); }
1042733Sktlim@umich.edu#else
1052733Sktlim@umich.edu  public:
1062817Sksewell@umich.edu    void dprintf() {}
1072733Sktlim@umich.edu#endif
1084486Sbinkertn@umich.edu};
1094486Sbinkertn@umich.edu
1104776Sgblack@eecs.umich.eduinline bool
1114776Sgblack@eecs.umich.eduStackTrace::trace(ThreadContext *tc, StaticInstPtr inst)
1128739Sgblack@eecs.umich.edu{
1136365Sgblack@eecs.umich.edu    if (!inst->isCall() && !inst->isReturn())
1144486Sbinkertn@umich.edu        return false;
1154202Sbinkertn@umich.edu
1164202Sbinkertn@umich.edu    if (valid())
1174202Sbinkertn@umich.edu        clear();
1188541Sgblack@eecs.umich.edu
1194202Sbinkertn@umich.edu    trace(tc, !inst->isReturn());
1204202Sbinkertn@umich.edu    return true;
1214776Sgblack@eecs.umich.edu}
1228739Sgblack@eecs.umich.edu
1236365Sgblack@eecs.umich.edu}
1244202Sbinkertn@umich.edu
1254202Sbinkertn@umich.edu#endif // __ARCH_MIPS_STACKTRACE_HH__
1264202Sbinkertn@umich.edu