diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-03-05 14:52:28 +0000 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-03-05 14:52:28 +0000 |
commit | 43b8f51bb8d556b505f5916256d777ecd145ce30 (patch) | |
tree | 5b37d72c556a64923c3c1b13e109108d23de212e /src/arch/x86/stacktrace.hh | |
parent | 2e6cf12963dcd8f3fd0d551aa7d9871ede6bc1fb (diff) | |
download | gem5-43b8f51bb8d556b505f5916256d777ecd145ce30.tar.xz |
Filled in a stub header file for a stacktrace object. I'm still not sure what this is for, and it probably doesn't work on anything but Alpha.
--HG--
extra : convert_revision : 9bc3833628d31799a7b578c450dac096a19aead3
Diffstat (limited to 'src/arch/x86/stacktrace.hh')
-rw-r--r-- | src/arch/x86/stacktrace.hh | 86 |
1 files changed, 84 insertions, 2 deletions
diff --git a/src/arch/x86/stacktrace.hh b/src/arch/x86/stacktrace.hh index 4e2e351b2..854fb397c 100644 --- a/src/arch/x86/stacktrace.hh +++ b/src/arch/x86/stacktrace.hh @@ -31,10 +31,92 @@ #ifndef __ARCH_X86_STACKTRACE_HH__ #define __ARCH_X86_STACKTRACE_HH__ -#error X86 is not yet supported! +#include "base/trace.hh" +#include "cpu/static_inst.hh" +class ThreadContext; namespace X86ISA { -}; + class StackTrace; + + class ProcessInfo + { + private: + ThreadContext *tc; + + int thread_info_size; + int task_struct_size; + int task_off; + int pid_off; + int name_off; + + public: + ProcessInfo(ThreadContext *_tc); + + Addr task(Addr ksp) const; + int pid(Addr ksp) const; + std::string name(Addr ksp) const; + }; + + class StackTrace + { + private: + ThreadContext *tc; + std::vector<Addr> stack; + + private: + bool isEntry(Addr addr); + bool decodePrologue(Addr sp, Addr callpc, Addr func, int &size, Addr &ra); + bool decodeSave(MachInst inst, int ®, int &disp); + bool decodeStack(MachInst inst, int &disp); + + void trace(ThreadContext *tc, bool is_call); + + public: + StackTrace(); + StackTrace(ThreadContext *tc, StaticInstPtr inst); + ~StackTrace(); + + void clear() + { + tc = 0; + stack.clear(); + } + + bool valid() const { return tc != NULL; } + bool trace(ThreadContext *tc, StaticInstPtr inst); + + public: + const std::vector<Addr> &getstack() const { return stack; } + + static const int user = 1; + static const int console = 2; + static const int unknown = 3; + +#if TRACING_ON + private: + void dump(); + + public: + void dprintf() { if (DTRACE(Stack)) dump(); } +#else + public: + void dprintf() {} +#endif + }; + + inline bool + StackTrace::trace(ThreadContext *tc, StaticInstPtr inst) + { + if (!inst->isCall() && !inst->isReturn()) + return false; + + if (valid()) + clear(); + + trace(tc, !inst->isReturn()); + return true; + } +} #endif // __ARCH_X86_STACKTRACE_HH__ |