stacktrace.hh revision 2665:a124942bacb8
13536Sgblack@eecs.umich.edu/*
23536Sgblack@eecs.umich.edu * Copyright (c) 2005 The Regents of The University of Michigan
33536Sgblack@eecs.umich.edu * All rights reserved.
43536Sgblack@eecs.umich.edu *
53536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
63536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
73536Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
83536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
93536Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
103536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
113536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
123536Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
133536Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
143536Sgblack@eecs.umich.edu * this software without specific prior written permission.
153536Sgblack@eecs.umich.edu *
163536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173536Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183536Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193536Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203536Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213536Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223536Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233536Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243536Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253536Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263536Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273536Sgblack@eecs.umich.edu *
283536Sgblack@eecs.umich.edu * Authors: Nathan Binkert
293536Sgblack@eecs.umich.edu */
303536Sgblack@eecs.umich.edu
313536Sgblack@eecs.umich.edu#ifndef __ARCH_ALPHA_STACKTRACE_HH__
328332Snate@binkert.org#define __ARCH_ALPHA_STACKTRACE_HH__
338332Snate@binkert.org
343536Sgblack@eecs.umich.edu#include "base/trace.hh"
353536Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
363536Sgblack@eecs.umich.edu
373536Sgblack@eecs.umich.educlass ExecContext;
383536Sgblack@eecs.umich.educlass StackTrace;
393536Sgblack@eecs.umich.edu
403536Sgblack@eecs.umich.educlass ProcessInfo
415543Ssaidi@eecs.umich.edu{
425543Ssaidi@eecs.umich.edu  private:
433536Sgblack@eecs.umich.edu    ExecContext *xc;
443536Sgblack@eecs.umich.edu
453536Sgblack@eecs.umich.edu    int thread_info_size;
463536Sgblack@eecs.umich.edu    int task_struct_size;
473536Sgblack@eecs.umich.edu    int task_off;
483536Sgblack@eecs.umich.edu    int pid_off;
493536Sgblack@eecs.umich.edu    int name_off;
503536Sgblack@eecs.umich.edu
513536Sgblack@eecs.umich.edu  public:
523536Sgblack@eecs.umich.edu    ProcessInfo(ExecContext *_xc);
533536Sgblack@eecs.umich.edu
545543Ssaidi@eecs.umich.edu    Addr task(Addr ksp) const;
555543Ssaidi@eecs.umich.edu    int pid(Addr ksp) const;
563536Sgblack@eecs.umich.edu    std::string name(Addr ksp) const;
573536Sgblack@eecs.umich.edu};
583536Sgblack@eecs.umich.edu
593536Sgblack@eecs.umich.educlass StackTrace
603536Sgblack@eecs.umich.edu{
613536Sgblack@eecs.umich.edu  protected:
623536Sgblack@eecs.umich.edu    typedef TheISA::MachInst MachInst;
633536Sgblack@eecs.umich.edu  private:
643536Sgblack@eecs.umich.edu    ExecContext *xc;
653536Sgblack@eecs.umich.edu    std::vector<Addr> stack;
663536Sgblack@eecs.umich.edu
673536Sgblack@eecs.umich.edu  private:
683536Sgblack@eecs.umich.edu    bool isEntry(Addr addr);
693536Sgblack@eecs.umich.edu    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
703536Sgblack@eecs.umich.edu    bool decodeSave(MachInst inst, int &reg, int &disp);
713536Sgblack@eecs.umich.edu    bool decodeStack(MachInst inst, int &disp);
725543Ssaidi@eecs.umich.edu
733536Sgblack@eecs.umich.edu    void trace(ExecContext *xc, bool is_call);
743536Sgblack@eecs.umich.edu
753536Sgblack@eecs.umich.edu  public:
763536Sgblack@eecs.umich.edu    StackTrace();
773536Sgblack@eecs.umich.edu    StackTrace(ExecContext *xc, StaticInstPtr inst);
783536Sgblack@eecs.umich.edu    ~StackTrace();
793536Sgblack@eecs.umich.edu
803536Sgblack@eecs.umich.edu    void clear()
813536Sgblack@eecs.umich.edu    {
823536Sgblack@eecs.umich.edu        xc = 0;
833536Sgblack@eecs.umich.edu        stack.clear();
843536Sgblack@eecs.umich.edu    }
853536Sgblack@eecs.umich.edu
863536Sgblack@eecs.umich.edu    bool valid() const { return xc != NULL; }
873536Sgblack@eecs.umich.edu    bool trace(ExecContext *xc, StaticInstPtr inst);
883536Sgblack@eecs.umich.edu
893536Sgblack@eecs.umich.edu  public:
903536Sgblack@eecs.umich.edu    const std::vector<Addr> &getstack() const { return stack; }
913536Sgblack@eecs.umich.edu
925543Ssaidi@eecs.umich.edu    static const int user = 1;
935543Ssaidi@eecs.umich.edu    static const int console = 2;
943536Sgblack@eecs.umich.edu    static const int unknown = 3;
953536Sgblack@eecs.umich.edu
963536Sgblack@eecs.umich.edu#if TRACING_ON
973536Sgblack@eecs.umich.edu  private:
983536Sgblack@eecs.umich.edu    void dump();
993536Sgblack@eecs.umich.edu
1003536Sgblack@eecs.umich.edu  public:
1013536Sgblack@eecs.umich.edu    void dprintf() { if (DTRACE(Stack)) dump(); }
1023536Sgblack@eecs.umich.edu#else
1033536Sgblack@eecs.umich.edu  public:
1043536Sgblack@eecs.umich.edu    void dprintf() {}
1053536Sgblack@eecs.umich.edu#endif
1063536Sgblack@eecs.umich.edu};
1073536Sgblack@eecs.umich.edu
1083536Sgblack@eecs.umich.eduinline bool
1093536Sgblack@eecs.umich.eduStackTrace::trace(ExecContext *xc, StaticInstPtr inst)
1103536Sgblack@eecs.umich.edu{
1113536Sgblack@eecs.umich.edu    if (!inst->isCall() && !inst->isReturn())
1123536Sgblack@eecs.umich.edu        return false;
1133536Sgblack@eecs.umich.edu
1143536Sgblack@eecs.umich.edu    if (valid())
1153536Sgblack@eecs.umich.edu        clear();
1163536Sgblack@eecs.umich.edu
1173536Sgblack@eecs.umich.edu    trace(xc, !inst->isReturn());
1183536Sgblack@eecs.umich.edu    return true;
1193536Sgblack@eecs.umich.edu}
1208229Snate@binkert.org
1213536Sgblack@eecs.umich.edu#endif // __ARCH_ALPHA_STACKTRACE_HH__
1223536Sgblack@eecs.umich.edu