stacktrace.hh revision 5222:bb733a878f85
1/*
2 * Copyright .AN) 2007 MIPS Technologies, Inc.  All Rights Reserved
3 *
4 * This software is part of the M5 simulator.
5 *
6 * THIS IS A LEGAL AGREEMENT.  BY DOWNLOADING, USING, COPYING, CREATING
7 * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING
8 * TO THESE TERMS AND CONDITIONS.
9 *
10 * Permission is granted to use, copy, create derivative works and
11 * distribute this software and such derivative works for any purpose,
12 * so long as (1) the copyright notice above, this grant of permission,
13 * and the disclaimer below appear in all copies and derivative works
14 * made, (2) the copyright notice above is augmented as appropriate to
15 * reflect the addition of any new copyrightable work in a derivative
16 * work (e.g., Copyright .AN) <Publication Year> Copyright Owner), and (3)
17 * the name of MIPS Technologies, Inc. ($B!H(BMIPS$B!I(B) is not used in any
18 * advertising or publicity pertaining to the use or distribution of
19 * this software without specific, written prior authorization.
20 *
21 * THIS SOFTWARE IS PROVIDED $B!H(BAS IS.$B!I(B  MIPS MAKES NO WARRANTIES AND
22 * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR
23 * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
25 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.
26 * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,
27 * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF
28 * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,
29 * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY
30 * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR
31 * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE
32 * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.
33 *
34 * Authors: Ali G. Saidi
35 *
36 */
37
38#ifndef __ARCH_MIPS_STACKTRACE_HH__
39#define __ARCH_MIPS_STACKTRACE_HH__
40
41#include "base/trace.hh"
42#include "cpu/static_inst.hh"
43
44class ThreadContext;
45
46namespace MipsISA
47{
48
49class ProcessInfo
50{
51  private:
52    ThreadContext *tc;
53
54    int thread_info_size;
55    int task_struct_size;
56    int task_off;
57    int pid_off;
58    int name_off;
59
60  public:
61    ProcessInfo(ThreadContext *_tc);
62
63    Addr task(Addr ksp) const;
64    int pid(Addr ksp) const;
65    std::string name(Addr ksp) const;
66};
67
68class StackTrace
69{
70  protected:
71    typedef TheISA::MachInst MachInst;
72  private:
73    ThreadContext *tc;
74    std::vector<Addr> stack;
75
76  private:
77    bool isEntry(Addr addr);
78    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
79    bool decodeSave(MachInst inst, int &reg, int &disp);
80    bool decodeStack(MachInst inst, int &disp);
81
82    void trace(ThreadContext *tc, bool is_call);
83
84  public:
85    StackTrace();
86    StackTrace(ThreadContext *tc, StaticInstPtr inst);
87    ~StackTrace();
88
89    void clear()
90    {
91        tc = 0;
92        stack.clear();
93    }
94
95    bool valid() const { return tc != NULL; }
96    bool trace(ThreadContext *tc, StaticInstPtr inst);
97
98  public:
99    const std::vector<Addr> &getstack() const { return stack; }
100
101    static const int user = 1;
102    static const int console = 2;
103    static const int unknown = 3;
104
105#if TRACING_ON
106  private:
107    void dump();
108
109  public:
110    void dprintf() { if (DTRACE(Stack)) dump(); }
111#else
112  public:
113    void dprintf() {}
114#endif
115};
116
117inline bool
118StackTrace::trace(ThreadContext *tc, StaticInstPtr inst)
119{
120    if (!inst->isCall() && !inst->isReturn())
121        return false;
122
123    if (valid())
124        clear();
125
126    trace(tc, !inst->isReturn());
127    return true;
128}
129
130}
131
132#endif // __ARCH_MIPS_STACKTRACE_HH__
133