stacktrace.hh revision 8232
15086Sgblack@eecs.umich.edu/*
25086Sgblack@eecs.umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
35086Sgblack@eecs.umich.edu * All rights reserved.
45086Sgblack@eecs.umich.edu *
55086Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65086Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75086Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95086Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115086Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125086Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145086Sgblack@eecs.umich.edu * this software without specific prior written permission.
155086Sgblack@eecs.umich.edu *
165086Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175086Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185086Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195086Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205086Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215086Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235086Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275086Sgblack@eecs.umich.edu *
285086Sgblack@eecs.umich.edu * Authors: Ali Saidi
295086Sgblack@eecs.umich.edu */
305086Sgblack@eecs.umich.edu
315086Sgblack@eecs.umich.edu#ifndef __ARCH_MIPS_STACKTRACE_HH__
325086Sgblack@eecs.umich.edu#define __ARCH_MIPS_STACKTRACE_HH__
335086Sgblack@eecs.umich.edu
345086Sgblack@eecs.umich.edu#include "base/trace.hh"
355086Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
365086Sgblack@eecs.umich.edu#include "debug/Stack.hh"
375086Sgblack@eecs.umich.edu
385086Sgblack@eecs.umich.educlass ThreadContext;
395086Sgblack@eecs.umich.edu
405086Sgblack@eecs.umich.edunamespace MipsISA
415086Sgblack@eecs.umich.edu{
425086Sgblack@eecs.umich.edu
435086Sgblack@eecs.umich.educlass ProcessInfo
445086Sgblack@eecs.umich.edu{
455086Sgblack@eecs.umich.edu  private:
465086Sgblack@eecs.umich.edu    ThreadContext *tc;
475086Sgblack@eecs.umich.edu
485086Sgblack@eecs.umich.edu    int thread_info_size;
495086Sgblack@eecs.umich.edu    int task_struct_size;
505086Sgblack@eecs.umich.edu    int task_off;
515086Sgblack@eecs.umich.edu    int pid_off;
525086Sgblack@eecs.umich.edu    int name_off;
535086Sgblack@eecs.umich.edu
545086Sgblack@eecs.umich.edu  public:
555086Sgblack@eecs.umich.edu    ProcessInfo(ThreadContext *_tc);
565086Sgblack@eecs.umich.edu
575086Sgblack@eecs.umich.edu    Addr task(Addr ksp) const;
585135Sgblack@eecs.umich.edu    int pid(Addr ksp) const;
595135Sgblack@eecs.umich.edu    std::string name(Addr ksp) const;
605135Sgblack@eecs.umich.edu};
615086Sgblack@eecs.umich.edu
625135Sgblack@eecs.umich.educlass StackTrace
635234Sgblack@eecs.umich.edu{
645086Sgblack@eecs.umich.edu  protected:
655086Sgblack@eecs.umich.edu    typedef MipsISA::MachInst MachInst;
665086Sgblack@eecs.umich.edu  private:
675086Sgblack@eecs.umich.edu    ThreadContext *tc;
685086Sgblack@eecs.umich.edu    std::vector<Addr> stack;
695086Sgblack@eecs.umich.edu
705086Sgblack@eecs.umich.edu  private:
715086Sgblack@eecs.umich.edu    bool isEntry(Addr addr);
725086Sgblack@eecs.umich.edu    bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra);
735086Sgblack@eecs.umich.edu    bool decodeSave(MachInst inst, int &reg, int &disp);
745086Sgblack@eecs.umich.edu    bool decodeStack(MachInst inst, int &disp);
755135Sgblack@eecs.umich.edu
765135Sgblack@eecs.umich.edu    void trace(ThreadContext *tc, bool is_call);
775135Sgblack@eecs.umich.edu
785135Sgblack@eecs.umich.edu  public:
795135Sgblack@eecs.umich.edu    StackTrace();
805135Sgblack@eecs.umich.edu    StackTrace(ThreadContext *tc, StaticInstPtr inst);
815135Sgblack@eecs.umich.edu    ~StackTrace();
825135Sgblack@eecs.umich.edu
835135Sgblack@eecs.umich.edu    void clear()
845135Sgblack@eecs.umich.edu    {
855135Sgblack@eecs.umich.edu        tc = 0;
865135Sgblack@eecs.umich.edu        stack.clear();
875135Sgblack@eecs.umich.edu    }
885135Sgblack@eecs.umich.edu
895135Sgblack@eecs.umich.edu    bool valid() const { return tc != NULL; }
905135Sgblack@eecs.umich.edu    bool trace(ThreadContext *tc, StaticInstPtr inst);
915135Sgblack@eecs.umich.edu
925135Sgblack@eecs.umich.edu  public:
935135Sgblack@eecs.umich.edu    const std::vector<Addr> &getstack() const { return stack; }
945135Sgblack@eecs.umich.edu
955135Sgblack@eecs.umich.edu    static const int user = 1;
965135Sgblack@eecs.umich.edu    static const int console = 2;
975135Sgblack@eecs.umich.edu    static const int unknown = 3;
985135Sgblack@eecs.umich.edu
995135Sgblack@eecs.umich.edu#if TRACING_ON
1005135Sgblack@eecs.umich.edu  private:
1015264Sgblack@eecs.umich.edu    void dump();
1025135Sgblack@eecs.umich.edu
1035135Sgblack@eecs.umich.edu  public:
1045135Sgblack@eecs.umich.edu    void dprintf() { if (DTRACE(Stack)) dump(); }
1055135Sgblack@eecs.umich.edu#else
1065135Sgblack@eecs.umich.edu  public:
1075264Sgblack@eecs.umich.edu    void dprintf() {}
1085135Sgblack@eecs.umich.edu#endif
1095135Sgblack@eecs.umich.edu};
1105135Sgblack@eecs.umich.edu
1115141Sgblack@eecs.umich.eduinline bool
1125141Sgblack@eecs.umich.eduStackTrace::trace(ThreadContext *tc, StaticInstPtr inst)
1135141Sgblack@eecs.umich.edu{
1145141Sgblack@eecs.umich.edu    if (!inst->isCall() && !inst->isReturn())
1155141Sgblack@eecs.umich.edu        return false;
1165141Sgblack@eecs.umich.edu
1175141Sgblack@eecs.umich.edu    if (valid())
1185135Sgblack@eecs.umich.edu        clear();
1195135Sgblack@eecs.umich.edu
1205135Sgblack@eecs.umich.edu    trace(tc, !inst->isReturn());
1215289Sgblack@eecs.umich.edu    return true;
1225135Sgblack@eecs.umich.edu}
1235141Sgblack@eecs.umich.edu
1245135Sgblack@eecs.umich.edu}
1255135Sgblack@eecs.umich.edu
1265141Sgblack@eecs.umich.edu#endif // __ARCH_MIPS_STACKTRACE_HH__
1275141Sgblack@eecs.umich.edu