* Authors: Nathan Binkert
*/
+#include "arch/arm/stacktrace.hh"
+
#include <string>
#include "arch/arm/isa_traits.hh"
-#include "arch/arm/stacktrace.hh"
#include "arch/arm/vtophys.hh"
#include "base/bitfield.hh"
#include "base/trace.hh"
#include "mem/fs_translating_port_proxy.hh"
#include "sim/system.hh"
-using namespace std;
namespace ArmISA
{
- ProcessInfo::ProcessInfo(ThreadContext *_tc)
- : tc(_tc)
- {
- Addr addr = 0;
- FSTranslatingPortProxy* vp;
+static int32_t
+readSymbol(ThreadContext *tc, const std::string name)
+{
+ PortProxy &vp = tc->getVirtProxy();
+ SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
- vp = tc->getVirtProxy();
+ Addr addr;
+ if (!symtab->findAddress(name, addr))
+ panic("thread info not compiled into kernel\n");
- if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
- panic("thread info not compiled into kernel\n");
- thread_info_size = vp->readGtoH<int32_t>(addr);
+ return vp.read<int32_t>(addr, GuestByteOrder);
+}
- if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
- panic("thread info not compiled into kernel\n");
- task_struct_size = vp->readGtoH<int32_t>(addr);
+ProcessInfo::ProcessInfo(ThreadContext *_tc) : tc(_tc)
+{
+ thread_info_size = readSymbol(tc, "thread_info_size");
+ task_struct_size = readSymbol(tc, "task_struct_size");
+ task_off = readSymbol(tc, "thread_info_task");
+ pid_off = readSymbol(tc, "task_struct_pid");
+ name_off = readSymbol(tc, "task_struct_comm");
+}
- if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
- panic("thread info not compiled into kernel\n");
- task_off = vp->readGtoH<int32_t>(addr);
+Addr
+ProcessInfo::task(Addr ksp) const
+{
+ Addr base = ksp & ~0x1fff;
+ if (base == ULL(0xffffffffc0000000))
+ return 0;
- if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
- panic("thread info not compiled into kernel\n");
- pid_off = vp->readGtoH<int32_t>(addr);
+ Addr tsk;
- if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
- panic("thread info not compiled into kernel\n");
- name_off = vp->readGtoH<int32_t>(addr);
- }
+ PortProxy &vp = tc->getVirtProxy();
+ tsk = vp.read<Addr>(base + task_off, GuestByteOrder);
- Addr
- ProcessInfo::task(Addr ksp) const
- {
- return 0;
- }
+ return tsk;
+}
- int
- ProcessInfo::pid(Addr ksp) const
- {
+int
+ProcessInfo::pid(Addr ksp) const
+{
+ Addr task = this->task(ksp);
+ if (!task)
return -1;
- }
-
- string
- ProcessInfo::name(Addr ksp) const
- {
- return "Implement me";
- }
-
- StackTrace::StackTrace()
- : tc(0), stack(64)
- {
- }
-
- StackTrace::StackTrace(ThreadContext *_tc, StaticInstPtr inst)
- : tc(0), stack(64)
- {
- trace(_tc, inst);
- }
-
- StackTrace::~StackTrace()
- {
- }
-
- void
- StackTrace::trace(ThreadContext *_tc, bool is_call)
- {
- }
-
- bool
- StackTrace::isEntry(Addr addr)
- {
- return false;
- }
-
- bool
- StackTrace::decodeStack(MachInst inst, int &disp)
- {
- return false;
- }
-
- bool
- StackTrace::decodeSave(MachInst inst, int ®, int &disp)
- {
- return false;
- }
-
- /*
- * Decode the function prologue for the function we're in, and note
- * which registers are stored where, and how large the stack frame is.
- */
- bool
- StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func,
- int &size, Addr &ra)
- {
- return false;
- }
+
+ uint16_t pd;
+
+ PortProxy &vp = tc->getVirtProxy();
+ pd = vp.read<uint16_t>(task + pid_off, GuestByteOrder);
+
+ return pd;
+}
+
+std::string
+ProcessInfo::name(Addr ksp) const
+{
+ Addr task = this->task(ksp);
+ if (!task)
+ return "unknown";
+
+ char comm[256];
+ tc->getVirtProxy().readString(comm, task + name_off, sizeof(comm));
+ if (!comm[0])
+ return "startup";
+
+ return comm;
+}
+
+StackTrace::StackTrace()
+ : tc(0), stack(64)
+{
+}
+
+StackTrace::StackTrace(ThreadContext *_tc, const StaticInstPtr &inst)
+ : tc(0), stack(64)
+{
+ trace(_tc, inst);
+}
+
+StackTrace::~StackTrace()
+{
+}
+
+void
+StackTrace::trace(ThreadContext *_tc, bool is_call)
+{
+}
+
+bool
+StackTrace::isEntry(Addr addr)
+{
+ return false;
+}
+
+bool
+StackTrace::decodeStack(MachInst inst, int &disp)
+{
+ return false;
+}
+
+bool
+StackTrace::decodeSave(MachInst inst, int ®, int &disp)
+{
+ return false;
+}
+
+/*
+ * Decode the function prologue for the function we're in, and note
+ * which registers are stored where, and how large the stack frame is.
+ */
+bool
+StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func,
+ int &size, Addr &ra)
+{
+ return false;
+}
#if TRACING_ON
- void
- StackTrace::dump()
- {
- DPRINTFN("------ Stack ------\n");
-
- DPRINTFN(" Not implemented\n");
- }
+void
+StackTrace::dump()
+{
+ DPRINTFN("------ Stack ------\n");
+
+ DPRINTFN(" Not implemented\n");
+}
#endif
}