stacktrace.hh revision 3580
114209Sandreas.sandberg@arm.com/*
211878Sandreas.sandberg@arm.com * Copyright (c) 2005 The Regents of The University of Michigan
311878Sandreas.sandberg@arm.com * All rights reserved.
411878Sandreas.sandberg@arm.com *
511878Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
611878Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
711878Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
811878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
911878Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1011878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1111878Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1211878Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
134126SN/A * contributors may be used to endorse or promote products derived from
148295Snate@binkert.org * this software without specific prior written permission.
154126SN/A *
164126SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174126SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184126SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194126SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204126SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214126SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224126SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234126SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244126SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254126SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264126SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274126SN/A *
284126SN/A * Authors: Ali Saidi
294126SN/A */
304126SN/A
314126SN/A#ifndef __ARCH_MIPS_STACKTRACE_HH__
324126SN/A#define __ARCH_MIPS_STACKTRACE_HH__
334126SN/A
344126SN/A#include "base/trace.hh"
354126SN/A#include "cpu/static_inst.hh"
364126SN/A
374126SN/Aclass ThreadContext;
384126SN/Aclass StackTrace;
394126SN/A
404126SN/Anamespace MipsISA
4111878Sandreas.sandberg@arm.com{
424126SN/A
4314213Sandreas.sandberg@arm.comclass ProcessInfo
4414213Sandreas.sandberg@arm.com{
4514213Sandreas.sandberg@arm.com  private:
468296Snate@binkert.org    ThreadContext *tc;
478296Snate@binkert.org
4811802Sandreas.sandberg@arm.com    int thread_info_size;
498295Snate@binkert.org    int task_struct_size;
508296Snate@binkert.org    int task_off;
514126SN/A    int pid_off;
5211766Sandreas.sandberg@arm.com    int name_off;
5311802Sandreas.sandberg@arm.com
5411802Sandreas.sandberg@arm.com  public:
5511766Sandreas.sandberg@arm.com    ProcessInfo(ThreadContext *_tc);
568296Snate@binkert.org
5711878Sandreas.sandberg@arm.com    Addr task(Addr ksp) const;
5814213Sandreas.sandberg@arm.com    int pid(Addr ksp) const;
5914213Sandreas.sandberg@arm.com    std::string name(Addr ksp) const;
6014213Sandreas.sandberg@arm.com};
6114213Sandreas.sandberg@arm.com
6214213Sandreas.sandberg@arm.comclass StackTrace
6314213Sandreas.sandberg@arm.com{
6414213Sandreas.sandberg@arm.com  protected:
6514213Sandreas.sandberg@arm.com    typedef TheISA::MachInst MachInst;
6614213Sandreas.sandberg@arm.com  private:
6711878Sandreas.sandberg@arm.com    ThreadContext *tc;
6811878Sandreas.sandberg@arm.com    std::vector<Addr> stack;
6911878Sandreas.sandberg@arm.com
7011878Sandreas.sandberg@arm.com  private:
7111878Sandreas.sandberg@arm.com    bool isEntry(Addr addr);
7211878Sandreas.sandberg@arm.com    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
7311878Sandreas.sandberg@arm.com    bool decodeSave(MachInst inst, int &reg, int &disp);
7411878Sandreas.sandberg@arm.com    bool decodeStack(MachInst inst, int &disp);
7514213Sandreas.sandberg@arm.com
7614213Sandreas.sandberg@arm.com    void trace(ThreadContext *tc, bool is_call);
7714213Sandreas.sandberg@arm.com
7814213Sandreas.sandberg@arm.com  public:
7914213Sandreas.sandberg@arm.com    StackTrace();
8014213Sandreas.sandberg@arm.com    StackTrace(ThreadContext *tc, StaticInstPtr inst);
8114213Sandreas.sandberg@arm.com    ~StackTrace();
8211878Sandreas.sandberg@arm.com
8311878Sandreas.sandberg@arm.com    void clear()
8411878Sandreas.sandberg@arm.com    {
8511878Sandreas.sandberg@arm.com        tc = 0;
8611878Sandreas.sandberg@arm.com        stack.clear();
8711878Sandreas.sandberg@arm.com    }
8811878Sandreas.sandberg@arm.com
8911878Sandreas.sandberg@arm.com    bool valid() const { return tc != NULL; }
9014213Sandreas.sandberg@arm.com    bool trace(ThreadContext *tc, StaticInstPtr inst);
9114213Sandreas.sandberg@arm.com
9214213Sandreas.sandberg@arm.com  public:
9314213Sandreas.sandberg@arm.com    const std::vector<Addr> &getstack() const { return stack; }
9414213Sandreas.sandberg@arm.com
9514213Sandreas.sandberg@arm.com    static const int user = 1;
9614213Sandreas.sandberg@arm.com    static const int console = 2;
9714213Sandreas.sandberg@arm.com    static const int unknown = 3;
9814213Sandreas.sandberg@arm.com
9911878Sandreas.sandberg@arm.com#if TRACING_ON
10014213Sandreas.sandberg@arm.com  private:
10111878Sandreas.sandberg@arm.com    void dump();
10214213Sandreas.sandberg@arm.com
10314213Sandreas.sandberg@arm.com  public:
10414213Sandreas.sandberg@arm.com    void dprintf() { if (DTRACE(Stack)) dump(); }
10514213Sandreas.sandberg@arm.com#else
10614213Sandreas.sandberg@arm.com  public:
10714213Sandreas.sandberg@arm.com    void dprintf() {}
10814213Sandreas.sandberg@arm.com#endif
10914213Sandreas.sandberg@arm.com};
11014213Sandreas.sandberg@arm.com
11114213Sandreas.sandberg@arm.cominline bool
11214213Sandreas.sandberg@arm.comStackTrace::trace(ThreadContext *tc, StaticInstPtr inst)
11314213Sandreas.sandberg@arm.com{
11414213Sandreas.sandberg@arm.com    if (!inst->isCall() && !inst->isReturn())
11514213Sandreas.sandberg@arm.com        return false;
11614213Sandreas.sandberg@arm.com
11714213Sandreas.sandberg@arm.com    if (valid())
11814213Sandreas.sandberg@arm.com        clear();
11911878Sandreas.sandberg@arm.com
12014213Sandreas.sandberg@arm.com    trace(tc, !inst->isReturn());
12111878Sandreas.sandberg@arm.com    return true;
12214213Sandreas.sandberg@arm.com}
12314213Sandreas.sandberg@arm.com
12414213Sandreas.sandberg@arm.com}
12514213Sandreas.sandberg@arm.com
12611878Sandreas.sandberg@arm.com#endif // __ARCH_MIPS_STACKTRACE_HH__
12714213Sandreas.sandberg@arm.com