arm: Call pseudoInst directly from the mmapped IPR handlers.
[gem5.git] / src / arch / arm / stacktrace.cc
index 69d0f354cbddd95b7b1bf71dd04a7af8cba61b97..8fadb81c347a116b7325936e197135820bf986ae 100644 (file)
  * 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 &reg, 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 &reg, 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
 }