stacktrace.hh revision 8232
12292SN/A/*
22292SN/A * Copyright (c) 2005 The Regents of The University of Michigan
32292SN/A * Copyright (c) 2007-2008 The Florida State University
42292SN/A * Copyright (c) 2009 The University of Edinburgh
52292SN/A * All rights reserved.
62292SN/A *
72292SN/A * Redistribution and use in source and binary forms, with or without
82292SN/A * modification, are permitted provided that the following conditions are
92292SN/A * met: redistributions of source code must retain the above copyright
102292SN/A * notice, this list of conditions and the following disclaimer;
112292SN/A * redistributions in binary form must reproduce the above copyright
122292SN/A * notice, this list of conditions and the following disclaimer in the
132292SN/A * documentation and/or other materials provided with the distribution;
142292SN/A * neither the name of the copyright holders nor the names of its
152292SN/A * contributors may be used to endorse or promote products derived from
162292SN/A * this software without specific prior written permission.
172292SN/A *
182292SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
192292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
202292SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212292SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
222292SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
232292SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
242292SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252292SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262292SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272689Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
282689Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292689Sktlim@umich.edu *
302292SN/A * Authors: Ali Saidi
312292SN/A *          Stephen Hines
323326Sktlim@umich.edu *          Timothy M. Jones
336658Snate@binkert.org */
342733Sktlim@umich.edu
352907Sktlim@umich.edu#ifndef __ARCH_POWER_STACKTRACE_HH__
362292SN/A#define __ARCH_POWER_STACKTRACE_HH__
372292SN/A
382722Sktlim@umich.edu#include "base/trace.hh"
392669Sktlim@umich.edu#include "cpu/static_inst.hh"
402292SN/A#include "debug/Stack.hh"
412790Sktlim@umich.edu
422790Sktlim@umich.educlass ThreadContext;
432790Sktlim@umich.educlass StackTrace;
442790Sktlim@umich.edu
452669Sktlim@umich.edunamespace PowerISA
462678Sktlim@umich.edu{
472678Sktlim@umich.edu
485606Snate@binkert.orgclass ProcessInfo
492292SN/A{
502678Sktlim@umich.edu  private:
512292SN/A    ThreadContext *tc;
522292SN/A
532669Sktlim@umich.edu    int thread_info_size;
542292SN/A    int task_struct_size;
552678Sktlim@umich.edu    int task_off;
562292SN/A    int pid_off;
572678Sktlim@umich.edu    int name_off;
582678Sktlim@umich.edu
592678Sktlim@umich.edu  public:
604319Sktlim@umich.edu    ProcessInfo(ThreadContext *_tc);
614319Sktlim@umich.edu
624319Sktlim@umich.edu    Addr task(Addr ksp) const;
634319Sktlim@umich.edu    int pid(Addr ksp) const;
644319Sktlim@umich.edu    std::string name(Addr ksp) const;
652678Sktlim@umich.edu};
662678Sktlim@umich.edu
672292SN/Aclass StackTrace
682678Sktlim@umich.edu{
692678Sktlim@umich.edu  protected:
705336Shines@cs.fsu.edu    typedef TheISA::MachInst MachInst;
712678Sktlim@umich.edu  private:
724873Sstever@eecs.umich.edu    ThreadContext *tc;
732678Sktlim@umich.edu    std::vector<Addr> stack;
742292SN/A
752678Sktlim@umich.edu  private:
762678Sktlim@umich.edu    bool isEntry(Addr addr);
772678Sktlim@umich.edu    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
782678Sktlim@umich.edu    bool decodeSave(MachInst inst, int &reg, int &disp);
792678Sktlim@umich.edu    bool decodeStack(MachInst inst, int &disp);
802678Sktlim@umich.edu
812678Sktlim@umich.edu    void trace(ThreadContext *tc, bool is_call);
822698Sktlim@umich.edu
832344SN/A  public:
842678Sktlim@umich.edu    StackTrace();
852678Sktlim@umich.edu    StackTrace(ThreadContext *tc, StaticInstPtr inst);
864986Ssaidi@eecs.umich.edu    ~StackTrace();
874986Ssaidi@eecs.umich.edu
882678Sktlim@umich.edu    void
892820Sktlim@umich.edu    clear()
902678Sktlim@umich.edu    {
912678Sktlim@umich.edu        tc = 0;
922678Sktlim@umich.edu        stack.clear();
932678Sktlim@umich.edu    }
942678Sktlim@umich.edu
952678Sktlim@umich.edu    bool
962678Sktlim@umich.edu    valid() const
972678Sktlim@umich.edu    {
982344SN/A        return tc != NULL;
992307SN/A    }
1002678Sktlim@umich.edu
1014032Sktlim@umich.edu    bool trace(ThreadContext *tc, StaticInstPtr inst);
1022678Sktlim@umich.edu
1032292SN/A  public:
1042292SN/A    const std::vector<Addr> &
1052292SN/A    getstack() const
1062292SN/A    {
1072678Sktlim@umich.edu        return stack;
1082678Sktlim@umich.edu    }
1092292SN/A
1102292SN/A    static const int user = 1;
1112292SN/A    static const int console = 2;
1122292SN/A    static const int unknown = 3;
1132292SN/A
1142292SN/A#if TRACING_ON
1155529Snate@binkert.org  private:
1165529Snate@binkert.org    void dump();
1175529Snate@binkert.org
1182292SN/A  public:
1194329Sktlim@umich.edu    void
1204329Sktlim@umich.edu    dprintf()
1214329Sktlim@umich.edu    {
1224329Sktlim@umich.edu        if (DTRACE(Stack))
1232292SN/A            dump();
1242307SN/A    }
1252307SN/A#else
1262907Sktlim@umich.edu  public:
1272907Sktlim@umich.edu    void
1282292SN/A    dprintf()
1292292SN/A    {
1302329SN/A    }
1312329SN/A#endif
1322329SN/A};
1332292SN/A
1342292SN/Ainline bool
1352292SN/AStackTrace::trace(ThreadContext *tc, StaticInstPtr inst)
1362292SN/A{
1372292SN/A    if (!inst->isCall() && !inst->isReturn())
1382292SN/A        return false;
1392292SN/A
1402292SN/A    if (valid())
1412292SN/A        clear();
1422292SN/A
1432292SN/A    trace(tc, !inst->isReturn());
1443492Sktlim@umich.edu    return true;
1452329SN/A}
1462292SN/A
1472292SN/A} // namespace PowerISA
1482292SN/A
1492292SN/A#endif // __ARCH_POWER_STACKTRACE_HH__
1502292SN/A